From c285c0d0fdcd67d019109be338879f2b5372bfad Mon Sep 17 00:00:00 2001 From: Riccardo Maria Bianchi <riccardo.maria.bianchi@cern.ch> Date: Sun, 31 May 2020 08:07:03 +0200 Subject: [PATCH] Starting removing Qt5 from GeoModelWrite --- .../GeoModelDBManager/GMDBManager.h | 16 +- GeoModelDBManager/src/GMDBManager.cpp | 153 +++++++-- GeoModelWrite/GeoModelWrite/WriteGeoModel.h | 28 +- GeoModelWrite/src/WriteGeoModel.cpp | 307 +++++++++--------- 4 files changed, 316 insertions(+), 188 deletions(-) diff --git a/GeoModelDBManager/GeoModelDBManager/GMDBManager.h b/GeoModelDBManager/GeoModelDBManager/GMDBManager.h index d5a49139d..cd4090a61 100644 --- a/GeoModelDBManager/GeoModelDBManager/GMDBManager.h +++ b/GeoModelDBManager/GeoModelDBManager/GMDBManager.h @@ -17,6 +17,8 @@ // include C++ #include <iostream> #include <unordered_map> +#include <vector> +#include <string> /** * \class GMDBManager @@ -147,7 +149,11 @@ public: bool addListOfRecords(const QString geoType, const std::vector<QStringList> records); + bool addListOfRecords(const std::string geoType, const std::vector<std::vector<std::string>> records); + bool addListOfRecordsToTable(const QString tableName, const std::vector<QStringList> records); + bool addListOfRecordsToTable(const std::string tableName, const std::vector<std::vector<std::string>> records); + bool addListOfRecordsToTableOld(const QString tableName, const std::vector<QStringList> records); bool addListOfChildrenPositions(const std::vector<QStringList> records); @@ -212,7 +218,9 @@ private: QSqlQuery selectAllFromTableSortBy(QString tableName, std::string sortColumn="") const; - void storeTableColumnNames(QStringList input); +// void storeTableColumnNames(QStringList input); + void storeTableColumnNames(std::vector<std::string> input); + QStringList getTableColumnNames(QString tableName); void printTableColNamesFromDB(QString tableName) const; @@ -230,8 +238,10 @@ private: bool m_deepDebug; - QMap<QString, QStringList> m_tableNames; - QMap<QString, QString> m_childType_tableName; +// QMap<QString, QStringList> m_tableNames; +// QMap<QString, QString> m_childType_tableName; + std::unordered_map<std::string, std::vector<std::string>> m_tableNames; /// stores the column names for each table + std::unordered_map<std::string, std::string> m_childType_tableName; }; #endif // GMDBManager_H diff --git a/GeoModelDBManager/src/GMDBManager.cpp b/GeoModelDBManager/src/GMDBManager.cpp index 3db7b6fc9..195cf1c5f 100644 --- a/GeoModelDBManager/src/GMDBManager.cpp +++ b/GeoModelDBManager/src/GMDBManager.cpp @@ -16,6 +16,17 @@ static std::string dbversion = "0.3.0"; // added GeoElement support (Sep 2019) +// TODO: move this to utility class/file +std::vector<std::string> toStdVectorStrings(QStringList qlist) +{ + std::vector<std::string> vec; + foreach(QString qstr, qlist) { + vec.push_back(qstr.toStdString()); + } + return vec; +} + + GMDBManager::GMDBManager(const QString &path) : m_dbpath(path), m_dbIsOK(false), m_deepDebug(false) { // JFB commented: qDebug() << "GMDBManager: constructor"; @@ -362,6 +373,32 @@ bool GMDBManager::addListOfRecords(const QString geoType, const std::vector<QStr return true; } + +bool GMDBManager::addListOfRecords(const std::string geoType, const std::vector<std::vector<std::string>> records) +{ +// if (m_deepDebug) qDebug() << "GMDBManager::addListOfRecords():" << geoType; + + std::string tableName = m_childType_tableName[geoType]; + + if (tableName.size() == 0) { + //qWarning() << "m_childType_tableName:" << m_childType_tableName; + std::cout << "ERROR!! could not retrieve tableName for node type '" << geoType << "'!! Aborting..."; + exit(EXIT_FAILURE); + } + + if (records.size() > 0 ) { + // NOTE: Choose the right function!! + return addListOfRecordsToTable(tableName, records); // better, but needs SQLite >= 3.7.11 + //return addListOfRecordsToTableOld(tableName, records); // old SQLite versions + } + else + std::cout << "Info: no records to save for geoType '" << geoType << "'. Skipping..."; + return true; +} + + + + // ***Note*** // the syntax built here below is more convenient // but it is supported only in SQLite >= 3.7.11 @@ -416,6 +453,63 @@ bool GMDBManager::addListOfRecordsToTable(const QString tableName, const std::ve } +// ***Note*** +// the syntax built here below is more convenient +// but it is supported only in SQLite >= 3.7.11 +// ...but SLC6 only has 3.7.9! +// here we build a query like this: +// queryStr = QString("INSERT INTO Materials (id, name) VALUES (1,'Air'), (2,'Silicon'), (368,'ShieldSteel');"); +// +bool GMDBManager::addListOfRecordsToTable(const std::string tableName, const std::vector<std::vector<std::string>> records) +{ + // get table columns and format them for query + QString tableColString = "(" + m_tableNames[tableName].join(", ") + ")"; + + + + + unsigned int nRecords = records.size(); + qInfo() << "number of " << tableName << "records to insert into the DB:" << nRecords; + + // preparing the SQL query + QString queryStr("INSERT INTO %1 %2 VALUES "); + queryStr = queryStr.arg(tableName); // insert table name + queryStr = queryStr.arg(tableColString); // insert table columns + + unsigned int nMat = nRecords; + unsigned int id = 0; + foreach(QStringList rec, records) { + //qDebug() << "rec:" << rec; + + ++id; + QStringList items; + + foreach (QString item, rec) { + items << '"' + item + '"'; + } + QString values = items.join(","); + queryStr += " (" + QString::number(id) + "," + values + ")"; + if (id != nMat) + queryStr += ","; + else + queryStr += ";"; + + } + // JFB commented: qDebug() << "queryStr:" << queryStr; + + // executing the SQL query + QSqlQuery q; + if (!q.exec(queryStr)) { + qWarning() << "ERROR!!! SQL error:"; + showError(q.lastError()); + return false; + } + + // JFB commented: qDebug() << "DONE. The list of records have been inserted into the DB."; + return true; +} + + // ***Note*** // old syntax, for SQLite in SLC6 @@ -1353,6 +1447,9 @@ bool GMDBManager::createTables() QString geoNode; QString tableName; QString queryStr; + + + // create a table to store the relation between the types of GeoNodes and the name of the table tableName = "dbversion"; @@ -1366,13 +1463,13 @@ bool GMDBManager::createTables() showError(q.lastError()); return false; } - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); // create a table to store the relation between the types of GeoNodes and the name of the table tableName = "GeoNodesTypes"; tab << tableName << "id" << "nodeType" << "tableName"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); if (!q.exec(QLatin1String("create table GeoNodesTypes(id integer primary key, nodeType varchar, tableName varchar)"))) { showError(q.lastError()); @@ -1391,7 +1488,7 @@ bool GMDBManager::createTables() showError(q.lastError()); return false; } - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); @@ -1407,7 +1504,7 @@ bool GMDBManager::createTables() showError(q.lastError()); return false; } - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); @@ -1415,7 +1512,7 @@ bool GMDBManager::createTables() geoNode = "GeoPhysVol"; tableName = "PhysVols"; tab << tableName << "id" << "logvol" << "parent"; // FIXME: remove "parent" field, it is not used anymore and it's not reliable since it's not using the tableID. - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table PhysVols(id integer primary key, logvol integer not null, parent integer)"))) { @@ -1429,7 +1526,7 @@ bool GMDBManager::createTables() geoNode = "GeoFullPhysVol"; tableName = "FullPhysVols"; tab << tableName << "id" << "logvol" << "parent"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table FullPhysVols(id integer primary key, logvol integer not null, parent integer)"))) { @@ -1443,7 +1540,7 @@ bool GMDBManager::createTables() geoNode = "GeoLogVol"; tableName = "LogVols"; tab << tableName << "id" << "name" << "shape" << "material"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table LogVols(id integer primary key, name varchar, shape integer not null, material integer not null)"))) { @@ -1457,7 +1554,7 @@ bool GMDBManager::createTables() geoNode = "GeoMaterial"; tableName = "Materials"; tab << tableName << "id" << "name" << "density" << "elements"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table Materials(id integer primary key, name varchar, density varchar, elements varchar)"))) { @@ -1471,8 +1568,7 @@ bool GMDBManager::createTables() geoNode = "GeoElement"; tableName = "Elements"; tab << tableName << "id" << "name" << "symbol" << "Z" << "A"; - - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table Elements(id integer primary key, name varchar, symbol varchar, Z varchar, A varchar)"))) { @@ -1486,7 +1582,7 @@ bool GMDBManager::createTables() geoNode = "GeoShape"; tableName = "Shapes"; tab << tableName << "id" << "type" << "parameters"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table Shapes(id integer primary key, type varchar, parameters varchar)"))) { @@ -1500,7 +1596,7 @@ bool GMDBManager::createTables() geoNode = "GeoSerialDenominator"; tableName = "SerialDenominators"; tab << tableName << "id" << "baseName"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table SerialDenominators(id integer primary key, baseName varchar)"))) { @@ -1514,7 +1610,7 @@ bool GMDBManager::createTables() geoNode = "Function"; tableName = "Functions"; tab << tableName << "id" << "expression"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table Functions(id integer primary key, expression varchar)"))) { @@ -1529,7 +1625,7 @@ bool GMDBManager::createTables() tableName = "SerialTransformers"; m_childType_tableName[geoNode] = tableName; // store type-table relation tab << tableName << "id" << "funcId" << "volId" << "volTable" << "copies"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); queryStr = QString("create table %1(%2 integer primary key, %3 integer not null REFERENCES Functions(id), %4 integer not null, %5 integer not null REFERENCES GeoNodesTypes(id), %6 integer)"); for (int i=0; i < tab.size(); ++i) { queryStr = queryStr.arg( tab.at(i) ); @@ -1548,7 +1644,7 @@ bool GMDBManager::createTables() geoNode = "GeoTransform"; tableName = "Transforms"; tab << tableName << "id" << "xx" << "xy" << "xz" << "yx" << "yy" << "yz" << "zx" << "zy" << "zz" << "dx" << "dy" << "dz"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table Transforms(id integer primary key, xx real, xy real, xz real, yx real, yy real, yz real, zx real, zy real, zz real, dx real, dy real, dz real)"))) { @@ -1562,7 +1658,7 @@ bool GMDBManager::createTables() geoNode = "GeoAlignableTransform"; tableName = "AlignableTransforms"; tab << tableName << "id" << "xx" << "xy" << "xz" << "yx" << "yy" << "yz" << "zx" << "zy" << "zz" << "dx" << "dy" << "dz"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); tab.clear(); m_childType_tableName[geoNode] = tableName; // store type-table relation if (!q.exec(QLatin1String("create table AlignableTransforms(id integer primary key, xx real, xy real, xz real, yx real, yy real, yz real, zx real, zy real, zz real, dx real, dy real, dz real)"))) { @@ -1577,7 +1673,7 @@ bool GMDBManager::createTables() tableName = "NameTags"; m_childType_tableName[geoNode] = tableName; // store type-table relation tab << tableName << "id" << "name"; - storeTableColumnNames(tab); + storeTableColumnNames(toStdVectorStrings(tab)); queryStr = QString("create table %1(%2 integer primary key, %3 varchar)"); for (int i=0; i < tab.size(); ++i) { queryStr = queryStr.arg( tab.at(i) ); @@ -1609,15 +1705,26 @@ void GMDBManager::loadTableNamesFromDB() // qDebug() << "m_tableNames:" << m_tableNames; } -void GMDBManager::storeTableColumnNames(QStringList input) +//void GMDBManager::storeTableColumnNames(QStringList input) +//{ +// // qDebug() << "GMDBManager::storeTableColumnNames()"; +// if (! (input.isEmpty()) ) { +// QString tabName = input.takeFirst(); +// m_tableNames[tabName] = input; +// } +//} + +void GMDBManager::storeTableColumnNames(std::vector<std::string> input) { - // qDebug() << "GMDBManager::storeTableColumnNames()"; - if (! (input.isEmpty()) ) { - QString tabName = input.takeFirst(); - m_tableNames[tabName] = input; - } + // qDebug() << "GMDBManager::storeTableColumnNames()"; + if (! (input.size() == 0) ) { + std::string tabName = input.takeFirst(); // get the first element storing the name of the table + input.erase(input.begin()); // remove the first element storing the name of the table + m_tableNames[tabName] = input; + } } + QStringList GMDBManager::getTableColumnNames(QString tableName) { // qDebug() << "GMDBManager::getTableColumnNames()"; diff --git a/GeoModelWrite/GeoModelWrite/WriteGeoModel.h b/GeoModelWrite/GeoModelWrite/WriteGeoModel.h index f101a7a2c..95d6a66f6 100644 --- a/GeoModelWrite/GeoModelWrite/WriteGeoModel.h +++ b/GeoModelWrite/GeoModelWrite/WriteGeoModel.h @@ -29,6 +29,10 @@ #include <QString> #include <QMap> +// C++ includes +#include <vector> +#include <string> + namespace GeoModelIO { @@ -86,7 +90,7 @@ private: QVariant storeObj(const GeoMaterial* pointer, const QString name, const QString density, const QString elements); QVariant storeObj(const GeoElement* pointer, const QString name, const QString symbol, const QString elZ, const QString elA); - QVariant storeObj(const GeoShape* pointer, const QString type, const QString parameters); + QVariant storeObj(const GeoShape* pointer, const std::string type, const std::string parameters); QVariant storeObj(const GeoLogVol* pointer, const QString name, const QVariant shapeId, const QVariant materialId); QVariant storeObj(const GeoPhysVol* pointer, const QVariant logvolId, const QVariant parentId = QVariant(), bool isRootVolume = false ); QVariant storeObj(const GeoFullPhysVol* pointer, const QVariant logvolId, const QVariant parentId = QVariant(), bool isRootVolume = false ); @@ -97,7 +101,9 @@ private: QVariant storeObj(const GeoAlignableTransform* pointer, const std::vector<double> parameters); QVariant storeObj(const GeoNameTag* pointer, const QString name); - unsigned int addRecord(std::vector<QStringList>* container, const QStringList values) const; + unsigned int addRecord(std::vector<QStringList>* container, const QStringList values) const; + unsigned int addRecord(std::vector<std::vector<std::string>>* container, const std::vector<std::string> values) const; + QVariant addMaterial(const QString name, const QString density, const QString elements); QVariant addElement(const QString name, const QString symbol, const QString elZ, const QString elA); QVariant addNameTag(const QString name); @@ -105,7 +111,7 @@ private: QVariant addTransform(const std::vector<double> params); QVariant addFunction(const QString expression); QVariant addSerialTransformer(const QVariant &funcId, const QVariant &physvolId, const QString volType, const unsigned int &copies); - QVariant addShape(const QString &type, const QString ¶meters); + QVariant addShape(const std::string &type, const std::string ¶meters); QVariant addSerialDenominator(const QString &baseName); QVariant addPhysVol(const QVariant &logVolId, const QVariant &parentPhysVolId, bool isRootVolume = false); QVariant addFullPhysVol(const QVariant &logVolId, const QVariant &parentPhysVolId, bool isRootVolume = false); @@ -139,7 +145,7 @@ private: QString getQStringFromOss(std::ostringstream &oss); std::vector<double> getTransformParameters(GeoTrf::Transform3D); // TODO: to be moved to Eigen (GeoTrf) and to be moved to an Utility class, so we can use it from TransFunctionRecorder as well. - QString getShapeParameters(const GeoShape*); + std::string getShapeParameters(const GeoShape*); QString getGeoTypeFromVPhysVol(const GeoVPhysVol* vol); @@ -163,7 +169,7 @@ private: std::vector<QStringList> m_logVols; std::vector<QStringList> m_physVols; std::vector<QStringList> m_fullPhysVols; - std::vector<QStringList> m_shapes; +// std::vector<QStringList> m_shapes; std::vector<QStringList> m_materials; std::vector<QStringList> m_elements; std::vector<QStringList> m_transforms; @@ -172,11 +178,15 @@ private: std::vector<QStringList> m_serialTransformers; std::vector<QStringList> m_functions; std::vector<QStringList> m_nameTags; - std::vector<QStringList> m_childrenPositions; - QStringList m_rootVolume; - - QStringList m_objectsNotPersistified; + + std::vector<std::vector<std::string>> m_shapes; + + QStringList m_rootVolume; + + +// QStringList m_objectsNotPersistified; + std::vector<std::string> m_objectsNotPersistified; }; diff --git a/GeoModelWrite/src/WriteGeoModel.cpp b/GeoModelWrite/src/WriteGeoModel.cpp index 3fbf52f15..9defe19bb 100644 --- a/GeoModelWrite/src/WriteGeoModel.cpp +++ b/GeoModelWrite/src/WriteGeoModel.cpp @@ -48,7 +48,23 @@ namespace GeoModelIO { - + // TODO: should go to an utility class + std::string joinVectorStrings(std::vector<std::string> vec, std::string sep="") { + std::string s; + for (const auto &piece : vec) s += (piece + sep); + return s; + } + + // TODO: move this to utility class/file + void printStdVectorStrings(std::vector<std::string> vec) + { + for ( const auto& str : vec) { + std::cout << str << " "; + } + std::cout << std::endl; + return; + } + /// Get next child position available, given the parent type, id and copy number unsigned int WriteGeoModel::getChildPosition(const QString parentId, const QString parentType, const unsigned int copyN) { @@ -631,14 +647,18 @@ QStringList WriteGeoModel::getParentNode() //__________________________________________________________________ QVariant WriteGeoModel::storeShape(const GeoShape* shape) { - QString shapeType = QString::fromStdString(shape->type()); +// QString shapeType = QString::fromStdString(shape->type()); + std::string shapeType = shape->type(); + + //JFB Commented out: qDebug() << "storeShape() - shape name:" << shapeType << ", address:" << shape; // LArCustomShape is deprecated. Write it out as a GeoUnidentifiedShape; if (shapeType=="CustomShape") shapeType="UnidentifiedShape"; // get shape parameters - QString shapePars = getShapeParameters(shape); +// QString shapePars = getShapeParameters(shape); + std::string shapePars = getShapeParameters(shape); // store the shape in the DB and returns the ID return storeObj(shape, shapeType, shapePars); @@ -880,32 +900,30 @@ void WriteGeoModel::handleReferencedVPhysVol (const GeoVPhysVol *vol) // Get shape parameters -QString WriteGeoModel::getShapeParameters(const GeoShape* shape) +std::string WriteGeoModel::getShapeParameters(const GeoShape* shape) { - const QString shapeType = QString::fromStdString(shape->type()); + const std::string shapeType = shape->type(); //JFB Commented out: qDebug() << "shapeType:" << shapeType; - QString shapePars = ""; + std::string shapePars = ""; + std::vector<std::string> pars; if (shapeType == "Box") { //JFB Commented out: qDebug() << "get GeoBox parameters"; - QStringList pars; const GeoBox* box = dynamic_cast<const GeoBox*>(shape); - pars << "XHalfLength=" + QString::number(box->getXHalfLength()) ; - pars << "YHalfLength=" + QString::number(box->getYHalfLength()) ; - pars << "ZHalfLength=" + QString::number(box->getZHalfLength()) ; - shapePars = pars.join(";"); + pars.push_back("XHalfLength=" + std::to_string(box->getXHalfLength())) ; + pars.push_back("YHalfLength=" + std::to_string(box->getYHalfLength())) ; + pars.push_back("ZHalfLength=" + std::to_string(box->getZHalfLength())) ; + shapePars = joinVectorStrings(pars,";"); } else if (shapeType == "Cons") { - QStringList pars; const GeoCons* shapeIn = dynamic_cast<const GeoCons*>(shape); - pars << "RMin1=" + QString::number(shapeIn->getRMin1()) ; - pars << "RMin2=" + QString::number(shapeIn->getRMin2()) ; - pars << "RMax1=" + QString::number(shapeIn->getRMax1()) ; - pars << "RMax2=" + QString::number(shapeIn->getRMax2()) ; - pars << "DZ=" + QString::number(shapeIn->getDZ()) ; - pars << "SPhi=" + QString::number(shapeIn->getSPhi()) ; - pars << "DPhi=" + QString::number(shapeIn->getDPhi()) ; - shapePars = pars.join(";"); + pars.push_back("RMin1=" + std::to_string(shapeIn->getRMin1())) ; + pars.push_back("RMin2=" + std::to_string(shapeIn->getRMin2())) ; + pars.push_back("RMax1=" + std::to_string(shapeIn->getRMax1())) ; + pars.push_back("RMax2=" + std::to_string(shapeIn->getRMax2())) ; + pars.push_back("DZ=" + std::to_string(shapeIn->getDZ())) ; + pars.push_back("SPhi=" + std::to_string(shapeIn->getSPhi())) ; + pars.push_back("DPhi=" + std::to_string(shapeIn->getDPhi())) ; } else if (shapeType == "Torus") { // Member Data: // * Rmax - outside radius of the torus tube @@ -915,150 +933,133 @@ QString WriteGeoModel::getShapeParameters(const GeoShape* shape) // * SPhi - starting angle of the segment in radians // * DPhi - delta angle of the segment in radians // - QStringList pars; const GeoTorus* shapeIn = dynamic_cast<const GeoTorus*>(shape); - pars << "Rmin=" + QString::number(shapeIn->getRMin()) ; - pars << "Rmax=" + QString::number(shapeIn->getRMax()) ; - pars << "Rtor=" + QString::number(shapeIn->getRTor()) ; - pars << "SPhi=" + QString::number(shapeIn->getSPhi()) ; - pars << "DPhi=" + QString::number(shapeIn->getDPhi()) ; - shapePars = pars.join(";"); - } else if (shapeType == "Para") { - QStringList pars; + pars.push_back("Rmin=" + std::to_string(shapeIn->getRMin())) ; + pars.push_back("Rmax=" + std::to_string(shapeIn->getRMax())) ; + pars.push_back("Rtor=" + std::to_string(shapeIn->getRTor())) ; + pars.push_back("SPhi=" + std::to_string(shapeIn->getSPhi())) ; + pars.push_back("DPhi=" + std::to_string(shapeIn->getDPhi())) ; + } + else if (shapeType == "Para") { const GeoPara* shapeIn = dynamic_cast<const GeoPara*>(shape); - pars << "XHalfLength=" + QString::number(shapeIn->getXHalfLength()) ; - pars << "YHalfLength=" + QString::number(shapeIn->getYHalfLength()) ; - pars << "ZHalfLength=" + QString::number(shapeIn->getZHalfLength()) ; - pars << "Alpha=" + QString::number(shapeIn->getAlpha()) ; - pars << "Theta=" + QString::number(shapeIn->getTheta()) ; - pars << "Phi=" + QString::number(shapeIn->getPhi()) ; - shapePars = pars.join(";"); - } else if (shapeType == "Pcon") { - QStringList pars; + pars.push_back("XHalfLength=" + std::to_string(shapeIn->getXHalfLength())) ; + pars.push_back("YHalfLength=" + std::to_string(shapeIn->getYHalfLength())) ; + pars.push_back("ZHalfLength=" + std::to_string(shapeIn->getZHalfLength())) ; + pars.push_back("Alpha=" + std::to_string(shapeIn->getAlpha())) ; + pars.push_back("Theta=" + std::to_string(shapeIn->getTheta())) ; + pars.push_back("Phi=" + std::to_string(shapeIn->getPhi())) ; + } + else if (shapeType == "Pcon") { const GeoPcon* shapeIn = dynamic_cast<const GeoPcon*>(shape); - pars << "SPhi=" + QString::number(shapeIn->getSPhi()); - pars << "DPhi=" + QString::number(shapeIn->getDPhi()); + pars.push_back("SPhi=" + std::to_string(shapeIn->getSPhi())); + pars.push_back("DPhi=" + std::to_string(shapeIn->getDPhi())); // get number of Z planes and loop over them const int nZplanes = shapeIn->getNPlanes(); - pars << "NZPlanes=" + QString::number(nZplanes); + pars.push_back("NZPlanes=" + std::to_string(nZplanes)); for (int i=0; i<nZplanes; ++i) { - pars << "ZPos=" + QString::number(shapeIn->getZPlane(i)); - pars << "ZRmin=" + QString::number(shapeIn->getRMinPlane(i)); - pars << "ZRmax=" + QString::number(shapeIn->getRMaxPlane(i)); + pars.push_back("ZPos=" + std::to_string(shapeIn->getZPlane(i))); + pars.push_back("ZRmin=" + std::to_string(shapeIn->getRMinPlane(i))); + pars.push_back("ZRmax=" + std::to_string(shapeIn->getRMaxPlane(i))); } - shapePars = pars.join(";"); - } else if (shapeType == "Pgon") { - QStringList pars; + } + else if (shapeType == "Pgon") { const GeoPgon* shapeIn = dynamic_cast<const GeoPgon*>(shape); - pars << "SPhi=" + QString::number(shapeIn->getSPhi()) ; - pars << "DPhi=" + QString::number(shapeIn->getDPhi()) ; - pars << "NSides=" + QString::number(shapeIn->getNSides()) ; + pars.push_back("SPhi=" + std::to_string(shapeIn->getSPhi())) ; + pars.push_back("DPhi=" + std::to_string(shapeIn->getDPhi())) ; + pars.push_back("NSides=" + std::to_string(shapeIn->getNSides())) ; // get number of Z planes and loop over them const int nZplanes = shapeIn->getNPlanes(); - pars << "NZPlanes=" + QString::number(nZplanes); + pars.push_back("NZPlanes=" + std::to_string(nZplanes)); for (int i=0; i<nZplanes; ++i) { - pars << "ZPos=" + QString::number(shapeIn->getZPlane(i)); - pars << "ZRmin=" + QString::number(shapeIn->getRMinPlane(i)); - pars << "ZRmax=" + QString::number(shapeIn->getRMaxPlane(i)); + pars.push_back("ZPos=" + std::to_string(shapeIn->getZPlane(i))); + pars.push_back("ZRmin=" + std::to_string(shapeIn->getRMinPlane(i))); + pars.push_back("ZRmax=" + std::to_string(shapeIn->getRMaxPlane(i))); } - shapePars = pars.join(";"); - } else if (shapeType == "SimplePolygonBrep") { - QStringList pars; + } + else if (shapeType == "SimplePolygonBrep") { const GeoSimplePolygonBrep* shapeIn = dynamic_cast<const GeoSimplePolygonBrep*>(shape); - pars << "DZ=" + QString::number(shapeIn->getDZ()) ; + pars.push_back("DZ=" + std::to_string(shapeIn->getDZ())) ; // get number of vertices and loop over them const int nVertices = shapeIn->getNVertices(); - pars << "NVertices=" + QString::number(nVertices); + pars.push_back("NVertices=" + std::to_string(nVertices)); for (int i=0; i<nVertices; ++i) { - pars << "xV=" + QString::number(shapeIn->getXVertex(i)); - pars << "yV=" + QString::number(shapeIn->getYVertex(i)); + pars.push_back("xV=" + std::to_string(shapeIn->getXVertex(i))); + pars.push_back("yV=" + std::to_string(shapeIn->getYVertex(i))); } - shapePars = pars.join(";"); - } else if (shapeType == "Trap") { - QStringList pars; + } + else if (shapeType == "Trap") { const GeoTrap* shapeIn = dynamic_cast<const GeoTrap*>(shape); - pars << "ZHalfLength=" + QString::number(shapeIn->getZHalfLength()) ; - pars << "Theta=" + QString::number(shapeIn->getTheta()) ; - pars << "Phi=" + QString::number(shapeIn->getPhi()) ; - pars << "Dydzn=" + QString::number(shapeIn->getDydzn()) ; - pars << "Dxdyndzn=" + QString::number(shapeIn->getDxdyndzn()) ; - pars << "Dxdypdzn=" + QString::number(shapeIn->getDxdypdzn()) ; - pars << "Angleydzn=" + QString::number(shapeIn->getAngleydzn()) ; - pars << "Dydzp=" + QString::number(shapeIn->getDydzp()) ; - pars << "Dxdyndzp=" + QString::number(shapeIn->getDxdyndzp()) ; - pars << "Dxdypdzp=" + QString::number(shapeIn->getDxdypdzp()) ; - pars << "Angleydzp=" + QString::number(shapeIn->getAngleydzp()) ; - shapePars = pars.join(";"); - } else if (shapeType == "Trd") { - QStringList pars; + pars.push_back("ZHalfLength=" + std::to_string(shapeIn->getZHalfLength())) ; + pars.push_back("Theta=" + std::to_string(shapeIn->getTheta())) ; + pars.push_back("Phi=" + std::to_string(shapeIn->getPhi())) ; + pars.push_back("Dydzn=" + std::to_string(shapeIn->getDydzn())) ; + pars.push_back("Dxdyndzn=" + std::to_string(shapeIn->getDxdyndzn())) ; + pars.push_back("Dxdypdzn=" + std::to_string(shapeIn->getDxdypdzn())) ; + pars.push_back("Angleydzn=" + std::to_string(shapeIn->getAngleydzn())) ; + pars.push_back("Dydzp=" + std::to_string(shapeIn->getDydzp())) ; + pars.push_back("Dxdyndzp=" + std::to_string(shapeIn->getDxdyndzp())) ; + pars.push_back("Dxdypdzp=" + std::to_string(shapeIn->getDxdypdzp())) ; + pars.push_back("Angleydzp=" + std::to_string(shapeIn->getAngleydzp())) ; + } + else if (shapeType == "Trd") { const GeoTrd* shapeIn = dynamic_cast<const GeoTrd*>(shape); - pars << "XHalfLength1=" + QString::number(shapeIn->getXHalfLength1()) ; - pars << "XHalfLength2=" + QString::number(shapeIn->getXHalfLength2()) ; - pars << "YHalfLength1=" + QString::number(shapeIn->getYHalfLength1()) ; - pars << "YHalfLength2=" + QString::number(shapeIn->getYHalfLength2()) ; - pars << "ZHalfLength=" + QString::number(shapeIn->getZHalfLength()) ; - shapePars = pars.join(";"); - } else if (shapeType == "Tube") { - QStringList pars; + pars.push_back("XHalfLength1=" + std::to_string(shapeIn->getXHalfLength1())) ; + pars.push_back("XHalfLength2=" + std::to_string(shapeIn->getXHalfLength2())) ; + pars.push_back("YHalfLength1=" + std::to_string(shapeIn->getYHalfLength1())) ; + pars.push_back("YHalfLength2=" + std::to_string(shapeIn->getYHalfLength2())) ; + pars.push_back("ZHalfLength=" + std::to_string(shapeIn->getZHalfLength())) ; + } + else if (shapeType == "Tube") { const GeoTube* tube = dynamic_cast<const GeoTube*>(shape); - pars << "RMin=" + QString::number(tube->getRMin()) ; - pars << "RMax=" + QString::number(tube->getRMax()) ; - pars << "ZHalfLength=" + QString::number(tube->getZHalfLength()) ; - shapePars = pars.join(";"); - } else if (shapeType == "Tubs") { - QStringList pars; + pars.push_back("RMin=" + std::to_string(tube->getRMin())) ; + pars.push_back("RMax=" + std::to_string(tube->getRMax())) ; + pars.push_back("ZHalfLength=" + std::to_string(tube->getZHalfLength())) ; + } + else if (shapeType == "Tubs") { const GeoTubs* shapeIn = dynamic_cast<const GeoTubs*>(shape); - pars << "RMin=" + QString::number(shapeIn->getRMin()) ; - pars << "RMax=" + QString::number(shapeIn->getRMax()) ; - pars << "ZHalfLength=" + QString::number(shapeIn->getZHalfLength()) ; - pars << "SPhi=" + QString::number(shapeIn->getSPhi()) ; - pars << "DPhi=" + QString::number(shapeIn->getDPhi()) ; - shapePars = pars.join(";"); - } else if (shapeType == "TessellatedSolid") { - QStringList pars; + pars.push_back("RMin=" + std::to_string(shapeIn->getRMin())) ; + pars.push_back("RMax=" + std::to_string(shapeIn->getRMax())) ; + pars.push_back("ZHalfLength=" + std::to_string(shapeIn->getZHalfLength())) ; + pars.push_back("SPhi=" + std::to_string(shapeIn->getSPhi())) ; + pars.push_back("DPhi=" + std::to_string(shapeIn->getDPhi())) ; + } + else if (shapeType == "TessellatedSolid") { const GeoTessellatedSolid* shapeIn = dynamic_cast<const GeoTessellatedSolid*>(shape); // get number of facets const size_t nFacets = shapeIn->getNumberOfFacets(); - pars << "nFacets=" + QString::number(nFacets); + pars.push_back("nFacets=" + std::to_string(nFacets)); // loop over the facets for (size_t i=0; i<nFacets; ++i) { GeoFacet* facet = shapeIn->getFacet(i); // get GeoFacet actual implementation - if (dynamic_cast<GeoTriangularFacet*>(facet)) pars << "TRI"; - else if (dynamic_cast<GeoQuadrangularFacet*>(facet)) pars << "QUAD"; + if (dynamic_cast<GeoTriangularFacet*>(facet)) pars.push_back("TRI"); + else if (dynamic_cast<GeoQuadrangularFacet*>(facet)) pars.push_back("QUAD"); // get vertex type (ABSOLUTE/RELATIVE) GeoFacet::GeoFacetVertexType facetVertexType = facet->getVertexType(); - if (facetVertexType == GeoFacet::ABSOLUTE) pars << "vT=ABSOLUTE"; - if (facetVertexType == GeoFacet::RELATIVE) pars << "vT=RELATIVE"; + if (facetVertexType == GeoFacet::ABSOLUTE) pars.push_back("vT=ABSOLUTE"); + if (facetVertexType == GeoFacet::RELATIVE) pars.push_back("vT=RELATIVE"); // get number of vertices and loop over them const size_t nVertices = facet->getNumberOfVertices(); - pars << "nV=" + QString::number(nVertices); + pars.push_back("nV=" + std::to_string(nVertices)); for (size_t i=0; i<nVertices; ++i) { GeoFacetVertex facetVertex = facet->getVertex(i); - pars << "xV=" + QString::number( facetVertex[0] ); - pars << "yV=" + QString::number( facetVertex[1] ); - pars << "zV=" + QString::number( facetVertex[2] ); + pars.push_back("xV=" + std::to_string( facetVertex[0] )); + pars.push_back("yV=" + std::to_string( facetVertex[1] )); + pars.push_back("zV=" + std::to_string( facetVertex[2] )); } } - shapePars = pars.join(";"); - //qDebug() << "Tessellated pars:" << shapePars; // debug } else if (shapeType == "Intersection") { - //JFB Commented out: qDebug() << "get GeoShapeIntersection parameters"; - QStringList pars; const GeoShapeIntersection* shapeIn = dynamic_cast<const GeoShapeIntersection*>(shape); // get the referenced Shape used in the 'union' operation, store it in the DB const GeoShape* shapeOpA = shapeIn->getOpA(); QVariant shapeIdA = storeShape(shapeOpA); const GeoShape* shapeOpB = shapeIn->getOpB(); QVariant shapeIdB = storeShape(shapeOpB); - pars << "opA=" + QString::number( shapeIdA.toUInt() ) ; - pars << "opB=" + QString::number( shapeIdB.toUInt() ) ; - shapePars = pars.join(";"); + pars.push_back("opA=" + std::to_string( shapeIdA.toUInt() )) ; + pars.push_back("opB=" + std::to_string( shapeIdB.toUInt() )) ; } else if (shapeType == "Shift") { - //JFB Commented out: qDebug() << "get GeoShapeShift parameters"; - QStringList pars; const GeoShapeShift* shapeIn = dynamic_cast<const GeoShapeShift*>(shape); // get the referenced Shape used in the 'shift' operation, store it in the DB @@ -1069,26 +1070,20 @@ QString WriteGeoModel::getShapeParameters(const GeoShape* shape) GeoTransform* transf = new GeoTransform( shapeIn->getX() ); QVariant trId = storeTranform(transf); - pars << "A=" + QString::number( shapeId.toUInt() ) ; - pars << "X=" + QString::number( trId.toUInt() ) ; - shapePars = pars.join(";"); + pars.push_back("A=" + std::to_string( shapeId.toUInt() )) ; + pars.push_back("X=" + std::to_string( trId.toUInt() )) ; } else if (shapeType == "Subtraction") { - //JFB Commented out: qDebug() << "get GeoShapeSubtraction parameters"; - QStringList pars; const GeoShapeSubtraction* shapeIn = dynamic_cast<const GeoShapeSubtraction*>(shape); // get the referenced Shape used in the 'union' operation, store it in the DB const GeoShape* shapeOpA = shapeIn->getOpA(); QVariant shapeIdA = storeShape(shapeOpA); const GeoShape* shapeOpB = shapeIn->getOpB(); QVariant shapeIdB = storeShape(shapeOpB); - pars << "opA=" + QString::number( shapeIdA.toUInt() ) ; - pars << "opB=" + QString::number( shapeIdB.toUInt() ) ; - shapePars = pars.join(";"); + pars.push_back("opA=" + std::to_string( shapeIdA.toUInt() )) ; + pars.push_back("opB=" + std::to_string( shapeIdB.toUInt() )) ; } else if (shapeType == "Union") { - //JFB Commented out: qDebug() << "get GeoShapeUnion parameters"; - QStringList pars; const GeoShapeUnion* shapeIn = dynamic_cast<const GeoShapeUnion*>(shape); // get the referenced Shape used in the 'union' operation, store it in the DB @@ -1097,27 +1092,22 @@ QString WriteGeoModel::getShapeParameters(const GeoShape* shape) const GeoShape* shapeOpB = shapeIn->getOpB(); QVariant shapeIdB = storeShape(shapeOpB); - pars << "opA=" + QString::number( shapeIdA.toUInt() ) ; - pars << "opB=" + QString::number( shapeIdB.toUInt() ) ; - shapePars = pars.join(";"); + pars.push_back("opA=" + std::to_string( shapeIdA.toUInt() )) ; + pars.push_back("opB=" + std::to_string( shapeIdB.toUInt() )) ; } else if (shapeType=="GenericTrap") { - QStringList pars; const GeoGenericTrap * shapeIn = dynamic_cast<const GeoGenericTrap*>(shape); - pars << "ZHalfLength=" + QString::number(shapeIn->getZHalfLength()); - pars << "NVertices=" + QString::number(shapeIn->getVertices().size()); + pars.push_back("ZHalfLength=" + std::to_string(shapeIn->getZHalfLength())); + pars.push_back("NVertices=" + std::to_string(shapeIn->getVertices().size())); for (int i=0; i<shapeIn->getVertices().size(); ++i) { - pars << "X=" + QString::number(shapeIn->getVertices()[i](0)); - pars << "Y=" + QString::number(shapeIn->getVertices()[i](1)); + pars.push_back("X=" + std::to_string(shapeIn->getVertices()[i](0))); + pars.push_back("Y=" + std::to_string(shapeIn->getVertices()[i](1))); } - shapePars = pars.join(";"); } else if (shapeType=="UnidentifiedShape") { const GeoUnidentifiedShape *shapeIn=dynamic_cast<const GeoUnidentifiedShape *> (shape); - QStringList pars; - pars << "name="+QString::fromStdString(shapeIn->name()); - pars << "asciiData="+QString::fromStdString(shapeIn->asciiData()); - shapePars=pars.join(";"); + pars.push_back("name="+shapeIn->name()); + pars.push_back("asciiData="+shapeIn->asciiData()); } //LAr custom shape // else if(shapeType == "CustomShape") { @@ -1129,9 +1119,12 @@ QString WriteGeoModel::getShapeParameters(const GeoShape* shape) // shapePars=pars.join(";"); // } else { - std::cout << "\n\tWARNING!!! - Shape '" << shapeType.toStdString() << "' needs to be persistified!!\n\n"; - m_objectsNotPersistified << shapeType; + std::cout << "\n\tWARNING!!! - Shape '" << shapeType << "' needs to be persistified!!\n\n"; + printStdVectorStrings(m_objectsNotPersistified); } + + + shapePars = joinVectorStrings(pars,";"); return shapePars; @@ -1256,10 +1249,8 @@ QVariant WriteGeoModel::storeObj(const GeoElement* pointer, const QString name, } -QVariant WriteGeoModel::storeObj(const GeoShape* pointer, const QString name, const QString parameters) + QVariant WriteGeoModel::storeObj(const GeoShape* pointer, const std::string name, const std::string parameters) { - //JFB Commented out: qDebug() << "WriteGeoModel::storeObj(GeoShape*) - name:" << name << "address:" << pointer; - QString address = getAddressStringFromPointer( pointer ); QVariant shapeId; @@ -1499,8 +1490,9 @@ void WriteGeoModel::storeChildPosition(const QVariant parentId, const QString pa } -unsigned int WriteGeoModel::addRecord(std::vector<QStringList>* container, const QStringList values) const -{ +//unsigned int WriteGeoModel::addRecord(std::vector<QStringList>* container, const QStringList values) const + unsigned int WriteGeoModel::addRecord(std::vector<std::vector<std::string>>* container, const std::vector<std::string> values) const + { container->push_back(values); unsigned int idx = container->size(); // index of pushed element = size after pushing, to match ID starting at 1 in the DB return idx; @@ -1600,11 +1592,18 @@ QVariant WriteGeoModel::addSerialTransformer(const QVariant &funcId, const QVari return QVariant( addRecord(container, values) ); } -QVariant WriteGeoModel::addShape(const QString &type, const QString ¶meters) + QVariant WriteGeoModel::addShape(const std::string &type, const std::string ¶meters) { - std::vector<QStringList>* container = &m_shapes; - QStringList values; - values << type << parameters; +// std::vector<QStringList>* container = &m_shapes; + std::vector<std::vector<std::string>>* container = &m_shapes; + +// QStringList values; + std::vector<std::string> values; + +// values << type << parameters; + values.push_back(type); + values.push_back(parameters); + return QVariant( addRecord(container, values) ); } @@ -1689,7 +1688,9 @@ void WriteGeoModel::saveToDB() m_dbManager->addRootVolume(m_rootVolume); if ( !m_objectsNotPersistified.empty() ) { - qWarning() << "\n\tWARNING!! There are objects which need to be persistified! --> " << m_objectsNotPersistified << "\n\n"; + std::cout << "\n\tWARNING!! There are shapes/nodes which need to be persistified! --> "; + printStdVectorStrings(m_objectsNotPersistified); + std::cout << "\n\n"; } return; -- GitLab