From 5d3794eca5aa759ca61a52a8f948b02525714dd9 Mon Sep 17 00:00:00 2001 From: gr5 Date: Thu, 2 Oct 2025 12:20:18 -0400 Subject: [PATCH 1/6] fixes a bug found related to issue246. Hopefully the only bug. It caused crashes when using test stand astig removal tool --- surfacemanager.cpp | 9 ++++++++- zernikepolar.cpp | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/surfacemanager.cpp b/surfacemanager.cpp index 12833c47..1c239575 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -438,6 +438,13 @@ cv::Mat SurfaceManager::computeWaveFrontFromZernikes(int wx, int wy, std::vector double rho; + int maxZernToUse = 0; + for (int value : zernsToUse) { + if (value > maxZernToUse) + maxZernToUse = value; + } + + std::vector &en = zernEnables; mirrorDlg *md = mirrorDlg::get_Instance(); for (int i = 0; i < wx; ++i) @@ -452,7 +459,7 @@ cv::Mat SurfaceManager::computeWaveFrontFromZernikes(int wx, int wy, std::vector { double S1 = 0; double theta = atan2(y1,x1); - zernikePolar zpolar(rho, theta, zernsToUse.size()); + zernikePolar zpolar(rho, theta, maxZernToUse+1); for (int ii = 0; ii < zernsToUse.size(); ++ii) { int z = zernsToUse[ii]; diff --git a/zernikepolar.cpp b/zernikepolar.cpp index 633484e0..941cb09d 100644 --- a/zernikepolar.cpp +++ b/zernikepolar.cpp @@ -19,6 +19,7 @@ #include "zernikepolar.h" #include #include +#include "spdlog/spdlog.h" zernikePolar::zernikePolar(double rho, double theta, size_t nbTerms) { // Having all terms computed at once here let's compiler optimize the code better @@ -109,7 +110,7 @@ zernikePolar::zernikePolar(double rho, double theta, size_t nbTerms) { zernTerms[35] = -1 + 30. * rho2 -210 * rho4 + 560. * rho6 - 630 * rho8 + 252. * rho10; } - if(nbTerms > 35) + if(nbTerms > 35) // shouldn't this be 36? { zernTerms[36] = rho6 * std::cos(6. * theta); zernTerms[37] = rho6 * std::sin(6. * theta); @@ -133,6 +134,7 @@ double zernikePolar::zernike(size_t n){ } else { + spdlog::get("logger")->critical("zernikePolar() Zernike order exceeds maximum computed."); throw std::out_of_range("Zernike order exceeds maximum computed order"); return 0.; } From ac6b029135e6c571d7feda02f929409988136966 Mon Sep 17 00:00:00 2001 From: gr5 Date: Sat, 4 Oct 2025 12:43:58 -0400 Subject: [PATCH 2/6] Added logging to try to figure out where QT6 version is crashing. --- surfacemanager.cpp | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/surfacemanager.cpp b/surfacemanager.cpp index 1c239575..c35b818e 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -75,6 +75,7 @@ #include "ui_oglrendered.h" #include "astigpolargraph.h" + cv::Mat theMask; cv::Mat deb; double outputLambda; @@ -2421,10 +2422,11 @@ textres SurfaceManager::Phase2(QList list, QList inp void SurfaceManager::computeStandAstig(define_input *wizPage, QList list){ // check for pairs QVector lookat = list.toVector(); - + spdlog::get("logger")->trace("computeStandAstig()"); while (lookat.size()){ for (int i = 0; i < lookat.size(); ++i){ double angle1 = wrapAngle(lookat[i]->angle); + spdlog::get("logger")->trace("computeStandAstig() angle ", i); double found = false; for (int j = i+1; j < lookat.size(); ++j){ @@ -2456,11 +2458,14 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListtrace("computeStandAstig() create printer step 1"); QPrinter printer(QPrinter::HighResolution); printer.setColorMode( QPrinter::Color ); printer.setFullPage( true ); + spdlog::get("logger")->trace("computeStandAstig() create printer step 2"); printer.setOutputFileName( "stand.pdf" ); printer.setOutputFormat( QPrinter::PdfFormat ); + spdlog::get("logger")->trace("computeStandAstig() create printer step 3"); int Width = getImageSize(printer); @@ -2479,6 +2484,7 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListm_minimal = true; QList unrotatedNdxs; + spdlog::get("logger")->trace("computeStandAstig() create html step 1"); QString html = ("

Test Stand Astig Removal

" "

" + AstigReportTitle); html.append(" " + QDate::currentDate().toString() + @@ -2491,6 +2497,8 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList"); html.append("

Unrotated inputs

"); html.append("

Counter Rotated

"); + spdlog::get("logger")->trace("computeStandAstig() create html step 2"); + QTextDocument *doc = editor->document(); @@ -2499,9 +2507,11 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList rotated; QList inputs; editor->append(""); + spdlog::get("logger")->trace("computeStandAstig() create html step 3"); int startingNdx = m_wavefronts.size() -1; for (int i = 0; i < list.size(); ++i){ + spdlog::get("logger")->trace("computeStandAstig() wavefront ",i); contour.fill( QColor( Qt::white ).rgb() ); QPainter painter( &contour ); int ndx = m_wavefronts.size(); @@ -2510,15 +2520,22 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListfname; wizPage->m_log->append("Loading " + list[i]->fname); + spdlog::get("logger")->trace("computeStandAstig() loading file"); QApplication::processEvents(); + spdlog::get("logger")->trace("computeStandAstig() loading file step 2"); loadWavefront(list[i]->fname); + spdlog::get("logger")->trace("computeStandAstig() loading file step 2b"); wavefront * wf = m_wavefronts[m_currentNdx]; inputs.append(wf); unrotatedNdxs.append(m_currentNdx); + spdlog::get("logger")->trace("computeStandAstig() loading file step 3"); plot->setSurface(wf); plot->resize(Width, .8 * Width); + spdlog::get("logger")->trace("computeStandAstig() loading file step 4"); plot->replot(); + spdlog::get("logger")->trace("computeStandAstig() loading file step 5"); renderer.render( plot, &painter, QRect(0,0,Width,.8 * Width) ); + spdlog::get("logger")->trace("computeStandAstig() loading file step 6"); QString imageName = QString("mydata://%1.png").arg(list[i]->fname); QString angle = QString("%1 Deg").arg(-list[i]->angle, 6, 'f', 2); @@ -2527,6 +2544,7 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList


" + angle + "

"); // counter rotate it + spdlog::get("logger")->trace("computeStandAstig() loading file step 7"); wizPage->m_log->setText(QString("Counter Rotating ") + list[i]->fname.right(list[i]->fname.size() - list[i]->fname.lastIndexOf("/")-1)); QApplication::processEvents(); @@ -2534,11 +2552,14 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListtrace("computeStandAstig() loading file step 8"); rotateThese(wrapAngle(list[i]->angle),l); rotated.append(m_wavefronts[ndx]); wf = m_wavefronts[ndx]; + spdlog::get("logger")->trace("computeStandAstig() loading file step 9"); loadComplete(); + spdlog::get("logger")->trace("computeStandAstig() loading file step 10"); plot->setSurface(wf); plot->resize(Width, .8 * Width); plot->replot(); @@ -2548,6 +2569,7 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListangle, 6, 'f', 2); imageName = QString("mydata://CR%1%2.png").arg(list[i]->fname).arg(angle); // clazy:exclude=qstring-arg + spdlog::get("logger")->trace("computeStandAstig() loading file step 11"); doc->addResource(QTextDocument::ImageResource, QUrl(imageName), QVariant(contour)); doc1Res.append(imageName); html.append("


Counter " + angle + "

"); From 7f10082273892864c119c9c6f66aba7e56bf621d Mon Sep 17 00:00:00 2001 From: gr5 Date: Sat, 4 Oct 2025 14:27:38 -0400 Subject: [PATCH 3/6] Added more logging. Seems to crash when loading wavefront. --- surfacemanager.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/surfacemanager.cpp b/surfacemanager.cpp index c35b818e..4e5bf508 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -1107,12 +1107,14 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ QMessageBox::warning(NULL, tr("Read Wavefront File"),b); return 0; } + spdlog::get("logger")->trace("readWaveFront() step 1"); wavefront *wf = new wavefront(); double width; double height; file >> width; file >> height; cv::Mat data(height,width, numType,0.); + spdlog::get("logger")->trace("readWaveFront() width {} height {}", width, height); for( size_t y = 0; y < height; y++ ) { for( size_t x = 0; x < width; x++ ) { @@ -1120,6 +1122,7 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ //data.at(height - y - 1, x) += dist(generator); } } + spdlog::get("logger")->trace("readWaveFront() step 2"); std::string line; QString l; @@ -1168,6 +1171,8 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ } } + spdlog::get("logger")->trace("readWaveFront() step 3"); + wf->m_outside = CircleOutline(QPointF(xm,ym), radm); if (rado == 0){ xo = xm; @@ -1178,6 +1183,7 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ } wf->m_inside = CircleOutline(QPointF(xo,yo), rado); + spdlog::get("logger")->trace("readWaveFront() step 4"); if (lambda != md->lambda){ if (lambdResp == ASK){ @@ -1267,6 +1273,7 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ wf->roc = roc; wf->lambda = lambda; wf->wasSmoothed = false; + spdlog::get("logger")->trace("readWaveFront() step 5"); return wf; } @@ -1298,11 +1305,13 @@ bool SurfaceManager::loadWavefront(const QString &fileName){ QMessageBox::warning(NULL, tr("Read Wavefront File"),b); } wavefront *wf; - + spdlog::get("logger")->trace("loadWavefront() step 1"); if (m_currentNdx == 0 && m_wavefronts[0]->name == "Demo"){ + spdlog::get("logger")->trace("loadWavefront() delete current"); deleteCurrent(); } + spdlog::get("logger")->trace("loadWavefront() step 2"); wf = readWaveFront(fileName); m_wavefronts << wf; @@ -1310,20 +1319,24 @@ bool SurfaceManager::loadWavefront(const QString &fileName){ m_surfaceTools->addWaveFront(wf->name); m_currentNdx = m_wavefronts.size()-1; + spdlog::get("logger")->trace("loadWavefront() step 3"); m_surfaceTools->select(m_currentNdx); // if resize to smaller if (Settings2::getInstance()->m_general->shouldDownsize()){ + spdlog::get("logger")->trace("loadWavefront() downSize"); downSizeWf(wf); } makeMask(m_currentNdx); - + spdlog::get("logger")->trace("loadWavefront() step 4"); m_surface_finished = false; try { + spdlog::get("logger")->trace("loadWavefront() step 5"); generateSurfacefromWavefront(m_currentNdx); } catch (int i){ deleteCurrent(); + spdlog::get("logger")->critical("loadWavefront() crash while generating surface"); throw i; } @@ -2426,7 +2439,7 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListangle); - spdlog::get("logger")->trace("computeStandAstig() angle ", i); + spdlog::get("logger")->trace("computeStandAstig() angle {}", i); double found = false; for (int j = i+1; j < lookat.size(); ++j){ From 090cfe120baa2f2c39b3e84818af8ee84c8e2b8e Mon Sep 17 00:00:00 2001 From: gr5 Date: Sun, 12 Oct 2025 09:44:56 -0400 Subject: [PATCH 4/6] Update surfacemanager.cpp Co-authored-by: Julien Staub --- surfacemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/surfacemanager.cpp b/surfacemanager.cpp index 4e5bf508..392e06e8 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -441,7 +441,7 @@ cv::Mat SurfaceManager::computeWaveFrontFromZernikes(int wx, int wy, std::vector int maxZernToUse = 0; for (int value : zernsToUse) { - if (value > maxZernToUse) + if (value > maxZernToUse) maxZernToUse = value; } From 84b0c29c01e8c2c98464c57f2d6d49bdb9e82cb5 Mon Sep 17 00:00:00 2001 From: gr5 Date: Sun, 12 Oct 2025 10:23:41 -0400 Subject: [PATCH 5/6] Removed excessive logging now that remaining bug is narrowed down to a few lines of code. --- surfacemanager.cpp | 28 +--------------------------- 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/surfacemanager.cpp b/surfacemanager.cpp index 4e5bf508..c7abe0cf 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -1171,7 +1171,6 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ } } - spdlog::get("logger")->trace("readWaveFront() step 3"); wf->m_outside = CircleOutline(QPointF(xm,ym), radm); if (rado == 0){ @@ -1183,7 +1182,6 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ } wf->m_inside = CircleOutline(QPointF(xo,yo), rado); - spdlog::get("logger")->trace("readWaveFront() step 4"); if (lambda != md->lambda){ if (lambdResp == ASK){ @@ -1273,7 +1271,6 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ wf->roc = roc; wf->lambda = lambda; wf->wasSmoothed = false; - spdlog::get("logger")->trace("readWaveFront() step 5"); return wf; } @@ -1305,13 +1302,12 @@ bool SurfaceManager::loadWavefront(const QString &fileName){ QMessageBox::warning(NULL, tr("Read Wavefront File"),b); } wavefront *wf; - spdlog::get("logger")->trace("loadWavefront() step 1"); + spdlog::get("logger")->trace("loadWavefront()"); if (m_currentNdx == 0 && m_wavefronts[0]->name == "Demo"){ spdlog::get("logger")->trace("loadWavefront() delete current"); deleteCurrent(); } - spdlog::get("logger")->trace("loadWavefront() step 2"); wf = readWaveFront(fileName); m_wavefronts << wf; @@ -1319,7 +1315,6 @@ bool SurfaceManager::loadWavefront(const QString &fileName){ m_surfaceTools->addWaveFront(wf->name); m_currentNdx = m_wavefronts.size()-1; - spdlog::get("logger")->trace("loadWavefront() step 3"); m_surfaceTools->select(m_currentNdx); // if resize to smaller @@ -1328,10 +1323,8 @@ bool SurfaceManager::loadWavefront(const QString &fileName){ downSizeWf(wf); } makeMask(m_currentNdx); - spdlog::get("logger")->trace("loadWavefront() step 4"); m_surface_finished = false; try { - spdlog::get("logger")->trace("loadWavefront() step 5"); generateSurfacefromWavefront(m_currentNdx); } catch (int i){ @@ -2439,7 +2432,6 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListangle); - spdlog::get("logger")->trace("computeStandAstig() angle {}", i); double found = false; for (int j = i+1; j < lookat.size(); ++j){ @@ -2475,10 +2467,8 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListtrace("computeStandAstig() create printer step 2"); printer.setOutputFileName( "stand.pdf" ); printer.setOutputFormat( QPrinter::PdfFormat ); - spdlog::get("logger")->trace("computeStandAstig() create printer step 3"); int Width = getImageSize(printer); @@ -2497,7 +2487,6 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListm_minimal = true; QList unrotatedNdxs; - spdlog::get("logger")->trace("computeStandAstig() create html step 1"); QString html = ("

Test Stand Astig Removal

" "

" + AstigReportTitle); html.append(" " + QDate::currentDate().toString() + @@ -2510,7 +2499,6 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList"); html.append("

Unrotated inputs

"); html.append("

Counter Rotated

"); - spdlog::get("logger")->trace("computeStandAstig() create html step 2"); @@ -2520,11 +2508,9 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList rotated; QList inputs; editor->append(""); - spdlog::get("logger")->trace("computeStandAstig() create html step 3"); int startingNdx = m_wavefronts.size() -1; for (int i = 0; i < list.size(); ++i){ - spdlog::get("logger")->trace("computeStandAstig() wavefront ",i); contour.fill( QColor( Qt::white ).rgb() ); QPainter painter( &contour ); int ndx = m_wavefronts.size(); @@ -2533,22 +2519,15 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListfname; wizPage->m_log->append("Loading " + list[i]->fname); - spdlog::get("logger")->trace("computeStandAstig() loading file"); QApplication::processEvents(); - spdlog::get("logger")->trace("computeStandAstig() loading file step 2"); loadWavefront(list[i]->fname); - spdlog::get("logger")->trace("computeStandAstig() loading file step 2b"); wavefront * wf = m_wavefronts[m_currentNdx]; inputs.append(wf); unrotatedNdxs.append(m_currentNdx); - spdlog::get("logger")->trace("computeStandAstig() loading file step 3"); plot->setSurface(wf); plot->resize(Width, .8 * Width); - spdlog::get("logger")->trace("computeStandAstig() loading file step 4"); plot->replot(); - spdlog::get("logger")->trace("computeStandAstig() loading file step 5"); renderer.render( plot, &painter, QRect(0,0,Width,.8 * Width) ); - spdlog::get("logger")->trace("computeStandAstig() loading file step 6"); QString imageName = QString("mydata://%1.png").arg(list[i]->fname); QString angle = QString("%1 Deg").arg(-list[i]->angle, 6, 'f', 2); @@ -2557,7 +2536,6 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QList


" + angle + "

"); // counter rotate it - spdlog::get("logger")->trace("computeStandAstig() loading file step 7"); wizPage->m_log->setText(QString("Counter Rotating ") + list[i]->fname.right(list[i]->fname.size() - list[i]->fname.lastIndexOf("/")-1)); QApplication::processEvents(); @@ -2565,14 +2543,11 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListtrace("computeStandAstig() loading file step 8"); rotateThese(wrapAngle(list[i]->angle),l); rotated.append(m_wavefronts[ndx]); wf = m_wavefronts[ndx]; - spdlog::get("logger")->trace("computeStandAstig() loading file step 9"); loadComplete(); - spdlog::get("logger")->trace("computeStandAstig() loading file step 10"); plot->setSurface(wf); plot->resize(Width, .8 * Width); plot->replot(); @@ -2582,7 +2557,6 @@ void SurfaceManager::computeStandAstig(define_input *wizPage, QListangle, 6, 'f', 2); imageName = QString("mydata://CR%1%2.png").arg(list[i]->fname).arg(angle); // clazy:exclude=qstring-arg - spdlog::get("logger")->trace("computeStandAstig() loading file step 11"); doc->addResource(QTextDocument::ImageResource, QUrl(imageName), QVariant(contour)); doc1Res.append(imageName); html.append("


Counter " + angle + "

"); From 06bab5ddd553ca00d191b69b44c826b798702fd7 Mon Sep 17 00:00:00 2001 From: gr5 Date: Sun, 12 Oct 2025 13:48:15 -0400 Subject: [PATCH 6/6] bug fix that wasn't causing any serious issues. yet. --- zernikepolar.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zernikepolar.cpp b/zernikepolar.cpp index 941cb09d..11222482 100644 --- a/zernikepolar.cpp +++ b/zernikepolar.cpp @@ -62,7 +62,7 @@ zernikePolar::zernikePolar(double rho, double theta, size_t nbTerms) { // only compute what is actually needed // but to avoid complex code I use only 4 ranges - if(nbTerms > 8) + if(nbTerms > 9) { rho3 = rho2 * rho; rho4 = rho3 * rho; @@ -92,7 +92,7 @@ zernikePolar::zernikePolar(double rho, double theta, size_t nbTerms) { zernTerms[24] = 1. - 20. * rho2 + 90. * rho4 - 140. * rho6 + 70. * rho8; } - if(nbTerms > 24) { + if(nbTerms > 25) { rho10 = rho8 * rho2; cos5theta = std::cos(5. * theta); sin5theta = std::sin(5. * theta); @@ -110,7 +110,7 @@ zernikePolar::zernikePolar(double rho, double theta, size_t nbTerms) { zernTerms[35] = -1 + 30. * rho2 -210 * rho4 + 560. * rho6 - 630 * rho8 + 252. * rho10; } - if(nbTerms > 35) // shouldn't this be 36? + if(nbTerms > 36) { zernTerms[36] = rho6 * std::cos(6. * theta); zernTerms[37] = rho6 * std::sin(6. * theta);