From b4ac7ca85cba1908db228a83b5eb919bd45c3bbd Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Fri, 6 Sep 2024 10:41:30 -0500
Subject: [PATCH 01/32] GMP: REPORTING -- mods for ussue 357 on how to treat
the report, gmp vs non-gmp for a number of scenarios...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 25 +++++++++++++++++---
programs/us_reporter_gmp/us_reporter_gmp.h | 2 ++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index f6ac7df49..fb746a292 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -1028,12 +1028,15 @@ void US_ReporterGMP::check_for_missing_models ( void )
QString US_ReporterGMP::missing_models_msg( void )
{
QString models_str;
+ int num_dropped_triples = 0;
+ int num_total_missed_triples = 0;
QMap < QString, QStringList >::iterator mmm;
for ( mmm = Triple_to_ModelsMissing.begin(); mmm != Triple_to_ModelsMissing.end(); ++mmm )
{
if ( !mmm.value().isEmpty() )
{
+ ++num_total_missed_triples;
//check if missing models because of triple dropped
bool isDropped = false;
QString c_triple = mmm.key();
@@ -1044,12 +1047,13 @@ QString US_ReporterGMP::missing_models_msg( void )
d_triple.replace(".","");
if ( c_triple == d_triple )
{
+ ++num_dropped_triples;
isDropped = true;
break;
}
}
- //compose
+ //compose : Do we want to report on dropped triples at all ?
models_str += mmm.key() + ", missing models: " + mmm.value().join(", ");
if( isDropped )
models_str += " [triple dropped]";
@@ -1057,8 +1061,13 @@ QString US_ReporterGMP::missing_models_msg( void )
models_str += "
";
}
}
-
- if ( !models_str.isEmpty() )
+
+ qDebug() << "Number of total missing triples; Number of dropped triples -- "
+ << num_total_missed_triples << "; " << num_dropped_triples;
+
+ // Do we want to report on dropped triples at all ?
+ // Do ONLY dropped triples trigger report to be non-GMP ?
+ if ( !models_str.isEmpty() & num_total_missed_triples != num_dropped_triples )
GMP_report = false;
return models_str;
@@ -1134,6 +1143,13 @@ void US_ReporterGMP::check_models ( int autoflowID )
QString channel_desc_alt = chndescs_alt[ i ];
QString channel_desc = chndescs[ i ];
+ //check if channel meant to be analyzed/reported
+ int analysis_to_be_run = analysis_runs[ i ];
+ int report_to_be_run = report_runs[ i ];
+
+ if ( analysis_to_be_run == 0 || report_to_be_run == 0 )
+ continue;
+
QList < double > chann_wvls = ch_wvls[ channel_desc_alt ];
int chann_wvl_number = chann_wvls.size();
@@ -1978,6 +1994,9 @@ void US_ReporterGMP::read_protocol_and_reportMasks( void )
chndescs = currAProf.chndescs;
//Channel alt_descriptions
chndescs_alt = currAProf.chndescs_alt;
+ //Channel run/analysis_run
+ analysis_runs = currAProf.analysis_run;
+ report_runs = currAProf.report_run;
//Channel reports
ch_reports = currAProf.ch_reports;
//Channel wavelengths
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.h b/programs/us_reporter_gmp/us_reporter_gmp.h
index c3a5ff905..4d7448b4c 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.h
+++ b/programs/us_reporter_gmp/us_reporter_gmp.h
@@ -78,6 +78,8 @@ class US_ReporterGMP : public US_Widgets
US_AnaProfile::AnaProfPCSA cAPp; //!< PCSA analysis profile
QStringList chndescs; //!< Channel descriptions
QStringList chndescs_alt; //!< Alternative channel descriptions
+ QList analysis_runs; //!< Analysis runs
+ QList report_runs; //!< Report runs
QMap> ch_reports; //!< Channel reports
QMap> ch_reports_internal; //!< Internal channel reports
QMap> ch_wvls; //!< Channel wavelengths
From 4d7c6043510db2cab1236a7b3ec099c81ee5cf10 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Wed, 25 Sep 2024 20:31:16 -0500
Subject: [PATCH 02/32] GMP : FAILED run reinitialization -- create a fresh
'status' record to capture submitter info to be passed to audit trail and
report...
---
.../us_com_project/us_com_project_gui.cpp | 87 ++++++++++++++++++-
programs/us_com_project/us_com_project_gui.h | 1 +
2 files changed, 87 insertions(+), 1 deletion(-)
diff --git a/programs/us_com_project/us_com_project_gui.cpp b/programs/us_com_project/us_com_project_gui.cpp
index 5ea1939d1..d47ea2c2c 100644
--- a/programs/us_com_project/us_com_project_gui.cpp
+++ b/programs/us_com_project/us_com_project_gui.cpp
@@ -1745,7 +1745,8 @@ void US_InitDialogueGui::initRecordsDialogue( void )
+ tr("
")
+ tr("Reason: ") + failed_details[ "failedMsg" ] );
- msgBox_f.setInformativeText( tr("ATTENTION: If you choose to Procceed, all existing data for this run will be deleted from DB, ")
+ msgBox_f.setInformativeText( tr("ATTENTION: If you choose to Procceed, ")
+ + tr("all existing data for this run will be deleted from DB, ")
+ tr("and the processing flow will reinitialize. ")
+ tr("
This action is not reversible. Proceed?"));
@@ -1786,6 +1787,9 @@ void US_InitDialogueGui::initRecordsDialogue( void )
do_run_tables_cleanup( protocol_details );
do_run_data_cleanup( protocol_details );
+
+ //Create fresh autoflowStatus record with the submitter person info & timestamp:
+ do_create_autoflowStatus_for_failedRun( protocol_details );
//Switch to 2. LIVE_UPDATE:
emit switch_to_live_update_init( protocol_details );
@@ -1986,6 +1990,87 @@ void US_InitDialogueGui::do_run_tables_cleanup( QMap < QString, QString > run_de
}
+//Create fresh autofowStatus record: failed run re-init
+void US_InitDialogueGui::do_create_autoflowStatus_for_failedRun( QMap < QString, QString > run_details )
+{
+ // Check DB connection
+ US_Passwd pw;
+ QString masterpw = pw.getPasswd();
+ US_DB2* db = new US_DB2( masterpw );
+
+ if ( db->lastErrno() != US_DB2::OK )
+ {
+ QMessageBox::warning( this, tr( "Connection Problem: Failed Run Cleanup" ),
+ tr( "Read protocol: Could not connect to database \n" ) + db->lastError() );
+ return;
+ }
+
+ QStringList qry;
+
+ //first, get current user (submitter) info
+ qry.clear();
+ qry << QString( "get_user_info" );
+ db -> query( qry );
+ db -> next();
+ int u_ID = db->value( 0 ).toInt();
+ QString u_fname = db->value( 1 ).toString();
+ QString u_lname = db->value( 2 ).toString();
+ QString u_email = db->value( 4 ).toString();
+ int u_level = db->value( 5 ).toInt();
+
+ //autoflowStatus record
+ QString createGMPRun_Json;
+ createGMPRun_Json. clear();
+ createGMPRun_Json += "{ \"Person\": ";
+
+ createGMPRun_Json += "[{";
+ createGMPRun_Json += "\"ID\":\"" + QString::number( u_ID ) + "\",";
+ createGMPRun_Json += "\"fname\":\"" + u_fname + "\",";
+ createGMPRun_Json += "\"lname\":\"" + u_lname + "\",";
+ createGMPRun_Json += "\"email\":\"" + u_email + "\",";
+ createGMPRun_Json += "\"level\":\"" + QString::number( u_level ) + "\"";
+ createGMPRun_Json += "}],";
+
+ //createGMPRun_Json += "\"Comment\": \"" + gmp_submitter_map[ "Comment:" ] + "\"";
+ QString resubComm = tr("Resubmitting Failed GMP Run");
+ createGMPRun_Json += "\"Comment\": \"" + resubComm + "\"";
+
+ createGMPRun_Json += "}";
+
+ qry. clear();
+ qry << "new_autoflowStatusGMPCreate_record"
+ << run_details[ "autoflowID" ]
+ << createGMPRun_Json;
+
+ qDebug() << "[FAILED run init]: new_autoflowStatusGMPCreate_record qry -- " << qry;
+
+ int autoflowStatusID = db->functionQuery( qry );
+
+ if ( !autoflowStatusID )
+ {
+ QMessageBox::warning( this, tr( "AutoflowStatus Record Problem" ),
+ tr( "autoflowStatus (FAILED GMP run re-INIT): "
+ "There was a problem with creating a record in autoflowStatus table \n" ) + db->lastError() );
+
+ return;
+ }
+ qDebug() << "in do_create_autoflowStatus_for_failedRun: createGMPRun_Json -- " << createGMPRun_Json;
+
+ run_details[ "statusID" ] = QString::number( autoflowStatusID );
+
+ /************** finally, update autoflow record with StatusID: ****************/
+ qry. clear();
+ qry << "update_autoflow_with_statusID"
+ << run_details[ "autoflowID" ]
+ << QString::number( autoflowStatusID );
+
+ qDebug() << "[FAILED run init]: update_autoflow_with_statusID qry -- " << qry;
+ db->query( qry );
+
+}
+
+
+
//Read channel-to-ref_wvl info from AProfile
bool US_InitDialogueGui::readAProfileBasicParms_auto( QXmlStreamReader& xmli )
{
diff --git a/programs/us_com_project/us_com_project_gui.h b/programs/us_com_project/us_com_project_gui.h
index 6f4c99622..2a4d192a5 100644
--- a/programs/us_com_project/us_com_project_gui.h
+++ b/programs/us_com_project/us_com_project_gui.h
@@ -127,6 +127,7 @@ class US_InitDialogueGui : public US_WidgetsDialog
void do_run_tables_cleanup( QMap< QString, QString > );
void do_run_data_cleanup( QMap< QString, QString > );
+ void do_create_autoflowStatus_for_failedRun( QMap< QString, QString > );
bool readAProfileBasicParms_auto ( QXmlStreamReader& );
protected:
From 41c6905a8304387c1f9b15a48f341c425396aa77 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Sat, 28 Sep 2024 19:51:56 -0500
Subject: [PATCH 03/32] GMP, Reportign & e-Signing : fix for bad filenames for
combined RI+IP runs preventing seeing downoaded report and eSigning ...
---
programs/us_esigner_gmp/us_esigner_gmp.cpp | 12 ++++++------
programs/us_reporter_gmp/us_reporter_gmp.cpp | 4 ++--
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/programs/us_esigner_gmp/us_esigner_gmp.cpp b/programs/us_esigner_gmp/us_esigner_gmp.cpp
index cce0671ff..8462c80fb 100644
--- a/programs/us_esigner_gmp/us_esigner_gmp.cpp
+++ b/programs/us_esigner_gmp/us_esigner_gmp.cpp
@@ -651,8 +651,8 @@ void US_eSignaturesGMP::loadGMPReportDB_assigned_separate( void )
//read 'data' .tar.gz for autoflowGMPReport record:
if ( gmpReport_runname_selected_c. contains("combined") )
{
- gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0];
- gmpReport_runname_selected. simplified();
+ gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0]. simplified();
+ //gmpReport_runname_selected. simplified();
}
else
gmpReport_runname_selected = gmpReport_runname_selected_c;
@@ -3237,8 +3237,8 @@ void US_eSignaturesGMP::loadGMPReportDB_assigned_auto( QString aID_passed )
//Correct name for 'combined' runs:
if ( gmpReport_runname_selected_c. contains("combined") )
{
- gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0];
- gmpReport_runname_selected. simplified();
+ gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0]. simplified();
+ //gmpReport_runname_selected. simplified();
}
else
gmpReport_runname_selected = gmpReport_runname_selected_c;
@@ -3388,8 +3388,8 @@ void US_eSignaturesGMP::loadGMPReportDB_assigned( void )
//read 'data' .tar.gz for autoflowGMPReport record:
if ( gmpReport_runname_selected_c. contains("combined") )
{
- gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0];
- gmpReport_runname_selected. simplified();
+ gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0]. simplified();
+ //gmpReport_runname_selected. simplified();
}
else
gmpReport_runname_selected = gmpReport_runname_selected_c;
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index fb746a292..e64a56a95 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -1398,8 +1398,8 @@ void US_ReporterGMP::load_gmp_report_db ( void )
//read 'data' .tar.gz for autoflowGMPReport record:
if ( gmpReport_runname_selected_c. contains("combined") )
{
- gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0];
- gmpReport_runname_selected. simplified();
+ gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0]. simplified();
+ //gmpReport_runname_selected. simplified();
}
else
gmpReport_runname_selected = gmpReport_runname_selected_c;
From 56fdbf6053e67bda52277f1cb9bce674b6d8d1e6 Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 30 Sep 2024 15:07:49 -0600
Subject: [PATCH 04/32] us_archive: initialized
---
library.pri | 3 +
utils/libus_utils.pro | 2 +
utils/us_archive.cpp | 127 ++++++++++++++++++++++++++++++++++++++++++
utils/us_archive.h | 18 ++++++
4 files changed, 150 insertions(+)
create mode 100644 utils/us_archive.cpp
create mode 100644 utils/us_archive.h
diff --git a/library.pri b/library.pri
index 3594ea4f8..352d72950 100644
--- a/library.pri
+++ b/library.pri
@@ -26,6 +26,7 @@ unix {
INCLUDEPATH += $$MYSQLPATH
}
DEFINES += INTEL LINUX
+ LIBS += -larchive
}
@@ -44,6 +45,7 @@ win32 {
LIBS += $$MINGWDIR/lib/libws2_32.a $$MINGWDIR/lib/libadvapi32.a
LIBS += $$MINGWDIR/lib/libgdi32.a $$MINGWDIR/lib/libuser32.a
LIBS += $$MINGWDIR/lib/libkernel32.a $$MINGWDIR/lib/libpsapi.a
+ LIBS += -larchive
#QMAKE_LFLAGS += /IMPLIB:../lib/$${TARGET}.a /MACHINE:X86 /INCREMENTAL:NO
#QMAKE_CXXFLAGS_DEBUG += /wd4996
@@ -58,5 +60,6 @@ macx {
INCLUDEPATH += ../gui ../utils $$QWTPATH/include ../mysql/include
DEFINES += MAC OSX
LIBS += $$QWTLIB
+ LIBS += -larchive
}
diff --git a/utils/libus_utils.pro b/utils/libus_utils.pro
index 4be5f7777..389184210 100644
--- a/utils/libus_utils.pro
+++ b/utils/libus_utils.pro
@@ -25,6 +25,7 @@ TRANSLATIONS = $${TARGET}_DE_de.ts
HEADERS = us_ana_profile.h \
us_analyte.h \
+ us_archive.h \
us_astfem_math.h \
us_astfem_rsa.h \
us_buffer.h \
@@ -76,6 +77,7 @@ HEADERS = us_ana_profile.h \
SOURCES = us_ana_profile.cpp \
us_analyte.cpp \
+ us_archive.cpp \
us_astfem_math.cpp \
us_astfem_rsa.cpp \
us_buffer.cpp \
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
new file mode 100644
index 000000000..0ac65ba36
--- /dev/null
+++ b/utils/us_archive.cpp
@@ -0,0 +1,127 @@
+#include "us_archive.h"
+
+
+int US_Archive:: extract_entry(struct archive *archive, struct archive_entry *entry,
+ QString& path, QString& error) {
+
+ QDir dir(path);
+ dir.makeAbsolute();
+ if (! dir.mkpath(dir.absolutePath())) {
+ error = "US_Archive: Error: Could not make the directory: " + dir.absolutePath();
+ return -1;
+ }
+
+ QString entry_path;
+ QTextStream tsep(&entry_path);
+ tsep << archive_entry_pathname(entry);
+ QString target = dir.absoluteFilePath(entry_path);
+
+ // Ensure that directories leading up to the file exist
+ // mode_t entry_type = archive_entry_mode(entry);
+ // entry_type = entry_type & AE_IFMT;
+ auto entry_type = archive_entry_filetype(entry);
+ if (entry_type == AE_IFDIR) {
+ if (! dir.mkpath(target)) {
+ error = "US_Archive: Error: Could not make the directory: " + target;
+ return -1;
+ } else {
+ return 0;
+ }
+
+ } else if (entry_type == AE_IFREG) {
+ QFileInfo finfo(target);
+ if (! dir.mkpath(finfo.absoluteDir().absolutePath())) {
+ error = "US_Archive: Error: Could not make the directory: " + finfo.absoluteDir().absolutePath();
+ return -1;
+ }
+
+ QFile file(target);
+ file.setPermissions(QFileDevice::WriteOwner);
+ if (file.open(QIODevice::WriteOnly)) {
+ QDataStream dst(&file);
+ const void *buff;
+ size_t size;
+ int64_t offset;
+ while (archive_read_data_block(archive, &buff, &size, &offset) == ARCHIVE_OK) {
+ size_t size_o = static_cast(dst.writeRawData(static_cast(buff), static_cast(size)));
+ if (size != size_o) {
+ error = "US_Archive: Error: Could not write the file: " + target;
+ file.close();
+ return -1;
+ }
+ }
+ file.close();
+ return 0;
+ } else {
+ error = "US_Archive: Error: Could create the file: " + target;
+ return -1;
+ }
+ } else {
+ QString msg("US_Archive: Warning: Not supported file type ( %1 ): %2");
+ error = msg.arg(entry_type, 8).arg(entry_path);
+ return 1;
+ }
+}
+
+
+bool US_Archive::extract(const QString& filename, const QString* path, QString* error) {
+
+ QString outpath;
+ if (path == nullptr) {
+ QFileInfo fino(filename);
+ outpath = fino.absolutePath();
+ } else {
+ outpath = *path;
+ }
+
+ if (error != nullptr) {
+ error->clear();
+ }
+
+ QString error_str;
+ QByteArray fname_bta = filename.toUtf8();
+
+ struct archive *archive;
+ struct archive_entry *entry;
+ int result;
+
+ // Initialize the archive object for reading
+ archive = archive_read_new();
+ archive_read_support_format_all(archive); // Enable support for all formats
+ archive_read_support_filter_all(archive); // Enable support for all compression types
+
+ // Open the archive file directly from disk
+ result = archive_read_open_filename(archive, fname_bta.data(), 10240); // 10240 is the block size
+ if (result != ARCHIVE_OK) {
+ error_str = "US_Archive: Error: ";
+ QTextStream ts(&error_str);
+ ts << archive_error_string(archive);
+ error_str += ": " + filename;
+ archive_read_close(archive);
+ archive_read_free(archive);
+ if (error != nullptr) {
+ *error = error_str;
+ }
+ return false;
+ }
+
+ // Iterate over all entries in the archive
+ while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
+ // Extract the entry to the specified directory
+ result = extract_entry(archive, entry, outpath, error_str);
+ if (result == -1) {
+ archive_read_close(archive);
+ archive_read_free(archive);
+ if (error != nullptr) {
+ *error = error_str;
+ }
+ return false;
+ }
+ archive_read_data_skip(archive); // Skip to the next entry
+ }
+
+ // Clean up
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return true;
+}
diff --git a/utils/us_archive.h b/utils/us_archive.h
new file mode 100644
index 000000000..fc868c961
--- /dev/null
+++ b/utils/us_archive.h
@@ -0,0 +1,18 @@
+#ifndef US_ARCHIVE_H
+#define US_ARCHIVE_H
+
+#include
+#include "archive_entry.h"
+#include "archive.h"
+
+class US_Archive
+{
+public:
+ static bool extract(const QString&, const QString* = nullptr, QString* = nullptr);
+
+private:
+ static int extract_entry(struct archive*, struct archive_entry*, QString&, QString&);
+
+};
+
+#endif // US_ARCHIVE_H
From 623b0045489c0bae59f093726ab11416d3fe4ef2 Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 30 Sep 2024 15:08:26 -0600
Subject: [PATCH 05/32] us_legacy_converter: use us_Archive to extarct zip
files
---
.../us_legacy_converter.cpp | 172 +++++++++---------
.../us_legacy_converter/us_legacy_converter.h | 2 +-
2 files changed, 91 insertions(+), 83 deletions(-)
diff --git a/programs/us_legacy_converter/us_legacy_converter.cpp b/programs/us_legacy_converter/us_legacy_converter.cpp
index 085860bca..17859f039 100644
--- a/programs/us_legacy_converter/us_legacy_converter.cpp
+++ b/programs/us_legacy_converter/us_legacy_converter.cpp
@@ -2,7 +2,8 @@
#include "us_license_t.h"
#include "us_license.h"
//#include "us_extern.h"
-#include
+// #include
+#include "us_archive.h"
int main(int argc, char *argv[])
{
@@ -199,87 +200,88 @@ void US_LegacyConverter::load() {
reload();
}
-bool US_LegacyConverter::extract_files(const QString& tarfile, const QString& savepath) {
-
- QFileInfo finfo(tarfile);
- QString ost;
-#ifdef Q_OS_LINUX
- ost = "LINUX";
-#elif defined ( Q_OS_MACOS )
- ost = "MACOS";
-#elif defined ( Q_OS_WINDOWS )
- ost = "WINDOWS";
-#else
- ost = "NONE";
-#endif
-
- QString sys_tar;
- if (ost.compare("WINDOWS") == 0) {
- sys_tar = QDir(QCoreApplication::applicationDirPath()).filePath("tar.exe");
- if (! QFileInfo::exists(sys_tar) || ! QFileInfo(sys_tar).isExecutable()) {
- QMessageBox::warning(this, "Error!", "TAR program is not found in the following path!\n" + sys_tar);
- sys_tar.clear();
- return false;
- }
- } else if (ost.compare("MACOS") == 0 || ost.compare("LINUX") == 0){
- sys_tar = "tar";
- } else {
- QMessageBox::warning(this, "Error!", "This program only supports the MS Windows, macOS, and Linux!");
- return false;
- }
- te_info->append("Process: starting to extract the loaded file using the system tar program ...");
- qApp->processEvents();
- QStringList tarr_args;
- tarr_args << "-zxf" << finfo.absoluteFilePath() << "-C" << savepath;
- int state = QProcess::execute(sys_tar, tarr_args);
- if (state == -2) {
- QString mesg = tr("The process of extracting the tar file cannot start!\n%1 %2\n\n"
- "Starting to use the internal methods!");
- QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
- } else if (state == -1) {
- QString mesg = tr("The process of extracting the tar file crashed!\n%1 %2\n\n"
- "Starting to use the internal methods!");
- QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
- } else if (state == 0) {
- return true;
- } else {
- QString mesg = tr("Extracting the tar file failed with the return value of %1!\n%2%3\n\n"
- "Starting to use the internal methods!");
- QMessageBox::warning(this, "Warning!", mesg.arg(state).arg(sys_tar, tarr_args.join(" ")));
- }
-
- QString tmpfile = QDir(savepath).filePath("data.tar.gz");
-
- if (QFile::copy(tarfile, tmpfile)) {
- US_Gzip gzip;
- te_info->append("Process: starting to unzip the file using the US_Gzip program ...");
- qApp->processEvents();
+// bool US_LegacyConverter::extract_files(const QString& tarfile, const QString& savepath) {
+
+// QFileInfo finfo(tarfile);
+// QString ost;
+// #ifdef Q_OS_LINUX
+// ost = "LINUX";
+// #elif defined ( Q_OS_MACOS )
+// ost = "MACOS";
+// #elif defined ( Q_OS_WINDOWS )
+// ost = "WINDOWS";
+// #else
+// ost = "NONE";
+// #endif
+
+// QString sys_tar;
+// if (ost.compare("WINDOWS") == 0) {
+// sys_tar = QDir(QCoreApplication::applicationDirPath()).filePath("tar.exe");
+// if (! QFileInfo::exists(sys_tar) || ! QFileInfo(sys_tar).isExecutable()) {
+// QMessageBox::warning(this, "Error!", "TAR program is not found in the following path!\n" + sys_tar);
+// sys_tar.clear();
+// return false;
+// }
+// } else if (ost.compare("MACOS") == 0 || ost.compare("LINUX") == 0){
+// sys_tar = "tar";
+// } else {
+// QMessageBox::warning(this, "Error!", "This program only supports the MS Windows, macOS, and Linux!");
+// return false;
+// }
+// te_info->append("Process: starting to extract the loaded file using the system tar program ...");
+// qApp->processEvents();
+// QStringList tarr_args;
+// tarr_args << "-zxf" << finfo.absoluteFilePath() << "-C" << savepath;
+// int state = QProcess::execute(sys_tar, tarr_args);
+// if (state == -2) {
+// QString mesg = tr("The process of extracting the tar file cannot start!\n%1 %2\n\n"
+// "Starting to use the internal methods!");
+// QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
+// } else if (state == -1) {
+// QString mesg = tr("The process of extracting the tar file crashed!\n%1 %2\n\n"
+// "Starting to use the internal methods!");
+// QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
+// } else if (state == 0) {
+// return true;
+// } else {
+// QString mesg = tr("Extracting the tar file failed with the return value of %1!\n%2%3\n\n"
+// "Starting to use the internal methods!");
+// QMessageBox::warning(this, "Warning!", mesg.arg(state).arg(sys_tar, tarr_args.join(" ")));
+// }
+
+// QString tmpfile = QDir(savepath).filePath("data.tar.gz");
+
+// if (QFile::copy(tarfile, tmpfile)) {
+// US_Gzip gzip;
+// te_info->append("Process: starting to unzip the file using the US_Gzip program ...");
+// qApp->processEvents();
+
+// state = gzip.gunzip(tmpfile);
+// if (state != 0) {
+// QMessageBox::warning(this, "Error!", "Failed to unzip the file!\n" +
+// gzip.explain(state));
+// return false;
+// }
+// tmpfile.chop(3);
+// // qDebug() << tmpfile;
+// te_info->append("Process: starting to extract the tar file using the US_Tar program ...");
+// qApp->processEvents();
+// US_Tar ustar;
+// QStringList extlist;
+// state = ustar.extract(tmpfile, &extlist, savepath);
+// if (state != 0) {
+// QMessageBox::warning(this, "Error!", "FAILED to extract the file!\n" +
+// ustar.explain(state));
+// return false;
+// }
+// } else {
+// QMessageBox::warning(this, "Error!", tr("FAILED to copy the file to the /tmp directory!"));
+// return false;
+// }
+// return true;
+
+// }
- state = gzip.gunzip(tmpfile);
- if (state != 0) {
- QMessageBox::warning(this, "Error!", "Failed to unzip the file!\n" +
- gzip.explain(state));
- return false;
- }
- tmpfile.chop(3);
- // qDebug() << tmpfile;
- te_info->append("Process: starting to extract the tar file using the US_Tar program ...");
- qApp->processEvents();
- US_Tar ustar;
- QStringList extlist;
- state = ustar.extract(tmpfile, &extlist, savepath);
- if (state != 0) {
- QMessageBox::warning(this, "Error!", "FAILED to extract the file!\n" +
- ustar.explain(state));
- return false;
- }
- } else {
- QMessageBox::warning(this, "Error!", tr("FAILED to copy the file to the /tmp directory!"));
- return false;
- }
- return true;
-
-}
void US_LegacyConverter::reload() {
reset();
@@ -311,7 +313,13 @@ void US_LegacyConverter::reload() {
QTemporaryDir tmp_dir_sorted;
QString runid;
if (tmp_dir.isValid()) {
- if (! extract_files(tar_finfo.absoluteFilePath(), tmp_dir.path())) {
+ QString fpath = tar_finfo.absoluteFilePath();
+ QString opath = tmp_dir.path();
+ QString error;
+ bool ok = US_Archive::extract(fpath, &opath, &error);
+ te_info->append("Process: starting to extract the file ...");
+ qApp->processEvents();
+ if (! ok) {
te_info->append("Failed to exctract the file: " + tar_finfo.absoluteFilePath());
tar_fpath.clear();
qApp->restoreOverrideCursor();
diff --git a/programs/us_legacy_converter/us_legacy_converter.h b/programs/us_legacy_converter/us_legacy_converter.h
index 3ed7ec423..817a041c3 100644
--- a/programs/us_legacy_converter/us_legacy_converter.h
+++ b/programs/us_legacy_converter/us_legacy_converter.h
@@ -64,7 +64,7 @@ class US_LegacyConverter : public US_Widgets
//! \param tarpath Path to the TAR archive
//! \param extractpath Path to extract the files to
//! \return true if extraction is successful, false otherwise
- bool extract_files(const QString& tarpath, const QString& extractpath);
+ // bool extract_files(const QString& tarpath, const QString& extractpath);
private slots:
//! \brief Slot to load data
From e96479cbf67dca87212d684de97746f6a57cfd56 Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 30 Sep 2024 15:58:54 -0600
Subject: [PATCH 06/32] us_archive: add US_UTIL_EXTERN to the header file
---
utils/us_archive.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/utils/us_archive.h b/utils/us_archive.h
index fc868c961..99f8783d7 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -4,8 +4,10 @@
#include
#include "archive_entry.h"
#include "archive.h"
+#include "us_extern.h"
-class US_Archive
+
+class US_UTIL_EXTERN US_Archive
{
public:
static bool extract(const QString&, const QString* = nullptr, QString* = nullptr);
From 401e397df3bc4864ceea1eab9e818f8ac2848c2d Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 30 Sep 2024 18:33:35 -0600
Subject: [PATCH 07/32] us_legacy_converter: clean the header file
---
programs/us_legacy_converter/us_legacy_converter.cpp | 4 +---
programs/us_legacy_converter/us_legacy_converter.h | 4 ++--
2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/programs/us_legacy_converter/us_legacy_converter.cpp b/programs/us_legacy_converter/us_legacy_converter.cpp
index 17859f039..1c2345e0d 100644
--- a/programs/us_legacy_converter/us_legacy_converter.cpp
+++ b/programs/us_legacy_converter/us_legacy_converter.cpp
@@ -1,8 +1,6 @@
#include "us_legacy_converter.h"
#include "us_license_t.h"
#include "us_license.h"
-//#include "us_extern.h"
-// #include
#include "us_archive.h"
int main(int argc, char *argv[])
@@ -317,7 +315,7 @@ void US_LegacyConverter::reload() {
QString opath = tmp_dir.path();
QString error;
bool ok = US_Archive::extract(fpath, &opath, &error);
- te_info->append("Process: starting to extract the file ...");
+ te_info->append("Process: Extracting file ...");
qApp->processEvents();
if (! ok) {
te_info->append("Failed to exctract the file: " + tar_finfo.absoluteFilePath());
diff --git a/programs/us_legacy_converter/us_legacy_converter.h b/programs/us_legacy_converter/us_legacy_converter.h
index 817a041c3..72eeae530 100644
--- a/programs/us_legacy_converter/us_legacy_converter.h
+++ b/programs/us_legacy_converter/us_legacy_converter.h
@@ -6,8 +6,8 @@
#include "us_widgets.h"
#include "us_dataIO.h"
#include "us_settings.h"
-#include "us_tar.h"
-#include "us_gzip.h"
+// #include "us_tar.h"
+// #include "us_gzip.h"
#include "../us_convert/us_convert.h"
//! \brief Class for converting legacy data to a modern format
From 24499153a4dc7ca65d4be0e0edb9079b264dda69 Mon Sep 17 00:00:00 2001
From: samo38
Date: Tue, 1 Oct 2024 01:16:50 -0600
Subject: [PATCH 08/32] us_archive: add the compress function and merge the
extract_entry and to extract function in a clear way
---
utils/us_archive.cpp | 331 +++++++++++++++++++++++++++++++------------
utils/us_archive.h | 3 +-
2 files changed, 244 insertions(+), 90 deletions(-)
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
index 0ac65ba36..683f29557 100644
--- a/utils/us_archive.cpp
+++ b/utils/us_archive.cpp
@@ -1,127 +1,280 @@
#include "us_archive.h"
+bool US_Archive::extract(const QString& filename, const QString* path, QString* error) {
-int US_Archive:: extract_entry(struct archive *archive, struct archive_entry *entry,
- QString& path, QString& error) {
+ QString error_;
+ if (error != nullptr) {
+ error->clear();
+ }
- QDir dir(path);
+ QDir dir;
+ if (path == nullptr) {
+ QFileInfo fino(filename);
+ dir.setPath(fino.absolutePath());
+ } else {
+ dir.setPath(*path);
+ }
dir.makeAbsolute();
- if (! dir.mkpath(dir.absolutePath())) {
- error = "US_Archive: Error: Could not make the directory: " + dir.absolutePath();
- return -1;
- }
-
- QString entry_path;
- QTextStream tsep(&entry_path);
- tsep << archive_entry_pathname(entry);
- QString target = dir.absoluteFilePath(entry_path);
-
- // Ensure that directories leading up to the file exist
- // mode_t entry_type = archive_entry_mode(entry);
- // entry_type = entry_type & AE_IFMT;
- auto entry_type = archive_entry_filetype(entry);
- if (entry_type == AE_IFDIR) {
- if (! dir.mkpath(target)) {
- error = "US_Archive: Error: Could not make the directory: " + target;
- return -1;
- } else {
- return 0;
+ if (! dir.mkpath(dir.path())) {
+ error_ = "US_Archive: Error: Could not make the directory: " + dir.path();
+ if (error != nullptr) {
+ *error = error_;
}
+ return false;
+ }
- } else if (entry_type == AE_IFREG) {
- QFileInfo finfo(target);
- if (! dir.mkpath(finfo.absoluteDir().absolutePath())) {
- error = "US_Archive: Error: Could not make the directory: " + finfo.absoluteDir().absolutePath();
- return -1;
+ struct archive *archive;
+ struct archive_entry *entry;
+
+ // Initialize archive object to read
+ archive = archive_read_new();
+ archive_read_support_format_all(archive); // Enable support for all formats
+ archive_read_support_filter_all(archive); // Enable support for all compression filters
+
+ int result;
+ // Open archive file
+ result = archive_read_open_filename(archive, filename.toUtf8().constData(), 10240);
+ if (result != ARCHIVE_OK) {
+ error_ = QObject::tr("US_Archive: Error: %1: %2").
+ arg(archive_error_string(archive), filename);
+ archive_read_close(archive);
+ archive_read_free(archive);
+ if (error != nullptr) {
+ *error = error_;
}
+ return false;
+ }
+
+ // Loop into the archive file as far as it has files
+ while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
+ // Get the relative path of entry
+ QString entry_path = QObject::tr("%1").arg(archive_entry_pathname(entry));
+ QFileInfo target(dir.absoluteFilePath(entry_path));
- QFile file(target);
- file.setPermissions(QFileDevice::WriteOwner);
- if (file.open(QIODevice::WriteOnly)) {
- QDataStream dst(&file);
- const void *buff;
- size_t size;
- int64_t offset;
- while (archive_read_data_block(archive, &buff, &size, &offset) == ARCHIVE_OK) {
- size_t size_o = static_cast(dst.writeRawData(static_cast(buff), static_cast(size)));
- if (size != size_o) {
- error = "US_Archive: Error: Could not write the file: " + target;
- file.close();
- return -1;
+ // mode_t entry_type = archive_entry_mode(entry);
+ // entry_type = entry_type & AE_IFMT;
+ mode_t entry_type = archive_entry_filetype(entry);
+ //If the entry is a directory, make its absolute path
+ //If the entry is a file, make its parent's absolute path
+ if (entry_type == AE_IFDIR) {
+ if (! dir.mkpath(target.absoluteFilePath())) {
+ error_ = "US_Archive: Error: Failed to make path: " + target.absoluteFilePath();
+ if (error != nullptr) {
+ *error = error_;
}
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return false;
+ }
+ } else if (entry_type == AE_IFREG) {
+ if (! dir.mkpath(target.absolutePath())) {
+ error_ = "US_Archive: Error: Failed to make path: " + target.absolutePath();
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return false;
+ }
+
+ QFile file(target.absoluteFilePath());
+ file.setPermissions(QFileDevice::WriteOwner);
+ if (file.open(QIODevice::WriteOnly)) {
+ QDataStream dstream(&file);
+ const void *buff;
+ size_t size;
+ int64_t offset;
+ //Read the entry data with a buffer, then write it to the file
+ while (archive_read_data_block(archive, &buff, &size, &offset) == ARCHIVE_OK) {
+ size_t size_o = static_cast(dstream.writeRawData(static_cast(buff),
+ static_cast(size)));
+ if (size != size_o) {
+ error_ = "US_Archive: Error: Failed to write file: " + target.absolutePath();
+ file.close();
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return false;
+ }
+ }
+ file.close();
+ } else {
+ error_ = "US_Archive: Error: Failed to open file: " + target.absolutePath();
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return false;
}
- file.close();
- return 0;
- } else {
- error = "US_Archive: Error: Could create the file: " + target;
- return -1;
}
- } else {
- QString msg("US_Archive: Warning: Not supported file type ( %1 ): %2");
- error = msg.arg(entry_type, 8).arg(entry_path);
- return 1;
+ // Skip the current entry data blocks
+ archive_read_data_skip(archive);
}
+
+ archive_read_close(archive);
+ archive_read_free(archive);
+ return true;
}
+bool US_Archive::compress(const QStringList& list, QString& filename, QString* error) {
+ struct archive *archive;
+ archive = archive_write_new();
-bool US_Archive::extract(const QString& filename, const QString* path, QString* error) {
+ if (error != nullptr) {
+ error->clear();
+ }
+ QString error_;
+ QTextStream error_ts(&error_);
+ QFileInfo finfo;
+ finfo.setFile(filename);
+ QString extention = finfo.completeSuffix();
- QString outpath;
- if (path == nullptr) {
- QFileInfo fino(filename);
- outpath = fino.absolutePath();
+ int result;
+ bool flag = true;
+ if (extention.compare("tar", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_pax_restricted(archive);
+ }
+ else if (extention.compare("tgz", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_pax_restricted(archive);
+ if (result == ARCHIVE_OK) result = archive_write_add_filter_gzip(archive);
+ }
+ else if (extention.compare("tar.gz", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_pax_restricted(archive);
+ if (result == ARCHIVE_OK) result = archive_write_add_filter_gzip(archive);
+ }
+ else if (extention.compare("tar.xz", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_pax_restricted(archive);
+ if (result == ARCHIVE_OK) result = archive_write_add_filter_xz(archive);
+ }
+ else if (extention.compare("tar.bz2", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_pax_restricted(archive);
+ if (result == ARCHIVE_OK) result = archive_write_add_filter_bzip2(archive);
+ }
+ else if (extention.compare("zip", Qt::CaseInsensitive) == 0) {
+ result = archive_write_set_format_zip(archive);
} else {
- outpath = *path;
+ error_ = "US_Archive: Error: file format not supported: " + filename;
+ flag = false;
}
- if (error != nullptr) {
- error->clear();
+ if (flag && result != ARCHIVE_OK) {
+ error_ts << archive_error_string(archive);
+ flag = false;
}
- QString error_str;
- QByteArray fname_bta = filename.toUtf8();
-
- struct archive *archive;
- struct archive_entry *entry;
- int result;
+ if (! flag) {
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_write_free(archive);
+ return false;
+ }
- // Initialize the archive object for reading
- archive = archive_read_new();
- archive_read_support_format_all(archive); // Enable support for all formats
- archive_read_support_filter_all(archive); // Enable support for all compression types
+ QStringList absolute_files;
+ QStringList relative_files;
+ QDir dir;
+ for (int ii = 0; ii < list.size(); ii++) {
+ finfo.setFile(list.at(ii));
+ finfo.makeAbsolute();
+ QString absolute = finfo.absoluteFilePath();
+ QString relative = finfo.fileName();
+ if (! finfo.exists()) {
+ error_ = "US_Archive: Error: item not exist: " + absolute;
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_write_free(archive);
+ return false;
+ }
+ if (ii == 0) {
+ dir.setPath(finfo.absolutePath());
+ }
+ if (finfo.isFile()) {
+ absolute_files << absolute;
+ relative_files << relative;
+ } else if (finfo.isDir()) {
+ list_files(absolute, relative, absolute_files, relative_files);
+ }
+ }
+ if (absolute_files.size() == 0) {
+ error_ = "US_Archive: Error: empty file";
+ if (error != nullptr) {
+ *error = error_;
+ }
+ archive_write_free(archive);
+ return false;
+ }
- // Open the archive file directly from disk
- result = archive_read_open_filename(archive, fname_bta.data(), 10240); // 10240 is the block size
+ dir.makeAbsolute();
+ filename = dir.absoluteFilePath(filename);
+ result = archive_write_open_filename(archive, filename.toUtf8().constData());
if (result != ARCHIVE_OK) {
- error_str = "US_Archive: Error: ";
- QTextStream ts(&error_str);
- ts << archive_error_string(archive);
- error_str += ": " + filename;
- archive_read_close(archive);
- archive_read_free(archive);
+ error_.clear();
+ error_ts << archive_error_string(archive);
if (error != nullptr) {
- *error = error_str;
+ *error = error_;
}
+ archive_write_free(archive);
return false;
}
- // Iterate over all entries in the archive
- while (archive_read_next_header(archive, &entry) == ARCHIVE_OK) {
- // Extract the entry to the specified directory
- result = extract_entry(archive, entry, outpath, error_str);
- if (result == -1) {
- archive_read_close(archive);
- archive_read_free(archive);
+ for (int ii = 0; ii < absolute_files.size(); ii++) {
+ QString absolute = absolute_files.at(ii);
+ QString relative = relative_files.at(ii);
+ struct archive_entry *entry;
+ QFile file(absolute);
+
+ if (!file.open(QIODevice::ReadOnly)) {
+ error_ = "US_Archive: Error: Failed to open file: " + absolute;
if (error != nullptr) {
- *error = error_str;
+ *error = error_;
}
+ archive_write_close(archive);
+ archive_write_free(archive);
return false;
}
- archive_read_data_skip(archive); // Skip to the next entry
+
+ // Write the file header
+ entry = archive_entry_new();
+ archive_entry_set_pathname(entry, relative.toUtf8().constData());
+ archive_entry_set_size(entry, file.size());
+ archive_entry_set_filetype(entry, AE_IFREG);
+ archive_entry_set_perm(entry, 0644);
+ archive_write_header(archive, entry);
+
+ // Write the file content
+ QByteArray file_content = file.readAll();
+ archive_write_data(archive, file_content.data(), file_content.size());
+
+ // Free the entry
+ archive_entry_free(entry);
+ file.close();
}
- // Clean up
- archive_read_close(archive);
- archive_read_free(archive);
+ archive_write_close(archive);
+ archive_write_free(archive);
return true;
}
+
+
+void US_Archive::list_files(const QString& abs_path, const QString& base_dir,
+ QStringList& abs_list, QStringList& rel_list) {
+
+ // Loop recursively into folders to list all files
+ QDir dir(abs_path);
+ QDir::Filters filter = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::NoDotAndDotDot | QDir::NoSymLinks;
+ QFileInfoList list = dir.entryInfoList(filter);
+ foreach (const QFileInfo item, list) {
+ QString rel_dir = base_dir + "/" + item.fileName();
+
+ if (item.isDir()) {
+ list_files(item.absoluteFilePath(), rel_dir, abs_list, rel_list);
+ } else {
+ abs_list << item.absoluteFilePath();
+ rel_list << rel_dir;
+ }
+ }
+}
diff --git a/utils/us_archive.h b/utils/us_archive.h
index 99f8783d7..35d81bc81 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -11,9 +11,10 @@ class US_UTIL_EXTERN US_Archive
{
public:
static bool extract(const QString&, const QString* = nullptr, QString* = nullptr);
+ static bool compress(const QStringList&, QString&, QString* = nullptr);
private:
- static int extract_entry(struct archive*, struct archive_entry*, QString&, QString&);
+ static void list_files(const QString&, const QString&, QStringList&, QStringList&);
};
From 46224926ea23cf785015c765e74df269d86294fc Mon Sep 17 00:00:00 2001
From: samo38
Date: Tue, 1 Oct 2024 14:14:16 -0600
Subject: [PATCH 09/32] us_archive: finished writing the static fucntions and
theirs docs
---
utils/us_archive.cpp | 19 +++++++++++--------
utils/us_archive.h | 20 +++++++++++++++++++-
2 files changed, 30 insertions(+), 9 deletions(-)
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
index 683f29557..94c559c14 100644
--- a/utils/us_archive.cpp
+++ b/utils/us_archive.cpp
@@ -84,12 +84,12 @@ bool US_Archive::extract(const QString& filename, const QString* path, QString*
const void *buff;
size_t size;
int64_t offset;
- //Read the entry data with a buffer, then write it to the file
+ //Read data blocks with a buffer to write them in a file
while (archive_read_data_block(archive, &buff, &size, &offset) == ARCHIVE_OK) {
size_t size_o = static_cast(dstream.writeRawData(static_cast(buff),
static_cast(size)));
if (size != size_o) {
- error_ = "US_Archive: Error: Failed to write file: " + target.absolutePath();
+ error_ = "US_Archive: Error: Failed to write data blocks: " + target.absolutePath();
file.close();
if (error != nullptr) {
*error = error_;
@@ -127,11 +127,11 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
error->clear();
}
QString error_;
- QTextStream error_ts(&error_);
QFileInfo finfo;
finfo.setFile(filename);
QString extention = finfo.completeSuffix();
+ // Check archive format
int result;
bool flag = true;
if (extention.compare("tar", Qt::CaseInsensitive) == 0) {
@@ -156,12 +156,12 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
else if (extention.compare("zip", Qt::CaseInsensitive) == 0) {
result = archive_write_set_format_zip(archive);
} else {
- error_ = "US_Archive: Error: file format not supported: " + filename;
+ error_ = "US_Archive: Error: File format not supported: " + filename;
flag = false;
}
if (flag && result != ARCHIVE_OK) {
- error_ts << archive_error_string(archive);
+ error_ = QObject::tr("US_Archive: Error: Failed to initialize archive data structure: %1").arg(archive_error_string(archive));
flag = false;
}
@@ -176,6 +176,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
QStringList absolute_files;
QStringList relative_files;
QDir dir;
+ // List all files and directories
for (int ii = 0; ii < list.size(); ii++) {
finfo.setFile(list.at(ii));
finfo.makeAbsolute();
@@ -200,7 +201,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
}
}
if (absolute_files.size() == 0) {
- error_ = "US_Archive: Error: empty file";
+ error_ = "US_Archive: Error: Empty file list";
if (error != nullptr) {
*error = error_;
}
@@ -208,12 +209,13 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
return false;
}
+ // Create archive file
dir.makeAbsolute();
filename = dir.absoluteFilePath(filename);
result = archive_write_open_filename(archive, filename.toUtf8().constData());
if (result != ARCHIVE_OK) {
error_.clear();
- error_ts << archive_error_string(archive);
+ error_ = QObject::tr("US_Archive: Error: Failed to create archive file: %1").arg(archive_error_string(archive));
if (error != nullptr) {
*error = error_;
}
@@ -221,6 +223,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
return false;
}
+ // Loop to add all files to the archive file
for (int ii = 0; ii < absolute_files.size(); ii++) {
QString absolute = absolute_files.at(ii);
QString relative = relative_files.at(ii);
@@ -263,7 +266,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
void US_Archive::list_files(const QString& abs_path, const QString& base_dir,
QStringList& abs_list, QStringList& rel_list) {
- // Loop recursively into folders to list all files
+ // Loop folders recursively to list all files
QDir dir(abs_path);
QDir::Filters filter = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::NoDotAndDotDot | QDir::NoSymLinks;
QFileInfoList list = dir.entryInfoList(filter);
diff --git a/utils/us_archive.h b/utils/us_archive.h
index 35d81bc81..286ed94c8 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -6,14 +6,32 @@
#include "archive.h"
#include "us_extern.h"
-
+//! \brief A class to extract and compress archive files
+//! Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
class US_UTIL_EXTERN US_Archive
{
public:
+ //! \brief Static function to extract archive files. Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
+ //! \param filename Input path to the archive file
+ //! \param outpath Output directory where extracted data is saved. The default is NULL, which means that the content will be extracted to the archive file path.
+ //! \param error String to view errors if the extraction process fails. The default is NULL.
+ //! \return A boolean to verify the success of the extraction
static bool extract(const QString&, const QString* = nullptr, QString* = nullptr);
+
+ //! \brief Static function to compress files and folders into an archive file.
+ //! \param list A list of all files and folders need to be compressed.
+ //! \param filename The output archive filename. The output path is taken from the path of the first item.
+ //! After compression is complete, this parameter stores the path of the archive file. Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
+ //! \param error String to view errors if the compression process fails. The default is NULL.
+ //! \return A boolean to verify the success of the compression
static bool compress(const QStringList&, QString&, QString* = nullptr);
private:
+ //! \brief A private static function to list contents of a directory.
+ //! \param full_path Absolute path to the directory.
+ //! \param relative_path Relative path to the directory.
+ //! \param full_path_list A list to store all absolute paths.
+ //! \param relative_path_list A list to store all relative paths.
static void list_files(const QString&, const QString&, QStringList&, QStringList&);
};
From 8be9a64d2e8a4ab5e43be0a07613119784dcaac9 Mon Sep 17 00:00:00 2001
From: samo38
Date: Wed, 2 Oct 2024 12:18:06 -0600
Subject: [PATCH 10/32] us_archive: change it from using static functions to
object oriented.
---
utils/us_archive.cpp | 122 +++++++++++++++++--------------------------
utils/us_archive.h | 59 ++++++++++++++-------
2 files changed, 88 insertions(+), 93 deletions(-)
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
index 94c559c14..7df0981e0 100644
--- a/utils/us_archive.cpp
+++ b/utils/us_archive.cpp
@@ -1,25 +1,19 @@
#include "us_archive.h"
+#include "archive_entry.h"
+#include "archive.h"
-bool US_Archive::extract(const QString& filename, const QString* path, QString* error) {
-
- QString error_;
- if (error != nullptr) {
- error->clear();
- }
+bool US_Archive::extract(const QString& filename) {
QDir dir;
- if (path == nullptr) {
+ if (outpath.isEmpty()) {
QFileInfo fino(filename);
dir.setPath(fino.absolutePath());
} else {
- dir.setPath(*path);
+ dir.setPath(outpath);
}
dir.makeAbsolute();
if (! dir.mkpath(dir.path())) {
- error_ = "US_Archive: Error: Could not make the directory: " + dir.path();
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: Could not make the directory: " + dir.path();
return false;
}
@@ -35,13 +29,10 @@ bool US_Archive::extract(const QString& filename, const QString* path, QString*
// Open archive file
result = archive_read_open_filename(archive, filename.toUtf8().constData(), 10240);
if (result != ARCHIVE_OK) {
- error_ = QObject::tr("US_Archive: Error: %1: %2").
- arg(archive_error_string(archive), filename);
+ error = QObject::tr("US_Archive: Error: %1: %2").
+ arg(archive_error_string(archive), filename);
archive_read_close(archive);
archive_read_free(archive);
- if (error != nullptr) {
- *error = error_;
- }
return false;
}
@@ -58,20 +49,15 @@ bool US_Archive::extract(const QString& filename, const QString* path, QString*
//If the entry is a file, make its parent's absolute path
if (entry_type == AE_IFDIR) {
if (! dir.mkpath(target.absoluteFilePath())) {
- error_ = "US_Archive: Error: Failed to make path: " + target.absoluteFilePath();
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: Failed to make path: " + target.absoluteFilePath();
archive_read_close(archive);
archive_read_free(archive);
return false;
}
+ // emit itemExtracted(entry_path, target.absoluteFilePath());
} else if (entry_type == AE_IFREG) {
if (! dir.mkpath(target.absolutePath())) {
- error_ = "US_Archive: Error: Failed to make path: " + target.absolutePath();
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: Failed to make path: " + target.absolutePath();
archive_read_close(archive);
archive_read_free(archive);
return false;
@@ -89,22 +75,17 @@ bool US_Archive::extract(const QString& filename, const QString* path, QString*
size_t size_o = static_cast(dstream.writeRawData(static_cast(buff),
static_cast(size)));
if (size != size_o) {
- error_ = "US_Archive: Error: Failed to write data blocks: " + target.absolutePath();
+ error = "US_Archive: Error: Failed to write data blocks: " + target.absolutePath();
file.close();
- if (error != nullptr) {
- *error = error_;
- }
archive_read_close(archive);
archive_read_free(archive);
return false;
}
}
file.close();
+ emit itemExtracted(entry_path, target.absoluteFilePath());
} else {
- error_ = "US_Archive: Error: Failed to open file: " + target.absolutePath();
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: Failed to open file: " + target.absolutePath();
archive_read_close(archive);
archive_read_free(archive);
return false;
@@ -119,14 +100,14 @@ bool US_Archive::extract(const QString& filename, const QString* path, QString*
return true;
}
-bool US_Archive::compress(const QStringList& list, QString& filename, QString* error) {
+bool US_Archive::compress(const QStringList& list, QString& filename) {
+ absolute_paths.clear();
+ relative_paths.clear();
+
struct archive *archive;
archive = archive_write_new();
- if (error != nullptr) {
- error->clear();
- }
- QString error_;
+ error.clear();
QFileInfo finfo;
finfo.setFile(filename);
QString extention = finfo.completeSuffix();
@@ -156,25 +137,20 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
else if (extention.compare("zip", Qt::CaseInsensitive) == 0) {
result = archive_write_set_format_zip(archive);
} else {
- error_ = "US_Archive: Error: File format not supported: " + filename;
+ error = "US_Archive: Error: File format not supported: " + filename;
flag = false;
}
if (flag && result != ARCHIVE_OK) {
- error_ = QObject::tr("US_Archive: Error: Failed to initialize archive data structure: %1").arg(archive_error_string(archive));
+ error = QObject::tr("US_Archive: Error: Failed to initialize archive data structure: %1").arg(archive_error_string(archive));
flag = false;
}
if (! flag) {
- if (error != nullptr) {
- *error = error_;
- }
archive_write_free(archive);
return false;
}
- QStringList absolute_files;
- QStringList relative_files;
QDir dir;
// List all files and directories
for (int ii = 0; ii < list.size(); ii++) {
@@ -183,10 +159,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
QString absolute = finfo.absoluteFilePath();
QString relative = finfo.fileName();
if (! finfo.exists()) {
- error_ = "US_Archive: Error: item not exist: " + absolute;
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: item not exist: " + absolute;
archive_write_free(archive);
return false;
}
@@ -194,17 +167,14 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
dir.setPath(finfo.absolutePath());
}
if (finfo.isFile()) {
- absolute_files << absolute;
- relative_files << relative;
+ absolute_paths << absolute;
+ relative_paths << relative;
} else if (finfo.isDir()) {
- list_files(absolute, relative, absolute_files, relative_files);
+ list_files(absolute, relative);
}
}
- if (absolute_files.size() == 0) {
- error_ = "US_Archive: Error: Empty file list";
- if (error != nullptr) {
- *error = error_;
- }
+ if (absolute_paths.size() == 0) {
+ error = "US_Archive: Error: Empty file list";
archive_write_free(archive);
return false;
}
@@ -214,27 +184,20 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
filename = dir.absoluteFilePath(filename);
result = archive_write_open_filename(archive, filename.toUtf8().constData());
if (result != ARCHIVE_OK) {
- error_.clear();
- error_ = QObject::tr("US_Archive: Error: Failed to create archive file: %1").arg(archive_error_string(archive));
- if (error != nullptr) {
- *error = error_;
- }
+ error = QObject::tr("US_Archive: Error: Failed to create archive file: %1").arg(archive_error_string(archive));
archive_write_free(archive);
return false;
}
// Loop to add all files to the archive file
- for (int ii = 0; ii < absolute_files.size(); ii++) {
- QString absolute = absolute_files.at(ii);
- QString relative = relative_files.at(ii);
+ for (int ii = 0; ii < absolute_paths.size(); ii++) {
+ QString absolute = absolute_paths.at(ii);
+ QString relative = relative_paths.at(ii);
struct archive_entry *entry;
QFile file(absolute);
if (!file.open(QIODevice::ReadOnly)) {
- error_ = "US_Archive: Error: Failed to open file: " + absolute;
- if (error != nullptr) {
- *error = error_;
- }
+ error = "US_Archive: Error: Failed to open file: " + absolute;
archive_write_close(archive);
archive_write_free(archive);
return false;
@@ -255,6 +218,9 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
// Free the entry
archive_entry_free(entry);
file.close();
+
+ // emit signal
+ emit itemAdded(relative, absolute);
}
archive_write_close(archive);
@@ -262,9 +228,7 @@ bool US_Archive::compress(const QStringList& list, QString& filename, QString* e
return true;
}
-
-void US_Archive::list_files(const QString& abs_path, const QString& base_dir,
- QStringList& abs_list, QStringList& rel_list) {
+void US_Archive::list_files(const QString& abs_path, const QString& base_dir) {
// Loop folders recursively to list all files
QDir dir(abs_path);
@@ -274,10 +238,18 @@ void US_Archive::list_files(const QString& abs_path, const QString& base_dir,
QString rel_dir = base_dir + "/" + item.fileName();
if (item.isDir()) {
- list_files(item.absoluteFilePath(), rel_dir, abs_list, rel_list);
+ list_files(item.absoluteFilePath(), rel_dir);
} else {
- abs_list << item.absoluteFilePath();
- rel_list << rel_dir;
+ absolute_paths << item.absoluteFilePath();
+ relative_paths << rel_dir;
}
}
}
+
+void US_Archive::setPath(const QString& path) {
+ outpath = path;
+}
+
+QString US_Archive::getError() {
+ return error;
+}
diff --git a/utils/us_archive.h b/utils/us_archive.h
index 286ed94c8..299d0a895 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -2,37 +2,60 @@
#define US_ARCHIVE_H
#include
-#include "archive_entry.h"
-#include "archive.h"
#include "us_extern.h"
//! \brief A class to extract and compress archive files
//! Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
-class US_UTIL_EXTERN US_Archive
+class US_UTIL_EXTERN US_Archive : public QObject
{
+ Q_OBJECT
+
public:
- //! \brief Static function to extract archive files. Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
- //! \param filename Input path to the archive file
- //! \param outpath Output directory where extracted data is saved. The default is NULL, which means that the content will be extracted to the archive file path.
- //! \param error String to view errors if the extraction process fails. The default is NULL.
+ US_Archive() {};
+
+ //! \brief Method to extract archive file (Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip).
+ //! \param filename Path to archive file. Output directory is taken from the path of the archive file unless it is set directly using setPath() method.
//! \return A boolean to verify the success of the extraction
- static bool extract(const QString&, const QString* = nullptr, QString* = nullptr);
+ bool extract(const QString&);
- //! \brief Static function to compress files and folders into an archive file.
- //! \param list A list of all files and folders need to be compressed.
+ //! \brief Method to compress files and folders into an archive file.
+ //! \param list list of all files and folders need to be compressed.
//! \param filename The output archive filename. The output path is taken from the path of the first item.
- //! After compression is complete, this parameter stores the path of the archive file. Supported files format: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
- //! \param error String to view errors if the compression process fails. The default is NULL.
+ //! After compression is complete, this parameter stores the path of the archive file.
+ //! Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
//! \return A boolean to verify the success of the compression
- static bool compress(const QStringList&, QString&, QString* = nullptr);
+ bool compress(const QStringList&, QString&);
+
+ //! \brief Method to set the path to store extracted data.
+ //! \param Path
+ void setPath(const QString&);
+
+ //! \brief Method to receive the error string.
+ //! \return Error string.
+ QString getError();
+
+signals:
+ //! \brief A Signal sent when an entry is extracted successfully
+ //! \param relative_path
+ //! \param absolute_path
+ void itemExtracted (const QString&, const QString&);
+
+ //! \brief A Signal sent when an entry is added to the archive file successfully
+ //! \param relative_path
+ //! \param absolute_path
+ void itemAdded (const QString&, const QString&);
private:
- //! \brief A private static function to list contents of a directory.
- //! \param full_path Absolute path to the directory.
+
+ QString outpath;
+ QString error;
+ QStringList absolute_paths;
+ QStringList relative_paths;
+
+ //! \brief List contents of a directory.
+ //! \param absolute_path Absolute path to the directory.
//! \param relative_path Relative path to the directory.
- //! \param full_path_list A list to store all absolute paths.
- //! \param relative_path_list A list to store all relative paths.
- static void list_files(const QString&, const QString&, QStringList&, QStringList&);
+ void list_files(const QString&, const QString&);
};
From 8927fa0a1dc220f2c2d8480ad28d48aea129b011 Mon Sep 17 00:00:00 2001
From: Borries Demeler <7659499+demeler@users.noreply.github.com>
Date: Wed, 2 Oct 2024 13:35:01 -0600
Subject: [PATCH 11/32] issue 358 - license updates
---
gui/us_license.cpp | 71 +++++++++-------------------------------------
gui/us_license.h | 6 ----
2 files changed, 14 insertions(+), 63 deletions(-)
diff --git a/gui/us_license.cpp b/gui/us_license.cpp
index 7f587942b..a3774bbe1 100644
--- a/gui/us_license.cpp
+++ b/gui/us_license.cpp
@@ -25,13 +25,13 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
// Banner
QLabel* banner = us_banner(
- tr( "UltraScan III Registration\nPlease enter all fields" ) );
+ tr( "Please enter all fields" ) );
banner->setGeometry(
- QRect( xpos, ypos, width, spacing + 2 * rowHeight ) );
+ QRect( xpos, ypos, width, spacing + rowHeight ) );
// Row 1 - Name
- ypos += rowHeight * 3 + spacing;
+ ypos += rowHeight + 2 * spacing;
QLabel* firstname = us_label( tr( "Name (first, last):" ), 0, QFont::Bold );
firstname->setGeometry( xpos, ypos, buttonw, rowHeight );
@@ -85,20 +85,6 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
connect( le_institution, SIGNAL( textChanged ( const QString& ) ),
SLOT ( update_institution( const QString& ) ) );
- // Row 4 - Address
- xpos = spacing;
- ypos += rowHeight + spacing;
-
- QLabel* address = us_label( tr( "Address:" ), 0, QFont::Bold );
- address->setGeometry( xpos, ypos, buttonw, rowHeight );
-
- xpos += buttonw + spacing;
-
- le_address = us_lineedit( "" );
- le_address->setGeometry( xpos, ypos, full_buttonw, rowHeight );
- connect( le_address, SIGNAL( textChanged ( const QString& ) ),
- SLOT ( update_address( const QString& ) ) );
-
// Row 5 - City/State/Zip
xpos = spacing;
ypos += rowHeight + spacing;
@@ -139,31 +125,12 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
xpos += mediumColumn + spacing + 10; // Adjust
- QLabel* zip = us_label( tr( "Zip:" ), 0, QFont::Bold );
- zip->setGeometry( xpos, ypos, smallColumn, rowHeight );
-
- xpos += smallColumn + spacing;
-
- le_zip = us_lineedit( "" );
- le_zip->setGeometry( xpos, ypos, mediumColumn, rowHeight );
- connect( le_zip, SIGNAL( textChanged( const QString& ) ),
- SLOT ( update_zip ( const QString& ) ) );
-
- // Row 6 - Phone/License Type/Version
- xpos = spacing;
- ypos += rowHeight + spacing;
+ //xpos = spacing;
+ // ypos += rowHeight + spacing;
- QLabel* phone = us_label( tr( "Phone Number:" ), 0, QFont::Bold );
- phone->setGeometry( xpos, ypos, buttonw, rowHeight );
-
- xpos += spacing + buttonw;
+ // xpos += spacing + buttonw;
- le_phone = us_lineedit( "" );;
- le_phone->setGeometry( xpos, ypos, buttonw, rowHeight );
- connect( le_phone, SIGNAL( textChanged ( const QString& ) ),
- SLOT ( update_phone( const QString& ) ) );
-
- xpos += buttonw + spacing;
+ // xpos += buttonw + spacing;
QLabel* lb_licensetype = us_label( tr( "License:" ), 0, QFont::Bold );
lb_licensetype->setGeometry( xpos, ypos, smallColumn, rowHeight );
@@ -179,13 +146,8 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
connect( cbb_licensetype, SIGNAL( currentIndexChanged( const QString& ) ),
SLOT ( update_licensetype ( const QString& ) ) );
- xpos += mediumColumn + spacing + 10; // Adjust
-
- lbl_version = us_label( tr( "Version:" ), 0, QFont::Bold );
- lbl_version->setGeometry( xpos, ypos, smallColumn, rowHeight );
-
xpos = spacing;
- ypos += 2 * rowHeight + spacing;
+ ypos += rowHeight + spacing;
QLabel* status = us_banner( tr( "License Status" ) );
status->setGeometry( QRect( xpos, ypos, width, spacing + rowHeight ) );
@@ -211,7 +173,7 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
// Row 8 - Expiration
xpos = spacing;
- ypos += rowHeight + 2 * spacing;
+ ypos += rowHeight + spacing;
lbl_expiration = us_label( "Expiration:", 0, QFont::Bold );
lbl_expiration->setGeometry( xpos, ypos, buttonw, rowHeight );
@@ -225,7 +187,7 @@ US_License::US_License( QWidget* parent, Qt::WindowFlags flags )
// Row 9 - Version
xpos = spacing;
- ypos += rowHeight + 2 * spacing;
+ ypos += rowHeight + spacing;
lbl_valid = us_label( "UltraScan III Version:", 0, QFont::Bold );
lbl_valid->setGeometry( xpos, ypos, buttonw, rowHeight );
@@ -313,11 +275,11 @@ void US_License::load_current( void )
lastname = "";
firstname = "";
institution = "";
- address = "";
+ address = "n/a";
city = "";
state = "NON-US";
- zip = "";
- phone = "";
+ zip = "n/a";
+ phone = "n/a";
email = "";
version = US_Version; // us_defines.h
validation = "";
@@ -358,10 +320,7 @@ void US_License::update_screen( void )
le_firstname ->setText( firstname );
le_lastname ->setText( lastname );
le_institution ->setText( institution );
- le_address ->setText( address );
le_city ->setText( city );
- le_zip ->setText( zip );
- le_phone ->setText( phone );
le_email ->setText( email );
le_platform ->setText( platform + " / " + os );
@@ -431,10 +390,8 @@ void US_License::update( void )
if ( firstname == "" ||
lastname == "" ||
institution == "" ||
- address == "" ||
state == "" ||
zip == "" ||
- phone == "" ||
email == "" )
{
QMessageBox::information ( this,
@@ -493,7 +450,7 @@ void US_License::update( void )
+ "&licensetype=" + licensetype;
//qDebug() << "requesting update";
// Send request
- QString url = "https://ultrascan.aucsolutions.com/update-license.php";
+ QString url = "https://ultrascan.aucsolutions.com/update-license-new.php";
US_HttpPost* transmit = new US_HttpPost( url, req );
connect( transmit, SIGNAL( US_Http_post_response( const QString& ) ),
this, SLOT ( update_response ( const QString& ) ) );
diff --git a/gui/us_license.h b/gui/us_license.h
index 91f41e76e..d780b5ed1 100644
--- a/gui/us_license.h
+++ b/gui/us_license.h
@@ -72,10 +72,7 @@ class US_GUI_EXTERN US_License : public US_Widgets
QLineEdit* le_firstname;
QLineEdit* le_lastname;
QLineEdit* le_institution;
- QLineEdit* le_address;
QLineEdit* le_city;
- QLineEdit* le_zip;
- QLineEdit* le_phone;
QLineEdit* le_email;
QLineEdit* le_platform;
QLineEdit* le_expiration;
@@ -114,11 +111,8 @@ class US_GUI_EXTERN US_License : public US_Widgets
void update_firstname ( const QString& s ){ firstname = trim( s ); };
void update_lastname ( const QString& s ){ lastname = trim( s ); };
void update_institution( const QString& s ){ institution = trim( s ); };
- void update_address ( const QString& s ){ address = trim( s ); };
void update_city ( const QString& s ){ city = trim( s ); };
void update_state ( const QString& s ){ state = trim( s ); };
- void update_zip ( const QString& s ){ zip = trim( s ); };
- void update_phone ( const QString& s ){ phone = trim( s ); };
void update_email ( const QString& s ){ email = trim( s ); };
void update_licensetype( const QString& s ){ licensetype = trim( s ); };
};
From 15eb3360f877fb8f22023b2d5683c7a994362745 Mon Sep 17 00:00:00 2001
From: samo38
Date: Wed, 2 Oct 2024 14:17:11 -0600
Subject: [PATCH 12/32] us_archive: add the extract(const QString&, const
QString&) function. Edit the doc strings.
---
utils/us_archive.cpp | 6 ++++++
utils/us_archive.h | 22 ++++++++++++++--------
2 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
index 7df0981e0..8cc0df9ad 100644
--- a/utils/us_archive.cpp
+++ b/utils/us_archive.cpp
@@ -100,6 +100,12 @@ bool US_Archive::extract(const QString& filename) {
return true;
}
+bool US_Archive::extract(const QString& filename, const QString& path) {
+ setPath(path);
+ bool result = extract(filename);
+ return result;
+}
+
bool US_Archive::compress(const QStringList& list, QString& filename) {
absolute_paths.clear();
relative_paths.clear();
diff --git a/utils/us_archive.h b/utils/us_archive.h
index 299d0a895..8cc5e25bd 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -14,20 +14,26 @@ class US_UTIL_EXTERN US_Archive : public QObject
US_Archive() {};
//! \brief Method to extract archive file (Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip).
- //! \param filename Path to archive file. Output directory is taken from the path of the archive file unless it is set directly using setPath() method.
- //! \return A boolean to verify the success of the extraction
+ //! \param archivePath Path to the archive file. Extracted data path is taken from the the archive file path unless it is set directly using setPath() method.
+ //! \return True if file extraction is completed, false otherwise.
bool extract(const QString&);
+ //! \brief Method to extract archive file (Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip).
+ //! \param archivePath Path to the archive file.
+ //! \param outputPath Path to where the extracted data will be saved.
+ //! \return True if file extraction is completed, false otherwise.
+ bool extract(const QString&, const QString&);
+
//! \brief Method to compress files and folders into an archive file.
- //! \param list list of all files and folders need to be compressed.
- //! \param filename The output archive filename. The output path is taken from the path of the first item.
- //! After compression is complete, this parameter stores the path of the archive file.
+ //! \param sourcePathList List of all files and folders need to be compressed. No need to put the contents of each folder. This program finds them recursively.
+ //! \param archiveFilename Archive filename. The output path is taken from the first item.
+ //! After compression is complete, this parameter stores the path to the archive file.
//! Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
- //! \return A boolean to verify the success of the compression
+ //! \return True if compression is completed, false otherwise.
bool compress(const QStringList&, QString&);
- //! \brief Method to set the path to store extracted data.
- //! \param Path
+ //! \brief Method to set the path where the extracted data will be saved.
+ //! \param outputPath
void setPath(const QString&);
//! \brief Method to receive the error string.
From 61e26bc8ab2104fea870c28718c0a56de365d8f9 Mon Sep 17 00:00:00 2001
From: samo38
Date: Wed, 2 Oct 2024 14:19:19 -0600
Subject: [PATCH 13/32] us_legacy_converter: used the latest version of the
US_Archive. Show files when they're extracted in the text edit widget
---
.../us_legacy_converter.cpp | 127 ++++--------------
.../us_legacy_converter/us_legacy_converter.h | 14 +-
2 files changed, 36 insertions(+), 105 deletions(-)
diff --git a/programs/us_legacy_converter/us_legacy_converter.cpp b/programs/us_legacy_converter/us_legacy_converter.cpp
index 1c2345e0d..4d72eb056 100644
--- a/programs/us_legacy_converter/us_legacy_converter.cpp
+++ b/programs/us_legacy_converter/us_legacy_converter.cpp
@@ -85,12 +85,16 @@ US_LegacyConverter::US_LegacyConverter() : US_Widgets()
layout->setSpacing(2);
this->setLayout(layout);
+ archive = new US_Archive();
+ counter = 0;
+
connect(pb_load, &QPushButton::clicked, this, &US_LegacyConverter::load);
connect(pb_reload, &QPushButton::clicked, this, &US_LegacyConverter::reload);
connect(le_runid, &US_LineEdit_RE::textUpdated, this, &US_LegacyConverter::runid_updated);
connect(le_dir, &QLineEdit::textChanged, this, &US_LegacyConverter::runid_updated);
connect(pb_save, &QPushButton::clicked, this, &US_LegacyConverter::save_auc);
connect(ct_tolerance, &QwtCounter::valueChanged, this, &US_LegacyConverter::new_tolerance);
+ connect(archive, &US_Archive::itemExtracted, this, &US_LegacyConverter::itemExtracted);
}
void US_LegacyConverter::new_tolerance(double){
@@ -198,89 +202,6 @@ void US_LegacyConverter::load() {
reload();
}
-// bool US_LegacyConverter::extract_files(const QString& tarfile, const QString& savepath) {
-
-// QFileInfo finfo(tarfile);
-// QString ost;
-// #ifdef Q_OS_LINUX
-// ost = "LINUX";
-// #elif defined ( Q_OS_MACOS )
-// ost = "MACOS";
-// #elif defined ( Q_OS_WINDOWS )
-// ost = "WINDOWS";
-// #else
-// ost = "NONE";
-// #endif
-
-// QString sys_tar;
-// if (ost.compare("WINDOWS") == 0) {
-// sys_tar = QDir(QCoreApplication::applicationDirPath()).filePath("tar.exe");
-// if (! QFileInfo::exists(sys_tar) || ! QFileInfo(sys_tar).isExecutable()) {
-// QMessageBox::warning(this, "Error!", "TAR program is not found in the following path!\n" + sys_tar);
-// sys_tar.clear();
-// return false;
-// }
-// } else if (ost.compare("MACOS") == 0 || ost.compare("LINUX") == 0){
-// sys_tar = "tar";
-// } else {
-// QMessageBox::warning(this, "Error!", "This program only supports the MS Windows, macOS, and Linux!");
-// return false;
-// }
-// te_info->append("Process: starting to extract the loaded file using the system tar program ...");
-// qApp->processEvents();
-// QStringList tarr_args;
-// tarr_args << "-zxf" << finfo.absoluteFilePath() << "-C" << savepath;
-// int state = QProcess::execute(sys_tar, tarr_args);
-// if (state == -2) {
-// QString mesg = tr("The process of extracting the tar file cannot start!\n%1 %2\n\n"
-// "Starting to use the internal methods!");
-// QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
-// } else if (state == -1) {
-// QString mesg = tr("The process of extracting the tar file crashed!\n%1 %2\n\n"
-// "Starting to use the internal methods!");
-// QMessageBox::warning(this, "Warning!", mesg.arg(sys_tar, tarr_args.join(" ")));
-// } else if (state == 0) {
-// return true;
-// } else {
-// QString mesg = tr("Extracting the tar file failed with the return value of %1!\n%2%3\n\n"
-// "Starting to use the internal methods!");
-// QMessageBox::warning(this, "Warning!", mesg.arg(state).arg(sys_tar, tarr_args.join(" ")));
-// }
-
-// QString tmpfile = QDir(savepath).filePath("data.tar.gz");
-
-// if (QFile::copy(tarfile, tmpfile)) {
-// US_Gzip gzip;
-// te_info->append("Process: starting to unzip the file using the US_Gzip program ...");
-// qApp->processEvents();
-
-// state = gzip.gunzip(tmpfile);
-// if (state != 0) {
-// QMessageBox::warning(this, "Error!", "Failed to unzip the file!\n" +
-// gzip.explain(state));
-// return false;
-// }
-// tmpfile.chop(3);
-// // qDebug() << tmpfile;
-// te_info->append("Process: starting to extract the tar file using the US_Tar program ...");
-// qApp->processEvents();
-// US_Tar ustar;
-// QStringList extlist;
-// state = ustar.extract(tmpfile, &extlist, savepath);
-// if (state != 0) {
-// QMessageBox::warning(this, "Error!", "FAILED to extract the file!\n" +
-// ustar.explain(state));
-// return false;
-// }
-// } else {
-// QMessageBox::warning(this, "Error!", tr("FAILED to copy the file to the /tmp directory!"));
-// return false;
-// }
-// return true;
-
-// }
-
-
void US_LegacyConverter::reload() {
reset();
le_load->clear();
@@ -289,7 +210,7 @@ void US_LegacyConverter::reload() {
QRegularExpressionMatch match;
te_info->clear();
- te_info->append("Parsing Data. Please Wait!");
+ te_info->append("Extracting archive file. Please Wait!");
te_info->moveCursor(QTextCursor::End);
qApp->setOverrideCursor(QCursor(Qt::WaitCursor));
qApp->processEvents();
@@ -313,16 +234,21 @@ void US_LegacyConverter::reload() {
if (tmp_dir.isValid()) {
QString fpath = tar_finfo.absoluteFilePath();
QString opath = tmp_dir.path();
- QString error;
- bool ok = US_Archive::extract(fpath, &opath, &error);
+ bool ok = archive->extract(fpath, opath);
te_info->append("Process: Extracting file ...");
qApp->processEvents();
if (! ok) {
- te_info->append("Failed to exctract the file: " + tar_finfo.absoluteFilePath());
+ te_info->clear();
+ te_info->append( tr("Failed to exctract the file: %1 \n").arg(tar_finfo.absoluteFilePath()) );
+ te_info->append(archive->getError());
tar_fpath.clear();
qApp->restoreOverrideCursor();
return;
}
+ te_info->clear();
+ te_info->append("Parsing Data. Please Wait!");
+ counter = 0;
+ qApp->processEvents();
runid = tar_finfo.fileName().chopped(7);
} else {
QMessageBox::warning(this, "Error!", tr("FAILED to create a /tmp directory!"));
@@ -371,18 +297,14 @@ void US_LegacyConverter::reload() {
void US_LegacyConverter::list_files(const QString& path, QStringList& flist) {
QDir dir(path);
- QStringList filter;
- QStringList tmp_list = dir.entryList(QStringList({"*"}), QDir::Files | QDir::NoSymLinks);
- foreach (const QString& fname, tmp_list) {
- QFileInfo fileInfo(dir.absoluteFilePath(fname));
- flist.append(fileInfo.absoluteFilePath());
- }
-
- // Recursively process subdirectories
- QStringList subdirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoDotAndDotDot | QDir::NoSymLinks);
- foreach (const QString& subdir, subdirs) {
- QString subdirPath = dir.absoluteFilePath(subdir);
- list_files(subdirPath, flist);
+ QDir::Filters filter = QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot | QDir::NoDotAndDotDot | QDir::NoSymLinks;
+ QFileInfoList info_list = dir.entryInfoList(filter);
+ foreach (const QFileInfo item, info_list) {
+ if (item.isDir()) {
+ list_files(item.absoluteFilePath(), flist);
+ } else {
+ flist << item.absoluteFilePath();
+ }
}
}
@@ -503,3 +425,10 @@ bool US_LegacyConverter::read_beckman_files(const QString& path, QString& status
qDebug().noquote() << status;
return true;
}
+
+
+void US_LegacyConverter::itemExtracted(const QString& relative, const QString&) {
+ te_info->append(relative);
+ if ( counter % 10 == 0) qApp->processEvents();
+ counter++;
+}
diff --git a/programs/us_legacy_converter/us_legacy_converter.h b/programs/us_legacy_converter/us_legacy_converter.h
index 72eeae530..e48f668e4 100644
--- a/programs/us_legacy_converter/us_legacy_converter.h
+++ b/programs/us_legacy_converter/us_legacy_converter.h
@@ -6,6 +6,7 @@
#include "us_widgets.h"
#include "us_dataIO.h"
#include "us_settings.h"
+#include "us_archive.h"
// #include "us_tar.h"
// #include "us_gzip.h"
#include "../us_convert/us_convert.h"
@@ -35,6 +36,8 @@ class US_LegacyConverter : public US_Widgets
QPushButton *pb_save; //!< Button to save data
US_LineEdit_RE *le_runid; //!< Line edit for run ID with regular expression validation
QLineEdit *le_dir; //!< Line edit for directory
+ US_Archive* archive; //!< Archive object
+ int counter; //!< counter to update test edit
//! \brief Resets the converter to its initial state
void reset(void);
@@ -60,12 +63,6 @@ class US_LegacyConverter : public US_Widgets
//! \return true if reading is successful, false otherwise
bool read_beckman_files(const QString& filepath, QString& data);
- //! \brief Extracts files from a TAR archive
- //! \param tarpath Path to the TAR archive
- //! \param extractpath Path to extract the files to
- //! \return true if extraction is successful, false otherwise
- // bool extract_files(const QString& tarpath, const QString& extractpath);
-
private slots:
//! \brief Slot to load data
void load(void);
@@ -82,6 +79,11 @@ class US_LegacyConverter : public US_Widgets
//! \brief Slot to update tolerance
//! \param tolerance New tolerance value
void new_tolerance(double tolerance);
+
+ //! \brief Slot to update text edit when a file extracted from the archive file
+ //! \param relative path
+ //! \param absolute path
+ void itemExtracted(const QString&, const QString&);
};
#endif // US_LEGACY_CONVERTER
From d8e2ff4f514e7aebe80bc30c106fd25b21a3a866 Mon Sep 17 00:00:00 2001
From: doluk <69309597+doluk@users.noreply.github.com>
Date: Thu, 3 Oct 2024 17:25:10 +0200
Subject: [PATCH 14/32] Force old informations to n/a
Signed-off-by: doluk <69309597+doluk@users.noreply.github.com>
---
gui/us_license.cpp | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/gui/us_license.cpp b/gui/us_license.cpp
index a3774bbe1..c5226249f 100644
--- a/gui/us_license.cpp
+++ b/gui/us_license.cpp
@@ -311,6 +311,10 @@ void US_License::load_current( void )
validation = license [ 12 ];
expiration = license [ 13 ];
}
+ // Force unused fields to "n/a"
+ address = "n/a";
+ zip = "n/a";
+ phone = "n/a";
update_screen();
}
@@ -391,7 +395,6 @@ void US_License::update( void )
lastname == "" ||
institution == "" ||
state == "" ||
- zip == "" ||
email == "" )
{
QMessageBox::information ( this,
From f7f56c7b1b716c511bd945b5689cbd17c4b377ba Mon Sep 17 00:00:00 2001
From: samo38
Date: Thu, 3 Oct 2024 18:47:38 -0600
Subject: [PATCH 15/32] us_archive: complete extract and compress functions to
support relative and absolute paths
---
utils/us_archive.cpp | 41 ++++++++++++++++++++++-------------------
utils/us_archive.h | 19 ++++---------------
2 files changed, 26 insertions(+), 34 deletions(-)
diff --git a/utils/us_archive.cpp b/utils/us_archive.cpp
index 8cc0df9ad..1cd773db8 100644
--- a/utils/us_archive.cpp
+++ b/utils/us_archive.cpp
@@ -2,12 +2,17 @@
#include "archive_entry.h"
#include "archive.h"
-bool US_Archive::extract(const QString& filename) {
+bool US_Archive::extract(const QString& filename, const QString& path) {
QDir dir;
- if (outpath.isEmpty()) {
- QFileInfo fino(filename);
+ QFileInfo fino(filename);
+ QString outpath = path.trimmed();
+ if (outpath.isEmpty() || outpath.compare(".") == 0) {
+ dir.setPath(fino.absolutePath());
+ } else if (outpath.startsWith("..")) {
dir.setPath(fino.absolutePath());
+ QString p = dir.absoluteFilePath(outpath);
+ dir.setPath(p);
} else {
dir.setPath(outpath);
}
@@ -100,15 +105,13 @@ bool US_Archive::extract(const QString& filename) {
return true;
}
-bool US_Archive::extract(const QString& filename, const QString& path) {
- setPath(path);
- bool result = extract(filename);
- return result;
-}
-
bool US_Archive::compress(const QStringList& list, QString& filename) {
absolute_paths.clear();
relative_paths.clear();
+ if (list.isEmpty()) {
+ error = "US_Archive: Error: Empty list";
+ return false;
+ }
struct archive *archive;
archive = archive_write_new();
@@ -117,6 +120,16 @@ bool US_Archive::compress(const QStringList& list, QString& filename) {
QFileInfo finfo;
finfo.setFile(filename);
QString extention = finfo.completeSuffix();
+ QDir dir;
+ if (finfo.path().compare(".") == 0 || finfo.path().startsWith("..")) {
+ finfo.setFile(list.first());
+ finfo.makeAbsolute();
+ dir.setPath(finfo.absolutePath());
+ } else {
+ dir.setPath(finfo.absolutePath());
+ }
+ dir.makeAbsolute();
+ filename = dir.absoluteFilePath(filename);
// Check archive format
int result;
@@ -157,7 +170,6 @@ bool US_Archive::compress(const QStringList& list, QString& filename) {
return false;
}
- QDir dir;
// List all files and directories
for (int ii = 0; ii < list.size(); ii++) {
finfo.setFile(list.at(ii));
@@ -169,9 +181,6 @@ bool US_Archive::compress(const QStringList& list, QString& filename) {
archive_write_free(archive);
return false;
}
- if (ii == 0) {
- dir.setPath(finfo.absolutePath());
- }
if (finfo.isFile()) {
absolute_paths << absolute;
relative_paths << relative;
@@ -186,8 +195,6 @@ bool US_Archive::compress(const QStringList& list, QString& filename) {
}
// Create archive file
- dir.makeAbsolute();
- filename = dir.absoluteFilePath(filename);
result = archive_write_open_filename(archive, filename.toUtf8().constData());
if (result != ARCHIVE_OK) {
error = QObject::tr("US_Archive: Error: Failed to create archive file: %1").arg(archive_error_string(archive));
@@ -252,10 +259,6 @@ void US_Archive::list_files(const QString& abs_path, const QString& base_dir) {
}
}
-void US_Archive::setPath(const QString& path) {
- outpath = path;
-}
-
QString US_Archive::getError() {
return error;
}
diff --git a/utils/us_archive.h b/utils/us_archive.h
index 8cc5e25bd..09cd25e7a 100644
--- a/utils/us_archive.h
+++ b/utils/us_archive.h
@@ -13,29 +13,20 @@ class US_UTIL_EXTERN US_Archive : public QObject
public:
US_Archive() {};
- //! \brief Method to extract archive file (Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip).
- //! \param archivePath Path to the archive file. Extracted data path is taken from the the archive file path unless it is set directly using setPath() method.
- //! \return True if file extraction is completed, false otherwise.
- bool extract(const QString&);
-
//! \brief Method to extract archive file (Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip).
//! \param archivePath Path to the archive file.
- //! \param outputPath Path to where the extracted data will be saved.
+ //! \param outputPath Path to where extracted data will be saved. Default is the path where the archive file is located.
//! \return True if file extraction is completed, false otherwise.
- bool extract(const QString&, const QString&);
+ bool extract(const QString&, const QString& = "");
//! \brief Method to compress files and folders into an archive file.
- //! \param sourcePathList List of all files and folders need to be compressed. No need to put the contents of each folder. This program finds them recursively.
- //! \param archiveFilename Archive filename. The output path is taken from the first item.
+ //! \param sourcePathList List of all files and folders need to be compressed. No need to list the contents of folders.
+ //! \param archivePath If only the filename is given, the output path is taken from the first one. Otherwise, the archive file will be saved in the given path.
//! After compression is complete, this parameter stores the path to the archive file.
//! Supported files: tar, tar.gz, tgz, tar.bz2, tar.xz, .zip
//! \return True if compression is completed, false otherwise.
bool compress(const QStringList&, QString&);
- //! \brief Method to set the path where the extracted data will be saved.
- //! \param outputPath
- void setPath(const QString&);
-
//! \brief Method to receive the error string.
//! \return Error string.
QString getError();
@@ -52,8 +43,6 @@ class US_UTIL_EXTERN US_Archive : public QObject
void itemAdded (const QString&, const QString&);
private:
-
- QString outpath;
QString error;
QStringList absolute_paths;
QStringList relative_paths;
From d76493bb67e6d230300113a521794573dfc433ba Mon Sep 17 00:00:00 2001
From: samo38
Date: Thu, 3 Oct 2024 18:53:43 -0600
Subject: [PATCH 16/32] edit docker files to support libarchive
---
admin/codeql/docker/docker/Dockerfile | 1 +
admin/codeql/docker/dockerdev/Dockerfile | 1 +
admin/release/centos7/Dockerfile | 1 +
admin/release/redhat/Dockerfile | 1 +
admin/release/ubuntu/Dockerfile | 1 +
5 files changed, 5 insertions(+)
diff --git a/admin/codeql/docker/docker/Dockerfile b/admin/codeql/docker/docker/Dockerfile
index 6ea3bd1a8..d6c7ff194 100644
--- a/admin/codeql/docker/docker/Dockerfile
+++ b/admin/codeql/docker/docker/Dockerfile
@@ -23,6 +23,7 @@ RUN apt-get install -y xorg
RUN apt-get install -y x11-apps
RUN apt-get install -y telnet
RUN apt-get install -y cmake
+RUN apt-get install -y libarchive-dev
# qt
RUN apt-get install -y qtbase5-dev
diff --git a/admin/codeql/docker/dockerdev/Dockerfile b/admin/codeql/docker/dockerdev/Dockerfile
index e346e29dc..5b9f55e10 100644
--- a/admin/codeql/docker/dockerdev/Dockerfile
+++ b/admin/codeql/docker/dockerdev/Dockerfile
@@ -23,6 +23,7 @@ RUN apt-get install -y xorg
RUN apt-get install -y x11-apps
RUN apt-get install -y telnet
RUN apt-get install -y cmake
+RUN apt-get install -y libarchive-dev
# qt
RUN apt-get install -y qtbase5-dev
diff --git a/admin/release/centos7/Dockerfile b/admin/release/centos7/Dockerfile
index 872eed3a0..39495d5ce 100644
--- a/admin/release/centos7/Dockerfile
+++ b/admin/release/centos7/Dockerfile
@@ -49,6 +49,7 @@ RUN yum install -y telnet
RUN yum install -y $apt_python_version
RUN yum install -y rsync
RUN yum install -y glib2-devel postgresql-devel at-spi2-core-devel libjpeg-devel fontconfig-devel
+RUN yum install -y libarchive-devel
# bits to ease development/testing
diff --git a/admin/release/redhat/Dockerfile b/admin/release/redhat/Dockerfile
index d2eda3a87..a62e97172 100644
--- a/admin/release/redhat/Dockerfile
+++ b/admin/release/redhat/Dockerfile
@@ -49,6 +49,7 @@ RUN dnf install -y telnet
RUN dnf install -y $apt_python_version
RUN dnf install -y rsync
RUN dnf install -y glib2-devel postgresql-devel at-spi2-core-devel libjpeg-devel fontconfig-devel
+RUN dnf install -y libarchive-devel
# bits to ease development/testing
diff --git a/admin/release/ubuntu/Dockerfile b/admin/release/ubuntu/Dockerfile
index 22065b5e9..3cb881638 100644
--- a/admin/release/ubuntu/Dockerfile
+++ b/admin/release/ubuntu/Dockerfile
@@ -49,6 +49,7 @@ RUN apt-get install -y x11-apps
RUN apt-get install -y telnet
RUN apt-get install -y $apt_python_version
RUN apt-get install -y rsync
+RUN apt-get install -y libarchive-dev
# bits to ease development/testing
From bc28ebca485fb06340124a73e1ac3ce508882c2f Mon Sep 17 00:00:00 2001
From: samo38
Date: Sat, 5 Oct 2024 19:39:44 -0600
Subject: [PATCH 17/32] add apt-get install -y libarchive to the github codeql
workflow
---
.github/workflows/codeql-analysis.yml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 840ebcfaa..6d5e5e336 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -45,6 +45,9 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
+ - name: Install libarchive
+ run: |
+ apt-get install -y libarchive-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
From f91ca5b30bcbc823ee76f28a2f9b95928cd82a90 Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 7 Oct 2024 08:58:25 -0600
Subject: [PATCH 18/32] codeql-analysis: add libarchive to analyze-gui,
analyze-somo
---
.github/workflows/codeql-analysis.yml | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 6d5e5e336..efdbb9e54 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -86,6 +86,9 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
+ - name: Install libarchive
+ run: |
+ apt-get install -y libarchive-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
@@ -135,6 +138,9 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
+ - name: Install libarchive
+ run: |
+ apt-get install -y libarchive-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
From c11cb7ea31b7f66e946b99b723d2245ca627cc5d Mon Sep 17 00:00:00 2001
From: samo38
Date: Mon, 7 Oct 2024 13:05:50 -0600
Subject: [PATCH 19/32] removed libarchive from somo codeql workflow
---
.github/workflows/codeql-analysis.yml | 3 ---
1 file changed, 3 deletions(-)
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index efdbb9e54..8fed56a9f 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -138,9 +138,6 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v4
- - name: Install libarchive
- run: |
- apt-get install -y libarchive-dev
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
From f92b0c167a9f52a8de78ffa94f069a456f5acff7 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Thu, 10 Oct 2024 23:50:06 -0500
Subject: [PATCH 20/32] for issue 557...
---
programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
index e5b3b3666..62f76e914 100644
--- a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
+++ b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
@@ -151,8 +151,8 @@ void US_auditTrailGMP::loadGMPReport( void )
//read 'data' .tar.gz for autoflowGMPReport record:
if ( gmpReport_runname_selected_c. contains("combined") )
{
- gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0];
- gmpReport_runname_selected. simplified();
+ gmpReport_runname_selected = gmpReport_runname_selected_c.split("(")[0]. simplified();
+ //gmpReport_runname_selected. simplified();
}
else
gmpReport_runname_selected = gmpReport_runname_selected_c;
From 0bea2c36c753806284e4f32f42dca1c9203690e0 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Sun, 13 Oct 2024 04:34:57 -0500
Subject: [PATCH 21/32] GMP & ProtocolDev : additions to issue #365; some other
related 4bugs noticed fixed ...
---
.../us_audit_trail_gmp/us_audit_trail_gmp.cpp | 2 +-
.../us_com_project/us_com_project_gui.cpp | 3 +-
programs/us_edit/us_edit.cpp | 2 +-
.../us_protocol_dev/us_protocol_dev_gui.cpp | 84 +++++++++++++++++++
.../us_protocol_dev/us_protocol_dev_gui.h | 4 +-
5 files changed, 91 insertions(+), 4 deletions(-)
diff --git a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
index 62f76e914..ea13c7a0e 100644
--- a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
+++ b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
@@ -171,7 +171,7 @@ void US_auditTrailGMP::loadGMPReport( void )
AProfileGUID = p_details[ "aprofileguid" ];
qDebug() << "AProfileGUID: " << AProfileGUID;
- p_details[ "gmp_runname" ] = gmpReport_runname_selected_c;
+ p_details[ "gmp_runname" ] = gmpReport_runname_selected;
initPanel_auto( p_details );
// Print PDF && enable View:
diff --git a/programs/us_com_project/us_com_project_gui.cpp b/programs/us_com_project/us_com_project_gui.cpp
index d47ea2c2c..cd2c563ea 100644
--- a/programs/us_com_project/us_com_project_gui.cpp
+++ b/programs/us_com_project/us_com_project_gui.cpp
@@ -2044,7 +2044,8 @@ void US_InitDialogueGui::do_create_autoflowStatus_for_failedRun( QMap < QString,
qDebug() << "[FAILED run init]: new_autoflowStatusGMPCreate_record qry -- " << qry;
- int autoflowStatusID = db->functionQuery( qry );
+ int autoflowStatusID = 0;
+ autoflowStatusID = db->functionQuery( qry );
if ( !autoflowStatusID )
{
diff --git a/programs/us_edit/us_edit.cpp b/programs/us_edit/us_edit.cpp
index dfc74f66a..a7a5246d4 100644
--- a/programs/us_edit/us_edit.cpp
+++ b/programs/us_edit/us_edit.cpp
@@ -3852,7 +3852,7 @@ double US_Edit::find_meniscus_auto()
//int indexRight = data.xindex( range_right );
//ALEXEY: maybe to be on safer side, take indexRight = meniscus_init + ( aprofile_right - meniscus_init )/2.0!!!
- int indexRight = data.xindex( meniscus_init + ( range_right - meniscus_init )/2.0 );
+ int indexRight = data.xindex( meniscus_init + ( range_right - meniscus_init )/1.5 );
qDebug() << "data.xindex( range_right ) = " << data.xindex( range_right );
qDebug() << "indexLeft = " << indexLeft << "; indexRight = " << indexRight;
diff --git a/programs/us_protocol_dev/us_protocol_dev_gui.cpp b/programs/us_protocol_dev/us_protocol_dev_gui.cpp
index 4aee70eb1..31cb34dd0 100644
--- a/programs/us_protocol_dev/us_protocol_dev_gui.cpp
+++ b/programs/us_protocol_dev/us_protocol_dev_gui.cpp
@@ -1174,6 +1174,9 @@ void US_InitDialogueGui::initRecordsDialogue( void )
do_run_tables_cleanup( protocol_details );
do_run_data_cleanup( protocol_details );
+
+ //Create fresh autoflowStatus record with the submitter person info & timestamp:
+ do_create_autoflowStatus_for_failedRun( protocol_details );
//Switch to 2. LIVE_UPDATE:
emit switch_to_live_update_init( protocol_details );
@@ -1369,6 +1372,87 @@ void US_InitDialogueGui::do_run_tables_cleanup( QMap < QString, QString > run_de
}
+
+//Create fresh autofowStatus record: failed run re-init
+void US_InitDialogueGui::do_create_autoflowStatus_for_failedRun( QMap < QString, QString > run_details )
+{
+ // Check DB connection
+ US_Passwd pw;
+ QString masterpw = pw.getPasswd();
+ US_DB2* db = new US_DB2( masterpw );
+
+ if ( db->lastErrno() != US_DB2::OK )
+ {
+ QMessageBox::warning( this, tr( "Connection Problem: Failed Run Cleanup" ),
+ tr( "Read protocol: Could not connect to database \n" ) + db->lastError() );
+ return;
+ }
+
+ QStringList qry;
+
+ //first, get current user (submitter) info
+ qry.clear();
+ qry << QString( "get_user_info" );
+ db -> query( qry );
+ db -> next();
+ int u_ID = db->value( 0 ).toInt();
+ QString u_fname = db->value( 1 ).toString();
+ QString u_lname = db->value( 2 ).toString();
+ QString u_email = db->value( 4 ).toString();
+ int u_level = db->value( 5 ).toInt();
+
+ //autoflowStatus record
+ QString createGMPRun_Json;
+ createGMPRun_Json. clear();
+ createGMPRun_Json += "{ \"Person\": ";
+
+ createGMPRun_Json += "[{";
+ createGMPRun_Json += "\"ID\":\"" + QString::number( u_ID ) + "\",";
+ createGMPRun_Json += "\"fname\":\"" + u_fname + "\",";
+ createGMPRun_Json += "\"lname\":\"" + u_lname + "\",";
+ createGMPRun_Json += "\"email\":\"" + u_email + "\",";
+ createGMPRun_Json += "\"level\":\"" + QString::number( u_level ) + "\"";
+ createGMPRun_Json += "}],";
+
+ //createGMPRun_Json += "\"Comment\": \"" + gmp_submitter_map[ "Comment:" ] + "\"";
+ QString resubComm = tr("Resubmitting Failed GMP Run");
+ createGMPRun_Json += "\"Comment\": \"" + resubComm + "\"";
+
+ createGMPRun_Json += "}";
+
+ qry. clear();
+ qry << "new_autoflowStatusGMPCreate_record"
+ << run_details[ "autoflowID" ]
+ << createGMPRun_Json;
+
+ qDebug() << "[FAILED run init]: new_autoflowStatusGMPCreate_record qry -- " << qry;
+
+ int autoflowStatusID = 0;
+ autoflowStatusID = db->functionQuery( qry );
+
+ if ( !autoflowStatusID )
+ {
+ QMessageBox::warning( this, tr( "AutoflowStatus Record Problem" ),
+ tr( "autoflowStatus (FAILED GMP run re-INIT): "
+ "There was a problem with creating a record in autoflowStatus table \n" ) + db->lastError() );
+
+ return;
+ }
+ qDebug() << "in do_create_autoflowStatus_for_failedRun: createGMPRun_Json -- " << createGMPRun_Json;
+
+ run_details[ "statusID" ] = QString::number( autoflowStatusID );
+
+ /************** finally, update autoflow record with StatusID: ****************/
+ qry. clear();
+ qry << "update_autoflow_with_statusID"
+ << run_details[ "autoflowID" ]
+ << QString::number( autoflowStatusID );
+
+ qDebug() << "[FAILED run init]: update_autoflow_with_statusID qry -- " << qry;
+ db->query( qry );
+
+}
+
//Read channel-to-ref_wvl info from AProfile
bool US_InitDialogueGui::readAProfileBasicParms_auto( QXmlStreamReader& xmli )
{
diff --git a/programs/us_protocol_dev/us_protocol_dev_gui.h b/programs/us_protocol_dev/us_protocol_dev_gui.h
index 0bfcca7e9..e0951d0cb 100644
--- a/programs/us_protocol_dev/us_protocol_dev_gui.h
+++ b/programs/us_protocol_dev/us_protocol_dev_gui.h
@@ -204,7 +204,9 @@ class US_InitDialogueGui : public US_WidgetsDialog
* \param run_data The run data to clean up.
*/
void do_run_data_cleanup( QMap< QString, QString > run_data );
-
+
+ void do_create_autoflowStatus_for_failedRun( QMap< QString, QString > );
+
/**
* \brief Reads the basic parameters of the profile automatically.
* \param xml_reader The XML stream reader.
From 0c2054f62f010f8a436da67effceb399bc8ef3c7 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Thu, 17 Oct 2024 18:34:40 -0500
Subject: [PATCH 22/32] GMP : UTC time in report -- except header, real changes
are in SQL (to be bound to this issue)...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index e64a56a95..65ef2e882 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -6316,7 +6316,7 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
""
""
- " Initiated at: %1 | "
+ " Initiated at: %1 (UTC) | "
"
"
"
"
)
@@ -6407,7 +6407,7 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
""
""
" Type: %1 | "
- " Performed at: %2 | "
+ " Performed at: %2 (UTC) | "
"
"
"
"
)
@@ -6513,7 +6513,7 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
""
""
" Ref. Scan Method: %1 | "
- " Data Saved at: %2 | "
+ " Data Saved at: %2 (UTC) | "
"
"
"
"
)
@@ -6682,11 +6682,11 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
//Edit Profiles Saved:
html_assembled += tr(
""
- " Edit Profiles Saved at: "
+ " Edit Profiles Saved on: "
"
"
""
- " %1 | "
+ "
%1 (UTC) | "
"
"
)
.arg( data_types_edit_ts[ im.key() ] ) //1
@@ -6753,7 +6753,7 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
" Channel: %1, | "
" %2, | "
" by: %3, | "
- " at: %4 | "
+ " at: %4 (UTC) | "
""
)
.arg( mfa.key() ) //1
@@ -6816,7 +6816,7 @@ void US_ReporterGMP::assemble_user_inputs_html( void )
" Reason: %3, | "
""
""
- " When: %4 | "
+ " When: %4 (UTC) | "
"
"
)
.arg( cj.key() ) //1
@@ -11692,8 +11692,8 @@ void US_ReporterGMP::get_current_date()
// current_date = dNow.toString( fmt );
- QDateTime date = QDateTime::currentDateTime();
- current_date = date.toString("MM/dd/yyyy hh:mm:ss");
+ QDateTime date = QDateTime::currentDateTimeUtc();
+ current_date = date.toString("MM/dd/yyyy hh:mm:ss") + " (UTC)";
qDebug() << "Current date -- " << current_date;
}
From c1b74a84a13e13f3db0c1e8c290a1a0aef683e0a Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Thu, 17 Oct 2024 19:54:58 -0500
Subject: [PATCH 23/32] GMP : UTC time in e-signer, audit_trail -- all times in
.pdf(s) & GUI are UTC...
---
.../us_audit_trail_gmp/us_audit_trail_gmp.cpp | 24 +++++++++----------
programs/us_esigner_gmp/us_esigner_gmp.cpp | 4 ++--
2 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
index ea13c7a0e..81948cc23 100644
--- a/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
+++ b/programs/us_audit_trail_gmp/us_audit_trail_gmp.cpp
@@ -624,7 +624,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_time = us_label( tr("Initiation Time:") );
lb_time->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
QLabel* lb_time1 = us_label( tr("Initiated on:") );
- QLineEdit* le_time1 = us_lineedit( createdGMPrunts, 0, true );
+ QLineEdit* le_time1 = us_lineedit( createdGMPrunts + " (UTC)", 0, true );
row=0;
genL2 -> addWidget( lb_time, row++, 0, 1, 6 );
@@ -805,7 +805,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_time_o1 = us_label( tr("Type:") );
QLineEdit* le_time_o1 = us_lineedit( status_map[ "Remote Operation" ][ "type"], 0, true );
QLabel* lb_time_o2 = us_label( tr("Performed on:") );
- QLineEdit* le_time_o2 = us_lineedit( operation_types_live_update_ts[ im.key() ], 0, true );
+ QLineEdit* le_time_o2 = us_lineedit( operation_types_live_update_ts[ im.key() ] + " (UTC)", 0, true );
row=0;
genL2 -> addWidget( lb_time_o, row++, 0, 1, 6 );
@@ -959,7 +959,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_time_ref1 = us_label( tr("Ref. Scan Method:") );
QLineEdit* le_time_ref1 = us_lineedit( status_map[ "RefScan" ][ "type"], 0, true );
QLabel* lb_time_ref2 = us_label( tr("Data Saved on:") );
- QLineEdit* le_time_ref2 = us_lineedit( data_types_import_ts[ im.key() ], 0, true );
+ QLineEdit* le_time_ref2 = us_lineedit( data_types_import_ts[ im.key() ] + " (UTC)", 0, true );
row=0;
genL2 -> addWidget( lb_time_ref, row++, 0, 1, 6 );
@@ -1245,7 +1245,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_ts = us_label( tr("Edit Profiles Saved on:") );
lb_ts->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
QLabel* lb_ts1 = us_label( tr("TimeStamp:") );
- QLineEdit* le_ts1 = us_lineedit( data_types_edit_ts[ im.key() ], 0, true );
+ QLineEdit* le_ts1 = us_lineedit( data_types_edit_ts[ im.key() ] + " (UTC)", 0, true );
row=0;
genL3 -> addWidget( lb_ts, row++, 0, 1, 6 );
@@ -1362,7 +1362,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_men3 = us_label( tr("Performed by:") );
QLineEdit* le_men3 = us_lineedit( performed_by, 0, true );
QLabel* lb_men4 = us_label( tr("TimeStamp:") );
- QLineEdit* le_men4 = us_lineedit( when, 0, true );
+ QLineEdit* le_men4 = us_lineedit( when + " (UTC)", 0, true );
genL1 -> addWidget( lb_men1, row, 1, 1, 2 );
genL1 -> addWidget( le_men1, row, 3, 1, 3 );
@@ -1428,7 +1428,7 @@ QVector< QGroupBox *> US_auditTrailGMP::createGroup_stages( QString name, QStrin
QLabel* lb_canc3 = us_label( tr("Reason:") );
QLineEdit* le_canc3 = us_lineedit( reason, 0, true );
QLabel* lb_canc4 = us_label( tr("TimeStamp:") );
- QLineEdit* le_canc4 = us_lineedit( when, 0, true );
+ QLineEdit* le_canc4 = us_lineedit( when + " (UTC)", 0, true );
genL1 -> addWidget( lb_canc1, row, 1, 1, 2 );
@@ -2396,7 +2396,7 @@ void US_auditTrailGMP::assemble_GMP_init( QMap< QString, QMap < QString, QString
""
""
- " Initiated at: %1 | "
+ " Initiated at: %1 (UTC) | "
"
"
"
"
)
@@ -2460,7 +2460,7 @@ void US_auditTrailGMP::assemble_GMP_live_update( QMap< QString, QMap < QString,
""
""
" Type: %1 | "
- " Performed at: %2 | "
+ " Performed at: %2 (UTC) | "
"
"
"
"
)
@@ -2529,7 +2529,7 @@ void US_auditTrailGMP::assemble_GMP_import( QMap< QString, QMap < QString, QStri
""
""
" Ref. Scan Method: %1 | "
- " Data Saved at: %2 | "
+ " Data Saved at: %2 (UTC) | "
"
"
"
"
)
@@ -2620,7 +2620,7 @@ void US_auditTrailGMP::assemble_GMP_editing( QMap< QString, QMap < QString, QStr
""
""
- " %1 | "
+ "
%1 (UTC) | "
"
"
)
.arg( oper_ts ) //1
@@ -2679,7 +2679,7 @@ void US_auditTrailGMP::assemble_GMP_analysis_fitmen( QMap < QString, QString > a
" Channel: %1, | "
" %2, | "
" by: %3, | "
- " at: %4 | "
+ " at: %4 (UTC) | "
""
)
.arg( mfa.key() ) //1
@@ -2740,7 +2740,7 @@ void US_auditTrailGMP::assemble_GMP_analysis_cancelled( QMap < QString, QString
" Reason: %3, | "
""
""
- " When: %4 | "
+ " When: %4 (UTC) | "
"
"
)
.arg( cj.key() ) //1
diff --git a/programs/us_esigner_gmp/us_esigner_gmp.cpp b/programs/us_esigner_gmp/us_esigner_gmp.cpp
index 8462c80fb..566b8b5d7 100644
--- a/programs/us_esigner_gmp/us_esigner_gmp.cpp
+++ b/programs/us_esigner_gmp/us_esigner_gmp.cpp
@@ -4682,8 +4682,8 @@ QString US_eSignaturesGMP::compose_updated_eSign_Json( int u_ID, QString u_fname
current_esignee += "{\"Comment\":\"" + comment_esignee + "\",";
//TimeDate fro current e-signee:
- QDateTime date = QDateTime::currentDateTime();
- QString timedate_esignee = date.toString("MM-dd-yyyy hh:mm:ss");
+ QDateTime date = QDateTime::currentDateTimeUtc();
+ QString timedate_esignee = date.toString("MM-dd-yyyy hh:mm:ss") + " (UTC)";
current_esignee += "\"timeDate\":\"" + timedate_esignee + "\"}}";
if ( esigned_array.size() == 0 || !esigned_array.size() )
From 9aa691ff0d4933b28d7a4d4dfcea98a60df427a3 Mon Sep 17 00:00:00 2001
From: aaron
Date: Sun, 20 Oct 2024 18:37:10 -0400
Subject: [PATCH 24/32] Update email to use Montana addresses
---
LICENSE.txt | 2 +-
alpha/us.cpp | 18 ++++++------------
doc/manual/advanced_config.body | 2 +-
doc/manual/convert.body | 2 +-
doc/manual/ultrascan3.txt | 16 +++++-----------
programs/us/us_de_DE.ts | 4 ++--
us_somo/attic/INSTALL | 6 +++---
us_somo/develop/src/us_hydrodyn_dad.cpp | 2 +-
us_somo/develop/src/us_hydrodyn_mals.cpp | 2 +-
us_somo/develop/src/us_hydrodyn_mals_saxs.cpp | 2 +-
us_somo/develop/src/us_hydrodyn_saxs_hplc.cpp | 2 +-
us_somo/develop/src/us_util.cpp | 2 +-
us_somo/extra/haddock/bin_i73/mpi/runjob | 2 +-
.../manual/somo/IntegralBaselineTheory.html | 2 +-
.../somo/doc/manual/somo/baseline_best.html | 2 +-
us_somo/somo/doc/manual/somo/copyright.html | 4 ++--
us_somo/somo/doc/manual/somo/cormap.html | 2 +-
.../somo/doc/manual/somo/dad_parameters.html | 2 +-
.../manual/somo/fractal_dimension_options.html | 2 +-
us_somo/somo/doc/manual/somo/mals_options.html | 2 +-
.../somo/doc/manual/somo/mals_parameters.html | 2 +-
.../doc/manual/somo/mals_saxs_options.html | 2 +-
.../manual/somo/saxs_hplc_Gaussian_theory.html | 2 +-
.../somo/doc/manual/somo/saxs_hplc_ciq.html | 2 +-
.../manual/somo/saxs_hplc_conc_csv_frames.html | 2 +-
.../somo/doc/manual/somo/saxs_hplc_dctr.html | 2 +-
.../somo/doc/manual/somo/saxs_hplc_nth.html | 2 +-
.../doc/manual/somo/saxs_hplc_options.html | 2 +-
.../somo/doc/manual/somo/saxs_hplc_p3d.html | 2 +-
.../doc/manual/somo/saxs_hplc_parameters.html | 2 +-
us_somo/somo/doc/manual/somo/saxs_ift.html | 2 +-
us_somo/somo/doc/manual/somo/somo.html | 2 +-
.../doc/manual/somo/somo_BEST_Analysis.html | 2 +-
.../somo/doc/manual/somo/somo_BEST_setup.html | 2 +-
...mo_Dammin_Dammif_bead_model_properties.html | 2 +-
.../somo/doc/manual/somo/somo_SAXS_search.html | 2 +-
.../somo/doc/manual/somo/somo_add_saxs.html | 2 +-
us_somo/somo/doc/manual/somo/somo_addatom.html | 2 +-
.../doc/manual/somo/somo_addhybridization.html | 2 +-
.../doc/manual/somo/somo_advanced_config.html | 2 +-
.../doc/manual/somo/somo_anaflex_options.html | 2 +-
us_somo/somo/doc/manual/somo/somo_asa.html | 2 +-
us_somo/somo/doc/manual/somo/somo_batch.html | 2 +-
.../somo/doc/manual/somo/somo_bd_options.html | 2 +-
.../manual/somo/somo_bead_model_format.html | 2 +-
.../somo/doc/manual/somo/somo_bead_output.html | 2 +-
us_somo/somo/doc/manual/somo/somo_cluster.html | 2 +-
.../somo/somo_cluster_advanced_options.html | 2 +-
.../doc/manual/somo/somo_cluster_config.html | 2 +-
.../somo/doc/manual/somo/somo_cluster_dmd.html | 2 +-
.../doc/manual/somo/somo_cluster_results.html | 2 +-
.../doc/manual/somo/somo_cluster_status.html | 2 +-
.../doc/manual/somo/somo_cluster_submit.html | 2 +-
.../somo/doc/manual/somo/somo_comparative.html | 2 +-
.../somo/doc/manual/somo/somo_dammin_opts.html | 2 +-
.../somo/doc/manual/somo/somo_dmd_options.html | 2 +-
us_somo/somo/doc/manual/somo/somo_file.html | 2 +-
us_somo/somo/doc/manual/somo/somo_grid.html | 2 +-
.../doc/manual/somo/somo_grid_overlap.html | 2 +-
us_somo/somo/doc/manual/somo/somo_hydro.html | 2 +-
.../manual/somo/somo_hydro_expert_mode.html | 2 +-
.../somo/doc/manual/somo/somo_hydro_zeno.html | 2 +-
.../doc/manual/somo/somo_hydro_zeno.html_old | 2 +-
us_somo/somo/doc/manual/somo/somo_mals.html | 2 +-
.../somo/doc/manual/somo/somo_mals_saxs.html | 2 +-
us_somo/somo/doc/manual/somo/somo_misc.html | 2 +-
us_somo/somo/doc/manual/somo/somo_overlap.html | 2 +-
.../somo/doc/manual/somo/somo_pdb_editor.html | 2 +-
.../doc/manual/somo/somo_pdb_editor_merge.html | 2 +-
.../somo/doc/manual/somo/somo_pdb_parsing.html | 2 +-
.../somo/somo_pdb_parsing_expert_mode.html | 2 +-
.../manual/somo/somo_pdb_visualization.html | 2 +-
us_somo/somo/doc/manual/somo/somo_residue.html | 2 +-
us_somo/somo/doc/manual/somo/somo_results.html | 2 +-
us_somo/somo/doc/manual/somo/somo_save.html | 2 +-
us_somo/somo/doc/manual/somo/somo_saxs.html | 2 +-
.../somo/doc/manual/somo/somo_saxs_buffer.html | 2 +-
.../somo/doc/manual/somo/somo_saxs_conc.html | 2 +-
.../somo/doc/manual/somo/somo_saxs_hplc.html | 2 +-
.../somo/somo_saxs_hplc_baseline_corr.html | 2 +-
.../doc/manual/somo/somo_saxs_hplc_fit.html | 2 +-
.../somo/somo_saxs_hplc_linear_baselines.html | 2 +-
.../doc/manual/somo/somo_saxs_hplc_movie.html | 2 +-
.../somo/somo_saxs_hplc_skewedGauss.html | 2 +-
.../doc/manual/somo/somo_saxs_hplc_svd.html | 2 +-
.../manual/somo/somo_saxs_iqq_residuals.html | 2 +-
.../doc/manual/somo/somo_saxs_load_csv.html | 2 +-
us_somo/somo/doc/manual/somo/somo_saxs_mw.html | 2 +-
.../doc/manual/somo/somo_saxs_options.html | 2 +-
.../doc/manual/somo/somo_saxs_residuals.html | 2 +-
.../somo/doc/manual/somo/somo_show_hydro.html | 2 +-
us_somo/somo/doc/manual/somo/somo_uv_vis.html | 2 +-
.../somo/doc/manual/somo/somo_vdw_overlap.html | 2 +-
.../doc/manual/somo/underconstruction.html | 4 ++--
.../somo/doc/manual/somo/uv_vis_options.html | 2 +-
95 files changed, 109 insertions(+), 121 deletions(-)
diff --git a/LICENSE.txt b/LICENSE.txt
index aa59801e6..b3594d73f 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,7 +1,7 @@
UltraScan is licensed under the LGPL v3 license.
Copyright © Borries Demeler, Ph.D.
-The University of Texas
+The University of Montana
****************************************************************************************
GNU LESSER GENERAL PUBLIC LICENSE
diff --git a/alpha/us.cpp b/alpha/us.cpp
index 50416a283..6cac69538 100644
--- a/alpha/us.cpp
+++ b/alpha/us.cpp
@@ -631,7 +631,7 @@ void US_Win::help( int index )
" * Minji Kim\n"
" * Brad Langford\n"
" * Thomas Laue\n"
- " * Konrad Löhr\n"
+ " * Konrad L�hr\n"
" * Luitgard Nagel-Steger\n"
" * Zach Ozer\n"
" * Karel Planken\n"
@@ -652,18 +652,12 @@ void US_Win::help( int index )
tr( "About UltraScan..." ),
tr( "UltraScan III version %1 (DEVELOPMENT)\n"
"%2\n"
- "Copyright 1989 - 2018\n"
- "Borries Demeler and the University of Texas System\n\n"
+ "Copyright 1989 - 2024\n"
+ "Borries Demeler and the University of Montana\n\n"
"For more information, please visit:\n"
- "http://www.ultrascan.uthscsa.edu/\n\n"
+ "http://www.ultrascan.aucsolutions.com/\n\n"
"The author can be reached at:\n"
- "The University of Texas Health Science Center\n"
- "Department of Biochemistry\n"
- "7703 Floyd Curl Drive\n"
- "San Antonio, Texas 78229-3900\n"
- "voice: (210) 767-3332\n"
- "Fax: (210) 567-6595\n"
- "E-mail: demeler@biochem.uthscsa.edu" ).arg( US_Version ).arg( REVISION ) );
+ "E-mail: borries.demeler@umontana.edu" ).arg( US_Version ).arg( REVISION ) );
statusBar()->showMessage( tr( "Ready" ) );
break;
@@ -740,7 +734,7 @@ bool US_Win::notice_check()
// Query notice table in the us3_notice database
US_Passwd pw;
US_DB2 db;
- QString host ( "uslims3.uthscsa.edu" );
+ QString host ( "uslims3.aucsolutions.edu" );
QString dbname( "us3_notice" );
QString user ( "us3_notice" );
QString passwd( "us3_notice" );
diff --git a/doc/manual/advanced_config.body b/doc/manual/advanced_config.body
index 0266f3581..275be1e95 100644
--- a/doc/manual/advanced_config.body
+++ b/doc/manual/advanced_config.body
@@ -9,7 +9,7 @@
in an advanced mode. Certain applications can benefit from use of more
than one thread. These variations are governed by the configuration values
that are set in this panel. Actual values should be set only under the
- guidance of UTHSCSA software developers, since meanings of settings vary
+ guidance of software developers, since meanings of settings vary
considerably from application to application.
here.
+ href='http://wiki.aucsolutions.com/ultrascan3/wiki/Us3Formats'>here.
+E-mail: borries.demeler@umontana.edu
diff --git a/us_somo/attic/INSTALL b/us_somo/attic/INSTALL
index 8bb6e3523..1a1c634e4 100644
--- a/us_somo/attic/INSTALL
+++ b/us_somo/attic/INSTALL
@@ -68,11 +68,11 @@ echo $LD_LIBRARY_PATH
or
ldconfig -v | grep ultrascan
-Contact: Borries Demeler (demeler@biochem.uthscsa.edu)
+Contact: Borries Demeler (borries.demeler@umontana.edu)
This document is part of the UltraScan Software Documentation
distribution. The latest version of this document can always be found at:
- http://www.ultrascan.uthscsa.edu
+ http://www.ultrascan.aucsolutions.edu
-Last modified on February 16, 2005
+Last modified on October 20, 2024
diff --git a/us_somo/develop/src/us_hydrodyn_dad.cpp b/us_somo/develop/src/us_hydrodyn_dad.cpp
index 240ec0ddf..9305e7a2f 100644
--- a/us_somo/develop/src/us_hydrodyn_dad.cpp
+++ b/us_somo/develop/src/us_hydrodyn_dad.cpp
@@ -1683,7 +1683,7 @@ void US_Hydrodyn_Dad::add_files( bool load_conc, bool from_dir ) {
QMessageBox::warning( this,
windowTitle()+ us_tr( ": Add files" ),
us_tr( "I am having a problem decoding the frame numbers or q values from the file names\n"
- "Please email a list of the file names you are trying to load to emre@biochem.uthscsa.edu" ) );
+ "Please email a list of the file names you are trying to load to emre.brookes@umt.edu" ) );
return;
}
tmp = prepend_tmp + tmp;
diff --git a/us_somo/develop/src/us_hydrodyn_mals.cpp b/us_somo/develop/src/us_hydrodyn_mals.cpp
index d66358f7f..521ae209c 100644
--- a/us_somo/develop/src/us_hydrodyn_mals.cpp
+++ b/us_somo/develop/src/us_hydrodyn_mals.cpp
@@ -1567,7 +1567,7 @@ void US_Hydrodyn_Mals::add_files( bool load_conc, bool from_dir ) {
QMessageBox::warning( this,
windowTitle()+ us_tr( ": Add files" ),
us_tr( "I am having a problem decoding the frame numbers or q values from the file names\n"
- "Please email a list of the file names you are trying to load to emre@biochem.uthscsa.edu" ) );
+ "Please email a list of the file names you are trying to load to emre.brookes@umt.edu" ) );
return;
}
tmp = prepend_tmp + tmp;
diff --git a/us_somo/develop/src/us_hydrodyn_mals_saxs.cpp b/us_somo/develop/src/us_hydrodyn_mals_saxs.cpp
index 8fb0b9cda..d56889da6 100644
--- a/us_somo/develop/src/us_hydrodyn_mals_saxs.cpp
+++ b/us_somo/develop/src/us_hydrodyn_mals_saxs.cpp
@@ -1579,7 +1579,7 @@ void US_Hydrodyn_Mals_Saxs::add_files( bool load_conc, bool from_dir ) {
QMessageBox::warning( this,
windowTitle()+ us_tr( ": Add files" ),
us_tr( "I am having a problem decoding the frame numbers or q values from the file names\n"
- "Please email a list of the file names you are trying to load to emre@biochem.uthscsa.edu" ) );
+ "Please email a list of the file names you are trying to load to emre.brookes@umt.edu" ) );
return;
}
tmp = prepend_tmp + tmp;
diff --git a/us_somo/develop/src/us_hydrodyn_saxs_hplc.cpp b/us_somo/develop/src/us_hydrodyn_saxs_hplc.cpp
index 4eaf914c4..fbbe13bf8 100644
--- a/us_somo/develop/src/us_hydrodyn_saxs_hplc.cpp
+++ b/us_somo/develop/src/us_hydrodyn_saxs_hplc.cpp
@@ -1251,7 +1251,7 @@ void US_Hydrodyn_Saxs_Hplc::add_files( bool load_conc, bool from_dir ) {
QMessageBox::warning( this,
windowTitle()+ us_tr( ": Add files" ),
us_tr( "I am having a problem decoding the frame numbers or q values from the file names\n"
- "Please email a list of the file names you are trying to load to emre@biochem.uthscsa.edu" ) );
+ "Please email a list of the file names you are trying to load to emre.brookes@umt.edu" ) );
return;
}
tmp = prepend_tmp + tmp;
diff --git a/us_somo/develop/src/us_util.cpp b/us_somo/develop/src/us_util.cpp
index cd0e2c073..7abc7f235 100644
--- a/us_somo/develop/src/us_util.cpp
+++ b/us_somo/develop/src/us_util.cpp
@@ -287,7 +287,7 @@ void getFooter(QString *footer)
date = QDate::currentDate();
QString year;
year.sprintf("%d", date.year());
- *footer = "
\nUltraScan Software Contact: Borries Demeler\n";
+ *footer = "
\nUltraScan Software Contact: Borries Demeler\n";
*footer += "
\nThis document has been generated with the UltraScan II Data Analysis Software distribution.\n
\n";
*footer += "All rights reserved, Copyright " + year + " The University of";
*footer += "Texas Health Science Center at San Antonio.\n
UltraScan Home Page: ";
diff --git a/us_somo/extra/haddock/bin_i73/mpi/runjob b/us_somo/extra/haddock/bin_i73/mpi/runjob
index e13c57074..d3defd425 100644
--- a/us_somo/extra/haddock/bin_i73/mpi/runjob
+++ b/us_somo/extra/haddock/bin_i73/mpi/runjob
@@ -5,7 +5,7 @@
#SBATCH -n 1024 # total number of mpi tasks requested
#SBATCH -p normal # queue (partition) -- normal, development, etc.
#SBATCH -t 02:00:00 # run time (hh:mm:ss)
-#SBATCH --mail-user=emre@biochem.uthscsa.edu
+#SBATCH --mail-user=emre.brookes@umt.edu
#SBATCH --mail-type=begin # email me when the job starts
#SBATCH --mail-type=end # email me when the job finishes
diff --git a/us_somo/somo/doc/manual/somo/IntegralBaselineTheory.html b/us_somo/somo/doc/manual/somo/IntegralBaselineTheory.html
index 05bfa067d..e0a5ade7c 100644
--- a/us_somo/somo/doc/manual/somo/IntegralBaselineTheory.html
+++ b/us_somo/somo/doc/manual/somo/IntegralBaselineTheory.html
@@ -69,7 +69,7 @@ Last updated: December 2017
This is a work in progress and will eventually be updated.
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/baseline_best.html b/us_somo/somo/doc/manual/somo/baseline_best.html
index 242bf5734..820ec1814 100644
--- a/us_somo/somo/doc/manual/somo/baseline_best.html
+++ b/us_somo/somo/doc/manual/somo/baseline_best.html
@@ -33,7 +33,7 @@ Last updated: March 2016
This module is currently described within the main HPLC-SAXS panel help here.
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/copyright.html b/us_somo/somo/doc/manual/somo/copyright.html
index 4db9d69f6..96667a915 100644
--- a/us_somo/somo/doc/manual/somo/copyright.html
+++ b/us_somo/somo/doc/manual/somo/copyright.html
@@ -5,7 +5,7 @@
Manual |
UltraScan
Copyright Notice:
This software is licensed under the General Public License v.3
-Please direct all license inquiries to:
+Please direct all license inquiries to:
Emre Brookes, Ph.D.
and
The University of Texas Health Science Center at San Antonio
@@ -15,7 +15,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
This document is part of the UltraScan Software Documentation
distribution: Copyright © notice.
diff --git a/us_somo/somo/doc/manual/somo/cormap.html b/us_somo/somo/doc/manual/somo/cormap.html
index e11e04569..96664a74e 100644
--- a/us_somo/somo/doc/manual/somo/cormap.html
+++ b/us_somo/somo/doc/manual/somo/cormap.html
@@ -264,7 +264,7 @@
Details
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/dad_parameters.html b/us_somo/somo/doc/manual/somo/dad_parameters.html
index b09b532cb..853b9b85d 100644
--- a/us_somo/somo/doc/manual/somo/dad_parameters.html
+++ b/us_somo/somo/doc/manual/somo/dad_parameters.html
@@ -30,7 +30,7 @@ Last updated: April 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/fractal_dimension_options.html b/us_somo/somo/doc/manual/somo/fractal_dimension_options.html
index ab26b98f3..db0b7f1f6 100644
--- a/us_somo/somo/doc/manual/somo/fractal_dimension_options.html
+++ b/us_somo/somo/doc/manual/somo/fractal_dimension_options.html
@@ -150,7 +150,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/mals_options.html b/us_somo/somo/doc/manual/somo/mals_options.html
index b09b532cb..853b9b85d 100644
--- a/us_somo/somo/doc/manual/somo/mals_options.html
+++ b/us_somo/somo/doc/manual/somo/mals_options.html
@@ -30,7 +30,7 @@ Last updated: April 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/mals_parameters.html b/us_somo/somo/doc/manual/somo/mals_parameters.html
index b09b532cb..853b9b85d 100644
--- a/us_somo/somo/doc/manual/somo/mals_parameters.html
+++ b/us_somo/somo/doc/manual/somo/mals_parameters.html
@@ -30,7 +30,7 @@ Last updated: April 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/mals_saxs_options.html b/us_somo/somo/doc/manual/somo/mals_saxs_options.html
index b09b532cb..853b9b85d 100644
--- a/us_somo/somo/doc/manual/somo/mals_saxs_options.html
+++ b/us_somo/somo/doc/manual/somo/mals_saxs_options.html
@@ -30,7 +30,7 @@ Last updated: April 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_Gaussian_theory.html b/us_somo/somo/doc/manual/somo/saxs_hplc_Gaussian_theory.html
index c2a7985e5..5391fdbf2 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_Gaussian_theory.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_Gaussian_theory.html
@@ -67,7 +67,7 @@ Last updated: December 2017
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_ciq.html b/us_somo/somo/doc/manual/somo/saxs_hplc_ciq.html
index 8fa56f45b..8a8d19cf2 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_ciq.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_ciq.html
@@ -94,7 +94,7 @@ Last updated: July 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_conc_csv_frames.html b/us_somo/somo/doc/manual/somo/saxs_hplc_conc_csv_frames.html
index 96da47ed1..b84b3ae83 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_conc_csv_frames.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_conc_csv_frames.html
@@ -125,7 +125,7 @@ Details
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_dctr.html b/us_somo/somo/doc/manual/somo/saxs_hplc_dctr.html
index 3274f281e..91c6984e3 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_dctr.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_dctr.html
@@ -43,7 +43,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_nth.html b/us_somo/somo/doc/manual/somo/saxs_hplc_nth.html
index b142caece..aab451b69 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_nth.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_nth.html
@@ -38,7 +38,7 @@ Last updated: April 2016
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_options.html b/us_somo/somo/doc/manual/somo/saxs_hplc_options.html
index a5be42cc9..7a469ebd3 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_options.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_options.html
@@ -181,7 +181,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_p3d.html b/us_somo/somo/doc/manual/somo/saxs_hplc_p3d.html
index e69ea5b3b..4d9f5fe3e 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_p3d.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_p3d.html
@@ -38,7 +38,7 @@ Last updated: October 2013
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_hplc_parameters.html b/us_somo/somo/doc/manual/somo/saxs_hplc_parameters.html
index 61398b314..c3f4ed406 100644
--- a/us_somo/somo/doc/manual/somo/saxs_hplc_parameters.html
+++ b/us_somo/somo/doc/manual/somo/saxs_hplc_parameters.html
@@ -73,7 +73,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/saxs_ift.html b/us_somo/somo/doc/manual/somo/saxs_ift.html
index c2964cd41..6c245f853 100644
--- a/us_somo/somo/doc/manual/somo/saxs_ift.html
+++ b/us_somo/somo/doc/manual/somo/saxs_ift.html
@@ -229,7 +229,7 @@ Details
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo.html b/us_somo/somo/doc/manual/somo/somo.html
index 024b30a1d..dfde006a4 100644
--- a/us_somo/somo/doc/manual/somo/somo.html
+++ b/us_somo/somo/doc/manual/somo/somo.html
@@ -552,7 +552,7 @@ Options menus:
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_BEST_Analysis.html b/us_somo/somo/doc/manual/somo/somo_BEST_Analysis.html
index 5fa6b1903..1a7cfc707 100644
--- a/us_somo/somo/doc/manual/somo/somo_BEST_Analysis.html
+++ b/us_somo/somo/doc/manual/somo/somo_BEST_Analysis.html
@@ -83,7 +83,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_BEST_setup.html b/us_somo/somo/doc/manual/somo/somo_BEST_setup.html
index 2095f4f22..5c38ed849 100644
--- a/us_somo/somo/doc/manual/somo/somo_BEST_setup.html
+++ b/us_somo/somo/doc/manual/somo/somo_BEST_setup.html
@@ -101,7 +101,7 @@ Results
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_Dammin_Dammif_bead_model_properties.html b/us_somo/somo/doc/manual/somo/somo_Dammin_Dammif_bead_model_properties.html
index 80c77cafc..6ab6051f8 100644
--- a/us_somo/somo/doc/manual/somo/somo_Dammin_Dammif_bead_model_properties.html
+++ b/us_somo/somo/doc/manual/somo/somo_Dammin_Dammif_bead_model_properties.html
@@ -33,7 +33,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_SAXS_search.html b/us_somo/somo/doc/manual/somo/somo_SAXS_search.html
index 2c72fe3c5..1735d3257 100644
--- a/us_somo/somo/doc/manual/somo/somo_SAXS_search.html
+++ b/us_somo/somo/doc/manual/somo/somo_SAXS_search.html
@@ -55,7 +55,7 @@ Last updated: November 2013
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_add_saxs.html b/us_somo/somo/doc/manual/somo/somo_add_saxs.html
index bd1ae922f..f2e40c733 100644
--- a/us_somo/somo/doc/manual/somo/somo_add_saxs.html
+++ b/us_somo/somo/doc/manual/somo/somo_add_saxs.html
@@ -56,7 +56,7 @@ Last updated: January 2023
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_addatom.html b/us_somo/somo/doc/manual/somo/somo_addatom.html
index 20543a0a4..6d442f4d2 100644
--- a/us_somo/somo/doc/manual/somo/somo_addatom.html
+++ b/us_somo/somo/doc/manual/somo/somo_addatom.html
@@ -59,7 +59,7 @@ Last updated: September 2020
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_addhybridization.html b/us_somo/somo/doc/manual/somo/somo_addhybridization.html
index 3cb948a66..baf102971 100644
--- a/us_somo/somo/doc/manual/somo/somo_addhybridization.html
+++ b/us_somo/somo/doc/manual/somo/somo_addhybridization.html
@@ -59,7 +59,7 @@ Last updated: September 2020
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_advanced_config.html b/us_somo/somo/doc/manual/somo/somo_advanced_config.html
index cc193bc7f..0d73df8b3 100644
--- a/us_somo/somo/doc/manual/somo/somo_advanced_config.html
+++ b/us_somo/somo/doc/manual/somo/somo_advanced_config.html
@@ -82,7 +82,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_anaflex_options.html b/us_somo/somo/doc/manual/somo/somo_anaflex_options.html
index 3bd91007e..23b4d30fb 100644
--- a/us_somo/somo/doc/manual/somo/somo_anaflex_options.html
+++ b/us_somo/somo/doc/manual/somo/somo_anaflex_options.html
@@ -31,7 +31,7 @@ Last updated: April 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_asa.html b/us_somo/somo/doc/manual/somo/somo_asa.html
index e76ccbcb2..c64a44542 100644
--- a/us_somo/somo/doc/manual/somo/somo_asa.html
+++ b/us_somo/somo/doc/manual/somo/somo_asa.html
@@ -73,7 +73,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_batch.html b/us_somo/somo/doc/manual/somo/somo_batch.html
index a42104634..b56ed370c 100644
--- a/us_somo/somo/doc/manual/somo/somo_batch.html
+++ b/us_somo/somo/doc/manual/somo/somo_batch.html
@@ -97,7 +97,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_bd_options.html b/us_somo/somo/doc/manual/somo/somo_bd_options.html
index 21e3fe0b1..ae727614b 100644
--- a/us_somo/somo/doc/manual/somo/somo_bd_options.html
+++ b/us_somo/somo/doc/manual/somo/somo_bd_options.html
@@ -31,7 +31,7 @@ Last updated: April 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_bead_model_format.html b/us_somo/somo/doc/manual/somo/somo_bead_model_format.html
index 4668d3a29..aa675d373 100644
--- a/us_somo/somo/doc/manual/somo/somo_bead_model_format.html
+++ b/us_somo/somo/doc/manual/somo/somo_bead_model_format.html
@@ -117,7 +117,7 @@ Last updated: February 2021
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_bead_output.html b/us_somo/somo/doc/manual/somo/somo_bead_output.html
index 809358700..feead36d0 100644
--- a/us_somo/somo/doc/manual/somo/somo_bead_output.html
+++ b/us_somo/somo/doc/manual/somo/somo_bead_output.html
@@ -69,7 +69,7 @@ Last updated: February 2021
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster.html b/us_somo/somo/doc/manual/somo/somo_cluster.html
index 319a96ddc..21dc076b0 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster.html
@@ -106,7 +106,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_advanced_options.html b/us_somo/somo/doc/manual/somo/somo_cluster_advanced_options.html
index 1cecf839c..ac3f7f754 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_advanced_options.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_advanced_options.html
@@ -37,7 +37,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_config.html b/us_somo/somo/doc/manual/somo/somo_cluster_config.html
index c034f7dc4..44bc35bc9 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_config.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_config.html
@@ -100,7 +100,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_dmd.html b/us_somo/somo/doc/manual/somo/somo_cluster_dmd.html
index f262b8886..839e33a73 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_dmd.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_dmd.html
@@ -77,7 +77,7 @@ Last updated: November 2013
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_results.html b/us_somo/somo/doc/manual/somo/somo_cluster_results.html
index 268ce2eea..d38281fbc 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_results.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_results.html
@@ -42,7 +42,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_status.html b/us_somo/somo/doc/manual/somo/somo_cluster_status.html
index 19fd95294..629582475 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_status.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_status.html
@@ -52,7 +52,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_cluster_submit.html b/us_somo/somo/doc/manual/somo/somo_cluster_submit.html
index 913698b2e..9dc424af3 100644
--- a/us_somo/somo/doc/manual/somo/somo_cluster_submit.html
+++ b/us_somo/somo/doc/manual/somo/somo_cluster_submit.html
@@ -51,7 +51,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_comparative.html b/us_somo/somo/doc/manual/somo/somo_comparative.html
index 652fd8ec2..fb90f1d04 100644
--- a/us_somo/somo/doc/manual/somo/somo_comparative.html
+++ b/us_somo/somo/doc/manual/somo/somo_comparative.html
@@ -173,7 +173,7 @@ Last updated: March 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_dammin_opts.html b/us_somo/somo/doc/manual/somo/somo_dammin_opts.html
index 0f02b59db..c8be75f5c 100644
--- a/us_somo/somo/doc/manual/somo/somo_dammin_opts.html
+++ b/us_somo/somo/doc/manual/somo/somo_dammin_opts.html
@@ -33,7 +33,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_dmd_options.html b/us_somo/somo/doc/manual/somo/somo_dmd_options.html
index 1d7e7eb01..361b83cf7 100644
--- a/us_somo/somo/doc/manual/somo/somo_dmd_options.html
+++ b/us_somo/somo/doc/manual/somo/somo_dmd_options.html
@@ -31,7 +31,7 @@ Last updated: April 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_file.html b/us_somo/somo/doc/manual/somo/somo_file.html
index 4bb674e66..3b1de16dc 100644
--- a/us_somo/somo/doc/manual/somo/somo_file.html
+++ b/us_somo/somo/doc/manual/somo/somo_file.html
@@ -40,7 +40,7 @@
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_grid.html b/us_somo/somo/doc/manual/somo/somo_grid.html
index 1d2cd0cc5..cb9b09423 100644
--- a/us_somo/somo/doc/manual/somo/somo_grid.html
+++ b/us_somo/somo/doc/manual/somo/somo_grid.html
@@ -58,7 +58,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_grid_overlap.html b/us_somo/somo/doc/manual/somo/somo_grid_overlap.html
index a12ad2287..e45454770 100644
--- a/us_somo/somo/doc/manual/somo/somo_grid_overlap.html
+++ b/us_somo/somo/doc/manual/somo/somo_grid_overlap.html
@@ -156,7 +156,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_hydro.html b/us_somo/somo/doc/manual/somo/somo_hydro.html
index 0d1d6f46a..d7c7948ca 100644
--- a/us_somo/somo/doc/manual/somo/somo_hydro.html
+++ b/us_somo/somo/doc/manual/somo/somo_hydro.html
@@ -65,7 +65,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_hydro_expert_mode.html b/us_somo/somo/doc/manual/somo/somo_hydro_expert_mode.html
index 8e1219c78..d424b269c 100644
--- a/us_somo/somo/doc/manual/somo/somo_hydro_expert_mode.html
+++ b/us_somo/somo/doc/manual/somo/somo_hydro_expert_mode.html
@@ -79,7 +79,7 @@ Last updated: February 2021
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html b/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html
index c9006a3a5..bce22c76f 100644
--- a/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html
+++ b/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html
@@ -70,7 +70,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html_old b/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html_old
index 6b1220802..5602d9f04 100644
--- a/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html_old
+++ b/us_somo/somo/doc/manual/somo/somo_hydro_zeno.html_old
@@ -93,7 +93,7 @@ More recently, we have discovered a discrepancy between the translational diffus
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_mals.html b/us_somo/somo/doc/manual/somo/somo_mals.html
index 86917ea9d..a94589d12 100644
--- a/us_somo/somo/doc/manual/somo/somo_mals.html
+++ b/us_somo/somo/doc/manual/somo/somo_mals.html
@@ -30,7 +30,7 @@ Last updated: July 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_mals_saxs.html b/us_somo/somo/doc/manual/somo/somo_mals_saxs.html
index baff7a747..cc8beed37 100644
--- a/us_somo/somo/doc/manual/somo/somo_mals_saxs.html
+++ b/us_somo/somo/doc/manual/somo/somo_mals_saxs.html
@@ -30,7 +30,7 @@ Last updated: July 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_misc.html b/us_somo/somo/doc/manual/somo/somo_misc.html
index 564dc996b..68dafa6ed 100644
--- a/us_somo/somo/doc/manual/somo/somo_misc.html
+++ b/us_somo/somo/doc/manual/somo/somo_misc.html
@@ -120,7 +120,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_overlap.html b/us_somo/somo/doc/manual/somo/somo_overlap.html
index d2fc651f9..ea4457890 100644
--- a/us_somo/somo/doc/manual/somo/somo_overlap.html
+++ b/us_somo/somo/doc/manual/somo/somo_overlap.html
@@ -174,7 +174,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_pdb_editor.html b/us_somo/somo/doc/manual/somo/somo_pdb_editor.html
index dac94cacd..3fda4db0f 100644
--- a/us_somo/somo/doc/manual/somo/somo_pdb_editor.html
+++ b/us_somo/somo/doc/manual/somo/somo_pdb_editor.html
@@ -198,7 +198,7 @@ Last updated: April 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_pdb_editor_merge.html b/us_somo/somo/doc/manual/somo/somo_pdb_editor_merge.html
index d09062c46..fa85a6789 100644
--- a/us_somo/somo/doc/manual/somo/somo_pdb_editor_merge.html
+++ b/us_somo/somo/doc/manual/somo/somo_pdb_editor_merge.html
@@ -192,7 +192,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_pdb_parsing.html b/us_somo/somo/doc/manual/somo/somo_pdb_parsing.html
index db2d2526c..914626ff1 100644
--- a/us_somo/somo/doc/manual/somo/somo_pdb_parsing.html
+++ b/us_somo/somo/doc/manual/somo/somo_pdb_parsing.html
@@ -180,7 +180,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_pdb_parsing_expert_mode.html b/us_somo/somo/doc/manual/somo/somo_pdb_parsing_expert_mode.html
index c79e8fd6c..3e433ed9f 100644
--- a/us_somo/somo/doc/manual/somo/somo_pdb_parsing_expert_mode.html
+++ b/us_somo/somo/doc/manual/somo/somo_pdb_parsing_expert_mode.html
@@ -185,7 +185,7 @@ Last updated: February 2021
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_pdb_visualization.html b/us_somo/somo/doc/manual/somo/somo_pdb_visualization.html
index 0bbfcd892..666ed7eca 100644
--- a/us_somo/somo/doc/manual/somo/somo_pdb_visualization.html
+++ b/us_somo/somo/doc/manual/somo/somo_pdb_visualization.html
@@ -48,7 +48,7 @@
diff --git a/us_somo/somo/doc/manual/somo/somo_residue.html b/us_somo/somo/doc/manual/somo/somo_residue.html
index c1e4134a0..b31557bf5 100644
--- a/us_somo/somo/doc/manual/somo/somo_residue.html
+++ b/us_somo/somo/doc/manual/somo/somo_residue.html
@@ -205,7 +205,7 @@ Last updated: March 2023
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_results.html b/us_somo/somo/doc/manual/somo/somo_results.html
index 269eb79dc..6ed80c294 100644
--- a/us_somo/somo/doc/manual/somo/somo_results.html
+++ b/us_somo/somo/doc/manual/somo/somo_results.html
@@ -43,7 +43,7 @@ Last updated:
instead allow to visualize a previously-generated bead model file.
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_save.html b/us_somo/somo/doc/manual/somo/somo_save.html
index 5e26ea506..85e5ba182 100644
--- a/us_somo/somo/doc/manual/somo/somo_save.html
+++ b/us_somo/somo/doc/manual/somo/somo_save.html
@@ -135,7 +135,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs.html b/us_somo/somo/doc/manual/somo/somo_saxs.html
index 359e3a035..570e3ecb1 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs.html
@@ -337,7 +337,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_buffer.html b/us_somo/somo/doc/manual/somo/somo_saxs_buffer.html
index 2ebd4f435..e769fc0d9 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_buffer.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_buffer.html
@@ -27,7 +27,7 @@ Last updated: November 2013
This is a work in progress and will eventually be updated.
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_conc.html b/us_somo/somo/doc/manual/somo/somo_saxs_conc.html
index fe4f996fb..43d442550 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_conc.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_conc.html
@@ -38,7 +38,7 @@ Last updated: April 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc.html
index 31b91e46c..a82ee0acb 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc.html
@@ -1631,7 +1631,7 @@ Last updated: July 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_baseline_corr.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_baseline_corr.html
index 17c7715f2..73c2250e4 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_baseline_corr.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_baseline_corr.html
@@ -598,7 +598,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_fit.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_fit.html
index 41e5b1bf4..1579fe6a0 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_fit.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_fit.html
@@ -58,7 +58,7 @@ Last updated: May 2014
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_linear_baselines.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_linear_baselines.html
index f935672fd..80f3eb3f2 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_linear_baselines.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_linear_baselines.html
@@ -90,7 +90,7 @@ Last updated: July 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_movie.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_movie.html
index b8a072688..e7a2492b9 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_movie.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_movie.html
@@ -70,7 +70,7 @@ Last updated: October 2013
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_skewedGauss.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_skewedGauss.html
index 9555659f4..1cbaf8f2f 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_skewedGauss.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_skewedGauss.html
@@ -175,7 +175,7 @@ Last updated: December 2017
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_svd.html b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_svd.html
index 526e3a9ec..2f1248c8a 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_hplc_svd.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_hplc_svd.html
@@ -124,7 +124,7 @@ Last updated: April 2016
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_iqq_residuals.html b/us_somo/somo/doc/manual/somo/somo_saxs_iqq_residuals.html
index b2fcaa512..3d0efb091 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_iqq_residuals.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_iqq_residuals.html
@@ -52,7 +52,7 @@ Last updated: April 2012
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_load_csv.html b/us_somo/somo/doc/manual/somo/somo_saxs_load_csv.html
index 3f6d60791..1cc2943d0 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_load_csv.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_load_csv.html
@@ -315,7 +315,7 @@ Last updated: March 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_mw.html b/us_somo/somo/doc/manual/somo/somo_saxs_mw.html
index 88ed394c1..bf4290d17 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_mw.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_mw.html
@@ -72,7 +72,7 @@ Details
- www contact: Emre Brookes
+ www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_options.html b/us_somo/somo/doc/manual/somo/somo_saxs_options.html
index 7e5c70b29..e073aed0a 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_options.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_options.html
@@ -289,7 +289,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_saxs_residuals.html b/us_somo/somo/doc/manual/somo/somo_saxs_residuals.html
index 44c1b38be..4f35a0a6f 100644
--- a/us_somo/somo/doc/manual/somo/somo_saxs_residuals.html
+++ b/us_somo/somo/doc/manual/somo/somo_saxs_residuals.html
@@ -58,7 +58,7 @@ Last updated: March 2023
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_show_hydro.html b/us_somo/somo/doc/manual/somo/somo_show_hydro.html
index 8db43e6b2..5b32c8d49 100644
--- a/us_somo/somo/doc/manual/somo/somo_show_hydro.html
+++ b/us_somo/somo/doc/manual/somo/somo_show_hydro.html
@@ -49,7 +49,7 @@ Last updated: February 2021
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_uv_vis.html b/us_somo/somo/doc/manual/somo/somo_uv_vis.html
index 6e95c61b5..4e5fdb538 100644
--- a/us_somo/somo/doc/manual/somo/somo_uv_vis.html
+++ b/us_somo/somo/doc/manual/somo/somo_uv_vis.html
@@ -596,7 +596,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/somo_vdw_overlap.html b/us_somo/somo/doc/manual/somo/somo_vdw_overlap.html
index 139eb5b6a..cf1a8ab0e 100644
--- a/us_somo/somo/doc/manual/somo/somo_vdw_overlap.html
+++ b/us_somo/somo/doc/manual/somo/somo_vdw_overlap.html
@@ -35,7 +35,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/underconstruction.html b/us_somo/somo/doc/manual/somo/underconstruction.html
index bdf679aa2..f5d5bc97a 100644
--- a/us_somo/somo/doc/manual/somo/underconstruction.html
+++ b/us_somo/somo/doc/manual/somo/underconstruction.html
@@ -25,10 +25,10 @@
-
+
-www contact: Emre Brookes
+www contact: Emre Brookes
diff --git a/us_somo/somo/doc/manual/somo/uv_vis_options.html b/us_somo/somo/doc/manual/somo/uv_vis_options.html
index b5fd84fc5..e300a994d 100644
--- a/us_somo/somo/doc/manual/somo/uv_vis_options.html
+++ b/us_somo/somo/doc/manual/somo/uv_vis_options.html
@@ -87,7 +87,7 @@ Last updated: June 2024
-www contact: Emre Brookes
+www contact: Emre Brookes
From adc6c23b61a16464db88203e933492a004032c4c Mon Sep 17 00:00:00 2001
From: aaron
Date: Sun, 20 Oct 2024 18:56:58 -0400
Subject: [PATCH 25/32] fix accent mark
---
LICENSE.txt | 3 +--
alpha/us.cpp | 8 ++++----
doc/manual/ultrascan3.txt | 1 -
programs/us/us_de_DE.ts | 6 ------
4 files changed, 5 insertions(+), 13 deletions(-)
diff --git a/LICENSE.txt b/LICENSE.txt
index b3594d73f..f407ef0b4 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,8 +1,7 @@
UltraScan is licensed under the LGPL v3 license.
Copyright © Borries Demeler, Ph.D.
-The University of Montana
-****************************************************************************************
+***************************************************************************************
GNU LESSER GENERAL PUBLIC LICENSE
diff --git a/alpha/us.cpp b/alpha/us.cpp
index 6cac69538..abd7fe253 100644
--- a/alpha/us.cpp
+++ b/alpha/us.cpp
@@ -627,11 +627,11 @@ void US_Win::help( int index )
" * Nikolay Dokholyan\n"
" * Jose Garcia de la Torre\n"
- " * Haram Kim\n"
- " * Minji Kim\n"
+ " * Haram Kim\n"
+ " * Minji Kim\n"
" * Brad Langford\n"
" * Thomas Laue\n"
- " * Konrad L�hr\n"
+ " * Konrad Löhr\n"
" * Luitgard Nagel-Steger\n"
" * Zach Ozer\n"
" * Karel Planken\n"
@@ -653,7 +653,7 @@ void US_Win::help( int index )
tr( "UltraScan III version %1 (DEVELOPMENT)\n"
"%2\n"
"Copyright 1989 - 2024\n"
- "Borries Demeler and the University of Montana\n\n"
+ "Borries Demeler\n\n"
"For more information, please visit:\n"
"http://www.ultrascan.aucsolutions.com/\n\n"
"The author can be reached at:\n"
diff --git a/doc/manual/ultrascan3.txt b/doc/manual/ultrascan3.txt
index a08fa4edb..ec5359bcc 100644
--- a/doc/manual/ultrascan3.txt
+++ b/doc/manual/ultrascan3.txt
@@ -3,7 +3,6 @@ UltraScan III
Copyright 1989 - 2024
Copyright � 1989?2021 Borries Demeler, Ph.D.
-Copyright � 1997?2021 The University of Montana
All rights reserved.
UltraScan is free software; you can redistribute it and/or modify it under the
diff --git a/programs/us/us_de_DE.ts b/programs/us/us_de_DE.ts
index 4deeca985..2fb99bc66 100644
--- a/programs/us/us_de_DE.ts
+++ b/programs/us/us_de_DE.ts
@@ -336,12 +336,6 @@ For more information, please visit:
http://www.ultrascan.aucsolutions.com/
The author can be reached at:
-The University of Texas Health Science Center
-Department of Biochemistry
-7703 Floyd Curl Drive
-San Antonio, Texas 78229-3900
-voice: (210) 567-6592
-Fax: (210) 567-6595
E-mail: borries.demeler@umontana.edu
From 9f0b603fa30ebb9cf271d3101c9f7b50748cf732 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 22 Oct 2024 17:35:01 -0500
Subject: [PATCH 26/32] GMP : Reporting Averages over Replicates for all Optics
types -- attemp to resolve, will be tested on Workshop DB for specifically
created combo-run out of uploaded form disk data...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 22 +++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index e64a56a95..ffa3f5376 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -7520,12 +7520,15 @@ QString US_ReporterGMP::calc_replicates_averages( void )
for( int i=0; i US_ReporterGMP::get_replicate_group_results( US_ReportGMP:
{
QString channel_desc_alt = chndescs_alt[ j ];
- //For now, do not consider IP type!!!
- if ( channel_desc_alt.contains("Interf") )
- continue;
+ // //For now, do not consider IP type!!!
+ // if ( channel_desc_alt.contains("Interf") )
+ // continue;
- if ( channel_desc_alt.split(":")[0].contains( channs_for_wvl[ i ] ) )
+ //if ( channel_desc_alt.split(":")[0].contains( channs_for_wvl[ i ] ) )
+ if ( channel_desc_alt .contains( channs_for_wvl[ i ] ) )
{
- qDebug() << "In get_replicate_group_results(): channel_desc_alt, wvl -- " << channel_desc_alt << u_wvl;
+ qDebug() << "In get_replicate_group_results(): channel_desc_alt, channs_for_wvl[ i ], wvl -- "
+ << channel_desc_alt
+ << channs_for_wvl[ i ]
+ << u_wvl;
//Select US_ReportGMP for channel in a Replicate group && representative wvl!
reportGMP = ch_reports[ channel_desc_alt ][ u_wvl ];
@@ -7677,6 +7684,7 @@ QMap US_ReporterGMP::get_replicate_group_results( US_ReportGMP:
break;
}
}
+
//then pick report's ReportItem corresponding to the passed ref_report_item:
int report_items_number = reportGMP. reportItems.size();
for ( int kk = 0; kk < report_items_number; ++kk )
From 6cc8140ed633c1d27297ab96b1209271952d552d Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 22 Oct 2024 17:47:55 -0500
Subject: [PATCH 27/32] [fix 1 for -- ] GMP : Reporting Averages over
Replicates for all Optics types -- attemp to resolve, will be tested on
Workshop DB for specifically created combo-run out of uploaded form disk
data...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index ffa3f5376..ee91081fa 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -7512,6 +7512,7 @@ QString US_ReporterGMP::calc_replicates_averages( void )
{
QString ch_alt_desc = chw.key();
QStringList all_wvls = chw.value();
+ QString o_type = ch_alt_desc.split(":")[1];
QStringList unique_wvls;
QStringList unique_channels;
@@ -7528,7 +7529,7 @@ QString US_ReporterGMP::calc_replicates_averages( void )
//here, add to list FULL channel desc, e.g. "1A:Iterf.", or "1A:UV/vis."
//same_wvls_chann_map[ curr_wvl ] << curr_chann; //BEFORE
- same_wvls_chann_map[ curr_wvl ] << curr_chann + ":" + ch_alt_desc.split(":")[1]; //Will this work?
+ same_wvls_chann_map[ curr_wvl ] << curr_chann + ":" + o_type; //Will this work?
}
unique_wvls. removeDuplicates();
@@ -7536,9 +7537,10 @@ QString US_ReporterGMP::calc_replicates_averages( void )
QString replicate_group_number = get_replicate_group_number( ch_alt_desc );
- html_str_replicate_av += "\n" + indent( 2 ) + tr( "Replicate Group #%1: [Channels: %2]
\n" )
+ html_str_replicate_av += "\n" + indent( 2 ) + tr( "Replicate Group #%1: [Channels: %2 (%3)]
\n" )
.arg( replicate_group_number )
- .arg( unique_channels.join(",") );
+ .arg( unique_channels.join(",") )
+ .arg( o_type );
//iterate over unique wvls
@@ -7548,7 +7550,7 @@ QString US_ReporterGMP::calc_replicates_averages( void )
QString replicate_subgroup_triples;
for ( int jj=0; jj < same_wvls_chann_map[ u_wvl ].size(); ++jj )
- replicate_subgroup_triples += same_wvls_chann_map[ u_wvl ][ jj ] + "." + u_wvl + ",";
+ replicate_subgroup_triples += same_wvls_chann_map[ u_wvl ][ jj ].split(":")[0] + "." + u_wvl + ",";
replicate_subgroup_triples.chop(1);
From b42bbe513209718e104b23a6c8e1f2f7389282c6 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 22 Oct 2024 18:23:37 -0500
Subject: [PATCH 28/32] [fix 2 plu debugs for -- ] GMP : Reporting Averages
over Replicates for all Optics types -- attemp to resolve, will be tested on
Workshop DB for specifically created combo-run out of uploaded form disk
data...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index ee91081fa..ae29666d8 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -5356,6 +5356,11 @@ bool US_ReporterGMP::modelGuidExistsForStage_ind( QString triple_n, QString mode
QString c_triple_n = Array_of_tripleNames[ i ];
c_triple_n. replace(".","");
+ qDebug() << "IN modelGuidExistsForStage_ind(): triple_n, c_triple_n, model -- "
+ << triple_n << c_triple_n << model;
+ qDebug() << "IN modelGuidExistsForStage_ind(): mguid, Triple_to_ModelsDescGuid[ Array_of_tripleNames[ i ] ][ model ] -- "
+ << mguid << Triple_to_ModelsDescGuid[ Array_of_tripleNames[ i ] ][ model ];
+
if ( c_triple_n == triple_n )
{
QMap< QString, QString > tmapguid = Triple_to_ModelsDescGuid[ Array_of_tripleNames[ i ] ];
From 24e7c8d470c9d64c61ff7a148f446acaeba14ea6 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 22 Oct 2024 18:34:04 -0500
Subject: [PATCH 29/32] [fix 3 plu debugs for -- ] GMP : Reporting Averages
over Replicates for all Optics types -- attemp to resolve, will be tested on
Workshop DB for specifically created combo-run out of uploaded form disk
data...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index ae29666d8..1a64520cd 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -5423,8 +5423,9 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
qDebug() << "INDCOMBO_1: " << modelDescModified[ ii ];
qDebug() << "INDCOMBO_2: " << triplesname << stage_model;
+ qDebug() << "INDCOMBO_3: " << modelGuidExistsForStage_ind( triplesname, stage_model, modelDescModifiedGuid[ ii ] );
//fiter by type|model
- if ( modelDescModified[ ii ].contains( triplesname ) &&
+ if ( modelDescModified[ ii ].contains( triplesname.replace("Interference","660") ) &&
modelDescModified[ ii ].contains( stage_model ) &&
modelGuidExistsForStage_ind( triplesname, stage_model, modelDescModifiedGuid[ ii ] ) )
{
From 9c0235f68ee752512d20ff33cd258aa86510c9f3 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 22 Oct 2024 18:46:16 -0500
Subject: [PATCH 30/32] [fix 4a plu debugs for -- ] GMP : Reporting Averages
over Replicates for all Optics types -- attemp to resolve, will be tested on
Workshop DB for specifically created combo-run out of uploaded form disk
data...
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index 1a64520cd..22e293d0a 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -5420,12 +5420,15 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
for ( int ii = 0; ii < modelDescModified.size(); ii++ )
{
-
+ QString triplesname_mod = triplesname;
+ if ( triplesname.contains("Interference") )
+ triplesname_mod = triplesname_mod.replace( "Interference" , "660");
+
qDebug() << "INDCOMBO_1: " << modelDescModified[ ii ];
qDebug() << "INDCOMBO_2: " << triplesname << stage_model;
- qDebug() << "INDCOMBO_3: " << modelGuidExistsForStage_ind( triplesname, stage_model, modelDescModifiedGuid[ ii ] );
+
//fiter by type|model
- if ( modelDescModified[ ii ].contains( triplesname.replace("Interference","660") ) &&
+ if ( modelDescModified[ ii ].contains( triplesname_mod ) &&
modelDescModified[ ii ].contains( stage_model ) &&
modelGuidExistsForStage_ind( triplesname, stage_model, modelDescModifiedGuid[ ii ] ) )
{
From 6c7123e45d24aa48424153b288f2e4c6bf7914a0 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 29 Oct 2024 15:22:04 -0500
Subject: [PATCH 31/32] GMP : C(s) ranges for indiv. distribs.....
---
programs/us_reporter_gmp/us_reporter_gmp.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index 22e293d0a..210a63c54 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -5489,6 +5489,11 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
//ALEXEY: here it plots s20 combPlot (xtype == 0)
plotted_ids_colors_map_s_type = sdiag_combplot-> changedPlotX_auto( 0, c_parms );
+ /***
+ in ABOVE's c_parms["Minimum"/"Maximum"], are uniformly set for "s" type !!!
+ NOT by per-triple basis!
+ ****/
+
write_plot( imgComb02File, sdiag_combplot->rp_data_plot1() ); //<-- rp_data_plot1() gives combined plot
imgComb02File.replace( svgext, pngext );
From f72d501c33cb3502d44bc4d58518aa78af5a5c25 Mon Sep 17 00:00:00 2001
From: alexsav815
Date: Tue, 29 Oct 2024 18:47:42 -0500
Subject: [PATCH 32/32] GMP : C(s) ranges for indiv. distribs; passed Aprofile
params for min/max into ddist plots & to GMP report.....
---
.../us_ddist_combine/us_ddist_combine.cpp | 11 +++
programs/us_reporter_gmp/us_reporter_gmp.cpp | 82 ++++++++++++++++---
programs/us_reporter_gmp/us_reporter_gmp.h | 1 +
3 files changed, 83 insertions(+), 11 deletions(-)
diff --git a/programs/us_ddist_combine/us_ddist_combine.cpp b/programs/us_ddist_combine/us_ddist_combine.cpp
index e28b6d361..3f001bfae 100644
--- a/programs/us_ddist_combine/us_ddist_combine.cpp
+++ b/programs/us_ddist_combine/us_ddist_combine.cpp
@@ -1137,6 +1137,7 @@ void US_DDistr_Combine::plot_distr_auto( DistrDesc ddesc, QString distrID, QMap<
QString ranges_p;
qDebug() << "c_ranges, begin -- " << c_parms[ "Ranges" ];
+ qDebug() << "c_parms.keys() -- " << c_parms.keys();
QMap::iterator jj;
for ( jj = c_parms.begin(); jj != c_parms.end(); ++jj )
@@ -1149,6 +1150,16 @@ void US_DDistr_Combine::plot_distr_auto( DistrDesc ddesc, QString distrID, QMap<
xmax_p = jj.value().toDouble();
else if ( jj.key().contains( "Ranges" ) )
ranges_p = jj.value();
+ else if ( jj.key().contains( "s_ranges" ) )
+ {
+ xmin_p = jj.value().split(",")[0].toDouble();
+ xmax_p = jj.value().split(",")[1].toDouble();
+ }
+ else if ( jj.key().contains( "k_ranges" ) )
+ {
+ xmin_p = jj.value().split(",")[0].toDouble();
+ xmax_p = jj.value().split(",")[1].toDouble();
+ }
}
qDebug() << "In plot_distr_auto(): sigma_p, xmin_p, xmax_p, ranges_p -- "
diff --git a/programs/us_reporter_gmp/us_reporter_gmp.cpp b/programs/us_reporter_gmp/us_reporter_gmp.cpp
index 210a63c54..41d0dffb5 100644
--- a/programs/us_reporter_gmp/us_reporter_gmp.cpp
+++ b/programs/us_reporter_gmp/us_reporter_gmp.cpp
@@ -5383,9 +5383,10 @@ bool US_ReporterGMP::modelGuidExistsForStage_ind( QString triple_n, QString mode
//Individual Combined Plots
void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p, QString stage_model )
{
+ QString triplesname_passed = triplesname_p;
QString filename_passed = get_filename( triplesname_p );
QString triplesname = triplesname_p.replace(".","");
-
+
sdiag_combplot = new US_DDistr_Combine( "REPORT" );
QStringList runIDs_single;
@@ -5420,13 +5421,20 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
for ( int ii = 0; ii < modelDescModified.size(); ii++ )
{
- QString triplesname_mod = triplesname;
+ QString triplesname_mod = triplesname;
+ QString triplesname_chann; //Should be "1A:UV/vis." OR "1A:Interf."
+
if ( triplesname.contains("Interference") )
- triplesname_mod = triplesname_mod.replace( "Interference" , "660");
+ {
+ triplesname_mod = triplesname_mod.replace( "Interference" , "660");
+ triplesname_chann = triplesname_passed.split(".")[0] + triplesname_passed.split(".")[1] + ":Interf.";
+ }
+ else
+ triplesname_chann = triplesname_passed.split(".")[0] + triplesname_passed.split(".")[1] + ":UV/vis.";
qDebug() << "INDCOMBO_1: " << modelDescModified[ ii ];
- qDebug() << "INDCOMBO_2: " << triplesname << stage_model;
-
+ qDebug() << "INDCOMBO_2: " << triplesname << stage_model << triplesname_chann;
+
//fiter by type|model
if ( modelDescModified[ ii ].contains( triplesname_mod ) &&
modelDescModified[ ii ].contains( stage_model ) &&
@@ -5434,6 +5442,9 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
{
qDebug() << "INDCOMBO_3: YES ";
+ //compose map of [{"s_ranges","k_ranges"}, etc] from cAP2 & cAPp (for given channel & model!!!)
+ QMap< QString, QStringList > sim_ranges = find_sim_ranges( triplesname_chann, stage_model );
+
QString t_m = "s," + stage_model;
QMap < QString, QString > c_params = comboPlotsMap[ t_m ];
//ALEXEY: here it plots s20 combPlot (xtype == 0) -- Need to do first thing!!!
@@ -5484,17 +5495,19 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
c_parms = comboPlotsMap[ t_m ];
//put ranges into c_parms:
c_parms[ "Ranges" ] = ranges.join(",");
+
+ qDebug() << "s-type: sim_ranges.keys(), sim_ranges[\"s_ranges\"] -- "
+ << sim_ranges.keys()
+ << sim_ranges["s_ranges"];
+ if ( sim_ranges. contains("s_ranges") )
+ c_parms[ "s_ranges" ] = sim_ranges["s_ranges"].join(",");
+
//qDebug() << "over models: c_params -- " << c_params;
//ALEXEY: here it plots s20 combPlot (xtype == 0)
plotted_ids_colors_map_s_type = sdiag_combplot-> changedPlotX_auto( 0, c_parms );
- /***
- in ABOVE's c_parms["Minimum"/"Maximum"], are uniformly set for "s" type !!!
- NOT by per-triple basis!
- ****/
-
-
+
write_plot( imgComb02File, sdiag_combplot->rp_data_plot1() ); //<-- rp_data_plot1() gives combined plot
imgComb02File.replace( svgext, pngext );
CombPlotsFileNames << imgComb02File;
@@ -5549,6 +5562,9 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
c_parms = comboPlotsMap[ t_m ];
//put ranges into c_parms:
c_parms[ "Ranges" ] = ranges.join(",");
+
+ if ( sim_ranges. contains("k_ranges") )
+ c_parms[ "k_ranges" ] = sim_ranges["k_ranges"].join(",");
plotted_ids_colors_map_s_type = sdiag_combplot-> changedPlotX_auto( 3, c_parms );
@@ -5571,6 +5587,50 @@ void US_ReporterGMP::process_combined_plots_individual ( QString triplesname_p,
qApp->processEvents();
}
+//pull s_ranges, k_ranges from AProfile
+QMap< QString, QStringList > US_ReporterGMP::find_sim_ranges( QString chann_desc, QString model )
+{
+ QMap < QString, QStringList > sim_ranges;
+
+ qDebug() << "[in find_sim_ranges()1] -- " << chann_desc << model;
+
+ if ( model. contains("2DSA") )
+ {
+ //2DSA
+ for (int i=0; i find_sim_ranges( QString, QString );
QMap read_autoflowGMPReportEsign_record(QString); //!< Read autoflow GMP report electronic signature record
void get_assigned_oper_revs(QJsonDocument, QStringList&); //!< Get assigned operator revisions