From 46cb0ae0d523479c41f8615e5796d44409118d07 Mon Sep 17 00:00:00 2001 From: Marc Sturm Date: Tue, 28 Jan 2025 14:13:58 +0100 Subject: [PATCH] GSvar: added 'urgent' flag for processed samples (processed sample tab, sequencing run tab, batch import dialog) --- src/GSvar/ImportDialog.cpp | 4 +- src/GSvar/ProcessedSampleWidget.cpp | 1 + src/GSvar/ProcessedSampleWidget.ui | 72 ++++++++++++++++----------- src/GSvar/SequencingRunWidget.cpp | 7 +-- src/cppNGSD/DBTable.cpp | 4 +- src/cppNGSD/DBTable.h | 2 +- src/cppNGSD/NGSD.cpp | 3 +- src/cppNGSD/NGSD.h | 1 + src/cppNGSD/resources/NGSD_schema.sql | 1 + 9 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/GSvar/ImportDialog.cpp b/src/GSvar/ImportDialog.cpp index 39ce31d9d..d6780a77a 100644 --- a/src/GSvar/ImportDialog.cpp +++ b/src/GSvar/ImportDialog.cpp @@ -62,9 +62,9 @@ void ImportDialog::setupGUI() { setWindowTitle("Import processed samples"); ui_.label->setText("Batch import of processed samples (paste tab-separated data to table)"); - labels << "sample" << "project" << "run name" << "lane" << "mid1 name" << "mid2 name" << "operator" << "processing system" << "processing input [ng]" << "molarity [nM]" << "comment" << "normal processed sample" << "processing modus" << "batch number"; + labels << "sample" << "project" << "run name" << "lane" << "mid1 name" << "mid2 name" << "operator" << "processing system" << "processing input [ng]" << "molarity [nM]" << "comment" << "normal processed sample" << "processing modus" << "batch number" << "urgent"; db_table_ = "processed_sample"; - db_fields_ << "sample_id" << "project_id" << "sequencing_run_id" << "lane" << "mid1_i7" << "mid2_i5" << "operator_id" << "processing_system_id" << "processing_input" << "molarity" << "comment" << "normal_id" << "processing_modus" << "batch_number"; + db_fields_ << "sample_id" << "project_id" << "sequencing_run_id" << "lane" << "mid1_i7" << "mid2_i5" << "operator_id" << "processing_system_id" << "processing_input" << "molarity" << "comment" << "normal_id" << "processing_modus" << "batch_number" << "urgent"; db_extra_fields_ << "process_id"; } else if (type_==MIDS) diff --git a/src/GSvar/ProcessedSampleWidget.cpp b/src/GSvar/ProcessedSampleWidget.cpp index 496705711..70f5d3d3c 100644 --- a/src/GSvar/ProcessedSampleWidget.cpp +++ b/src/GSvar/ProcessedSampleWidget.cpp @@ -196,6 +196,7 @@ void ProcessedSampleWidget::updateGUI() ancestry_details << "SAS (South asian): " + db.getValue("SELECT score_sas FROM processed_sample_ancestry WHERE processed_sample_id="+ps_id_, true).toString(); ancestry_details << "EAS (East asian): " + db.getValue("SELECT score_eas FROM processed_sample_ancestry WHERE processed_sample_id="+ps_id_, true).toString(); ui_->ancestry->setToolTip(ancestry_details.join("\n")); + ui_->urgent->setText(ps_data.urgent ? "yes" : ""); //#### sample details #### QString s_id = db.getValue("SELECT sample_id FROM processed_sample WHERE id='" + ps_id_ + "'").toString(); diff --git a/src/GSvar/ProcessedSampleWidget.ui b/src/GSvar/ProcessedSampleWidget.ui index 1f3111a3a..4194a4019 100644 --- a/src/GSvar/ProcessedSampleWidget.ui +++ b/src/GSvar/ProcessedSampleWidget.ui @@ -438,35 +438,6 @@ - - - - comments: - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - 0 - 0 - - - - - - - true - - - Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse - - - @@ -519,6 +490,49 @@ + + + + + 0 + 0 + + + + + + + true + + + Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse + + + + + + + comments: + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + urgent: + + + + + + + + + + diff --git a/src/GSvar/SequencingRunWidget.cpp b/src/GSvar/SequencingRunWidget.cpp index df3bd1018..b108bc1cd 100644 --- a/src/GSvar/SequencingRunWidget.cpp +++ b/src/GSvar/SequencingRunWidget.cpp @@ -111,15 +111,17 @@ void SequencingRunWidget::updateRunSampleTable() { headers << "sample comments"; } + headers << "urgent"; headers << "resequencing"; NGSD db; - DBTable samples = db.createTable("processed_sample", "SELECT ps.id, ps.lane, ps.quality, CONCAT(s.name,'_',LPAD(ps.process_id,2,'0')), s.name_external, s.tumor, s.ffpe, s.gender, s.sample_type, (SELECT CONCAT(name, ' (', type, ')') FROM project WHERE id=ps.project_id), (SELECT CONCAT(name, ' (', sequence, ')') FROM mid WHERE id=ps.mid1_i7), (SELECT CONCAT(name, ' (', sequence, ')') FROM mid WHERE id=ps.mid2_i5), sp.name, sys.name_manufacturer, sys.type as sys_type, ps.processing_input, ps.molarity, (SELECT name FROM user WHERE id=ps.operator_id), ps.processing_modus, ps.batch_number, ps.comment" + QString(ui_->show_sample_comment->isChecked() ? ", s.comment as sample_comment" : "") + " ,ps.scheduled_for_resequencing "+ + DBTable samples = db.createTable("processed_sample", "SELECT ps.id, ps.lane, ps.quality, CONCAT(s.name,'_',LPAD(ps.process_id,2,'0')), s.name_external, s.tumor, s.ffpe, s.gender, s.sample_type, (SELECT CONCAT(name, ' (', type, ')') FROM project WHERE id=ps.project_id), (SELECT CONCAT(name, ' (', sequence, ')') FROM mid WHERE id=ps.mid1_i7), (SELECT CONCAT(name, ' (', sequence, ')') FROM mid WHERE id=ps.mid2_i5), sp.name, sys.name_manufacturer, sys.type as sys_type, ps.processing_input, ps.molarity, (SELECT name FROM user WHERE id=ps.operator_id), ps.processing_modus, ps.batch_number, ps.comment" + QString(ui_->show_sample_comment->isChecked() ? ", s.comment as sample_comment" : "") + " ,ps.urgent, ps.scheduled_for_resequencing "+ " FROM processed_sample ps, sample s, processing_system sys, species sp WHERE sp.id=s.species_id AND ps.processing_system_id=sys.id AND ps.sample_id=s.id AND ps.sequencing_run_id='" + run_id_ + "' " " ORDER BY ps.lane ASC, "+ (ui_->sort_by_ps_id->isChecked() ? "ps.id" : "ps.processing_system_id ASC, s.name ASC, ps.process_id")); //format columns samples.formatBooleanColumn(samples.columnIndex("tumor")); samples.formatBooleanColumn(samples.columnIndex("ffpe")); - samples.formatBooleanColumn(samples.columnIndex("scheduled_for_resequencing")); + samples.formatBooleanColumn(samples.columnIndex("urgent"), true); + samples.formatBooleanColumn(samples.columnIndex("scheduled_for_resequencing"), true); // determine QC parameter based on sample types QSet sample_types = samples.extractColumn(samples.columnIndex("sample_type")).toSet(); @@ -214,7 +216,6 @@ void SequencingRunWidget::updateRunSampleTable() QStringList quality_values = samples.takeColumn(samples.columnIndex("quality")); ui_->samples->setData(samples); ui_->samples->setQualityIcons("sample", quality_values); - ui_->samples->setColumnWidth(ui_->samples->columnIndex("comments"), 350); //colors QColor orange = QColor(255,150,0,125); diff --git a/src/cppNGSD/DBTable.cpp b/src/cppNGSD/DBTable.cpp index 965924c6e..a2529e1a4 100644 --- a/src/cppNGSD/DBTable.cpp +++ b/src/cppNGSD/DBTable.cpp @@ -176,7 +176,7 @@ bool DBTable::columnIsNumeric(int c) const return true; } -void DBTable::formatBooleanColumn(int c) +void DBTable::formatBooleanColumn(int c, bool empty_if_no) { //init static QString s_yes = "yes"; @@ -197,7 +197,7 @@ void DBTable::formatBooleanColumn(int c) } else if (value=="0") { - rows_[r].setValue(c, s_no); + rows_[r].setValue(c, empty_if_no ? "" : s_no); } else if (!value.isEmpty()) { diff --git a/src/cppNGSD/DBTable.h b/src/cppNGSD/DBTable.h index 9eb25289f..5e051cef1 100644 --- a/src/cppNGSD/DBTable.h +++ b/src/cppNGSD/DBTable.h @@ -116,7 +116,7 @@ class CPPNGSDSHARED_EXPORT DBTable bool columnIsNumeric(int c) const; ///Replace 0/1 in boolean column by yes/no - void formatBooleanColumn(int c); + void formatBooleanColumn(int c, bool empty_if_no = false); ///Removes rows that don't contain the given text. void filterRows(QString text, Qt::CaseSensitivity cs = Qt::CaseInsensitive); diff --git a/src/cppNGSD/NGSD.cpp b/src/cppNGSD/NGSD.cpp index 2bc1f3876..6c359a72f 100644 --- a/src/cppNGSD/NGSD.cpp +++ b/src/cppNGSD/NGSD.cpp @@ -717,7 +717,7 @@ ProcessedSampleData NGSD::getProcessedSampleData(const QString& processed_sample { //execute query SqlQuery query = getQuery(); - query.exec("SELECT CONCAT(s.name,'_',LPAD(ps.process_id,2,'0')) as ps_name, sys.name_manufacturer as sys_name, sys.type as sys_type, ps.quality, ps.comment, p.name as p_name, p.type as p_type, r.name as r_name, ps.normal_id, s.gender, ps.operator_id, ps.processing_input, ps.molarity, ps.processing_modus, ps.batch_number, ps.scheduled_for_resequencing FROM sample s, project p, processing_system sys, processed_sample ps LEFT JOIN sequencing_run r ON ps.sequencing_run_id=r.id WHERE ps.sample_id=s.id AND ps.project_id=p.id AND ps.processing_system_id=sys.id AND ps.id=" + processed_sample_id); + query.exec("SELECT CONCAT(s.name,'_',LPAD(ps.process_id,2,'0')) as ps_name, sys.name_manufacturer as sys_name, sys.type as sys_type, ps.quality, ps.comment, p.name as p_name, p.type as p_type, r.name as r_name, ps.normal_id, s.gender, ps.operator_id, ps.processing_input, ps.molarity, ps.processing_modus, ps.batch_number, ps.scheduled_for_resequencing, ps.urgent FROM sample s, project p, processing_system sys, processed_sample ps LEFT JOIN sequencing_run r ON ps.sequencing_run_id=r.id WHERE ps.sample_id=s.id AND ps.project_id=p.id AND ps.processing_system_id=sys.id AND ps.id=" + processed_sample_id); if (query.size()==0) { THROW(ProgrammingException, "Invalid 'id' for table 'processed_sample' given: '" + processed_sample_id + "'"); @@ -752,6 +752,7 @@ ProcessedSampleData NGSD::getProcessedSampleData(const QString& processed_sample output.molarity = query.value("molarity").toString().trimmed(); output.ancestry = getValue("SELECT `population` FROM `processed_sample_ancestry` WHERE `processed_sample_id`=:0", true, processed_sample_id).toString(); output.scheduled_for_resequencing = query.value("scheduled_for_resequencing").toBool(); + output.urgent = query.value("urgent").toBool(); return output; diff --git a/src/cppNGSD/NGSD.h b/src/cppNGSD/NGSD.h index 991fead32..664f44b95 100644 --- a/src/cppNGSD/NGSD.h +++ b/src/cppNGSD/NGSD.h @@ -316,6 +316,7 @@ struct CPPNGSDSHARED_EXPORT ProcessedSampleData QString molarity; QString ancestry; bool scheduled_for_resequencing; + bool urgent; }; ///Processing system information. diff --git a/src/cppNGSD/resources/NGSD_schema.sql b/src/cppNGSD/resources/NGSD_schema.sql index 454ff7672..f2b58a315 100644 --- a/src/cppNGSD/resources/NGSD_schema.sql +++ b/src/cppNGSD/resources/NGSD_schema.sql @@ -573,6 +573,7 @@ CREATE TABLE IF NOT EXISTS `processed_sample` `folder_override` TEXT NULL DEFAULT NULL COMMENT 'Override for sample folder', `folder_override_client` TEXT NULL DEFAULT NULL COMMENT 'Override for sample folder used in GSvar client', `scheduled_for_resequencing` BOOLEAN NOT NULL DEFAULT FALSE, + `urgent` BOOLEAN NOT NULL DEFAULT FALSE, PRIMARY KEY (`id`), UNIQUE INDEX `sample_psid_unique` (`sample_id` ASC, `process_id` ASC), INDEX `fk_processed_sample_samples1` (`sample_id` ASC),