QXRD  0.11.16
qxrdwindow.cpp
Go to the documentation of this file.
1 #include "qxrddebug.h"
2 #include "qxrdwindow.h"
3 #include "qxrdapplication.h"
4 #include "qxrdexperiment.h"
6 #include "qxrddisplaydialog.h"
8 #include "qxrdacquisition.h"
9 #include "qxrdimageplot.h"
10 #include "qcepimagedata.h"
11 #include "qcepmaskdata.h"
12 #include "qxrddataprocessor.h"
13 #include "qxrdcenterfinderdialog.h"
14 #include "qxrdcenterfinder.h"
15 #include "qxrdmaskdialog.h"
16 #include "qxrdcenterfinder.h"
17 #include "qxrdintegratordialog.h"
18 #include "qxrdintegrator.h"
19 #include "qcepplotzoomer.h"
20 #include "qxrdscriptengine.h"
21 #include "qxrdfilebrowser.h"
22 #include "qxrdimagecalculator.h"
23 #include "qcepmutexlocker.h"
24 #include "qcepallocator.h"
25 #include "qxrdimagedisplaywidget.h"
27 #include "qxrdcorrectiondialog.h"
28 #include "qxrdslicedialog.h"
29 #include "qxrdhistogramdialog.h"
30 #include "qxrdinfodialog.h"
31 #include "qxrdscriptdialog.h"
32 #include "qxrdhighlighter.h"
36 #include "qxrdtodolist.h"
39 
40 #include <qwt_plot.h>
41 #include <qwt_plot_curve.h>
42 #include <qwt_plot_zoomer.h>
43 #include <qwt_legend.h>
44 #include <qwt_symbol.h>
45 #include <QPen>
46 #include <QFile>
47 #include <QCheckBox>
48 #include <QSignalMapper>
49 #include <QFileDialog>
50 #include <QMessageBox>
51 #include <QCloseEvent>
52 #include <QTime>
53 #include <QDirModel>
54 #include <QString>
55 #include <QMetaObject>
56 #include <QMetaMethod>
57 #include <QMenu>
58 #include <QDesktopWidget>
59 #include <QSortFilterProxyModel>
60 
63  QxrdExperimentWPtr docw,
66  QcepAllocatorWPtr allocw,
67  QWidget *parent)
68  : QxrdMainWindow(parent),
69  m_ObjectNamer(this, "window"),
70  m_Mutex(QMutex::Recursive),
71  m_WindowSettings(settings),
72  m_Application(appl),
73  m_Experiment(docw),
74  m_Acquisition(acqw),
75  m_DataProcessor(procw),
76  m_Allocator(allocw),
77  m_AcquisitionDialog(NULL),
81  m_DisplayDialog(NULL),
83  m_MaskDialog(NULL),
84  m_CorrectionDialog(NULL),
85  m_IntegratorDialog(NULL),
86  m_CalibrantDialog(NULL),
88  m_Calculator(NULL),
89  m_InputFileBrowser(NULL),
90  m_OutputFileBrowser(NULL),
91  m_SliceDialog(NULL),
92  m_HistogramDialog(NULL),
93  m_ImageInfoDialog(NULL),
94  m_ScriptDialog(NULL),
96  m_Progress(NULL),
97  m_AllocationStatus(NULL),
98  m_Data(NULL),
99  m_Overflow(NULL),
100  m_NewData(NULL),
101  m_NewOverflow(NULL),
102  m_NewDataAvailable(false),
103  m_Mask(NULL),
104  m_NewMask(NULL),
105  m_NewMaskAvailable(false),
106  m_ImageDisplay(NULL),
107  m_Highlighter(NULL)
108 {
110  printf("QxrdWindow::QxrdWindow(%p)\n", this);
111  }
112 
114 
115  if (app && qcepDebug(DEBUG_APP)) {
116  app->printMessage("QxrdWindow::QxrdWindow");
117  }
118 }
119 
121 {
122  setupUi(this);
123 
127 
128  updateTitle();
129 
130  setWindowIcon(QIcon(":/images/qxrd-icon-64x64.png"));
131 
134 
135  if (acq) {
136  m_AcquisitionDialog = acq -> controlPanel(sharedFromThis());
138  m_SynchronizedAcquisitionDialog = new QxrdSynchronizedAcquisitionDialog(set->synchronizedAcquisitionDialogSettings(), this, m_Acquisition);
139  m_AcquisitionExtraInputsDialog = new QxrdAcquisitionExtraInputsDialog(set->acquisitionExtraInputsDialogSettings(), this, m_Acquisition);
140  }
141 
143 
144  if (proc) {
145  m_CenterFinderDialog = new QxrdCenterFinderDialog(proc -> centerFinder());
146  m_DistortionCorrectionDialog = new QxrdDistortionCorrectionDialog(proc->distortionCorrection(), sharedFromThis());
147  }
148 
149  if (proc) {
151  }
152 
153  if (acq) {
155  }
156 
157  if (proc) {
158  m_IntegratorDialog = new QxrdIntegratorDialog(proc -> integrator());
159  }
160 
161  if (expt && proc) {
162  QxrdCalibrantLibraryPtr cal(expt->calibrantLibrary());
163 
164  if (cal) {
165  m_CalibrantDialog = new QxrdCalibrantDialog(expt, proc -> centerFinder());
166  }
167  }
168 
169  if (expt) {
170  QcepDatasetModelPtr ds = expt->dataset();
171 
172  if (ds) {
173  m_DatasetBrowserDialog = new QcepDatasetBrowserDialog(expt, ds, this);
174  }
175  }
176 
177  if (expt && set) {
178  m_InputFileBrowser = new QxrdInputFileBrowser(set->inputFileBrowserSettings(), m_Experiment, m_DataProcessor, this);
179  m_OutputFileBrowser = new QxrdOutputFileBrowser(set->outputFileBrowserSettings(), m_Experiment, m_DataProcessor, this);
180  m_ScriptDialog = new QxrdScriptDialog(set->scriptDialogSettings(), m_Experiment, this);
181  }
182 
183  if (set) {
184  m_SliceDialog = new QxrdSliceDialog(set->sliceDialogSettings(), this);
185  m_HistogramDialog = new QxrdHistogramDialog(set->histogramDialogSettings(), m_Experiment, this);
186  m_ImageInfoDialog = new QxrdInfoDialog(set->infoDialogSettings(), this);
187  }
188 
189  if (set) {
190  m_ImagePlot -> init(set->imagePlotSettings());
191  m_CenterFinderPlot -> init(set->centerFinderPlotSettings());
192  m_IntegratorPlot -> init(set->integratorPlotSettings());
193  m_DistortionCorrectionDialog -> init(set->distortionCorrectionDialogSettings());
194  m_DistortionCorrectionPlot -> init(set->distortionCorrectionPlotSettings());
195  }
196 
197  QDesktopWidget *dw = QApplication::desktop();
198  // int screenNum = dw->screenNumber(this);
199  QRect screenGeom = dw->screenGeometry(this);
200 
201  // printf("Screen number %d Geom: %d,%d-%d,%d\n", screenNum,
202  // screenGeom.left(), screenGeom.top(),
203  // screenGeom.right(), screenGeom.bottom());
204 
205  if (m_AcquisitionDialog) {
206  addDockWidget(Qt::RightDockWidgetArea, m_AcquisitionDialog);
207  }
208 
209  if (m_InputFileBrowser) {
210  addDockWidget(Qt::LeftDockWidgetArea, m_InputFileBrowser);
211  }
212 
213  if (screenGeom.height() >= 1280) {
214  splitDockWidget(m_AcquisitionDialog, m_CenterFinderDialog, Qt::Vertical);
215  splitDockWidget(m_CenterFinderDialog, m_IntegratorDialog, Qt::Vertical);
216 
217  tabifyDockWidget(m_InputFileBrowser, m_DatasetBrowserDialog);
218 
223  tabifyDockWidget(m_DisplayDialog, m_SliceDialog);
224  tabifyDockWidget(m_SliceDialog, m_ImageInfoDialog);
225  tabifyDockWidget(m_ImageInfoDialog, m_ScriptDialog);
226 
227  tabifyDockWidget(m_CenterFinderDialog, m_MaskDialog);
228  tabifyDockWidget(m_MaskDialog, m_CorrectionDialog);
229  tabifyDockWidget(m_CorrectionDialog, m_CalibrantDialog);
230  tabifyDockWidget(m_CalibrantDialog, m_OutputFileBrowser);
231  tabifyDockWidget(m_OutputFileBrowser, m_HistogramDialog);
233  } else if (screenGeom.height() >= 1000) {
234  splitDockWidget(m_AcquisitionDialog, m_CenterFinderDialog, Qt::Vertical);
235 
236  tabifyDockWidget(m_InputFileBrowser, m_DatasetBrowserDialog);
237 
242  tabifyDockWidget(m_DisplayDialog, m_SliceDialog);
243  tabifyDockWidget(m_SliceDialog, m_ImageInfoDialog);
244  tabifyDockWidget(m_ImageInfoDialog, m_ScriptDialog);
245 
246  tabifyDockWidget(m_CenterFinderDialog, m_MaskDialog);
247  tabifyDockWidget(m_MaskDialog, m_CorrectionDialog);
248  tabifyDockWidget(m_CorrectionDialog, m_CalibrantDialog);
249  tabifyDockWidget(m_CalibrantDialog, m_OutputFileBrowser);
250  tabifyDockWidget(m_OutputFileBrowser, m_HistogramDialog);
251  tabifyDockWidget(m_HistogramDialog, m_IntegratorDialog);
253  } else {
257  tabifyDockWidget(m_CenterFinderDialog, m_IntegratorDialog);
258 
259  tabifyDockWidget(m_InputFileBrowser, m_DatasetBrowserDialog);
260 
263 
264  tabifyDockWidget(m_DisplayDialog, m_MaskDialog);
265  tabifyDockWidget(m_MaskDialog, m_CorrectionDialog);
266  tabifyDockWidget(m_CorrectionDialog, m_CalibrantDialog);
267  tabifyDockWidget(m_CalibrantDialog, m_OutputFileBrowser);
268 
269  tabifyDockWidget(m_OutputFileBrowser, m_SliceDialog);
270  tabifyDockWidget(m_SliceDialog, m_HistogramDialog);
271  tabifyDockWidget(m_HistogramDialog, m_ImageInfoDialog);
272  tabifyDockWidget(m_ImageInfoDialog, m_ScriptDialog);
273  tabifyDockWidget(m_ScriptDialog, m_DistortionCorrectionDialog);
274 
275  if (screenGeom.height() < 1000) {
276  // shrinkObject(this);
277  shrinkPanels(6,1);
278  }
279  }
280 
281  if (expt) {
282  int fs = expt->get_FontSize();
283  int sp = expt->get_Spacing();
284 
285  if (fs > 0) {
286  setFontSize(fs);
287  }
288 
289  if (sp >= 0) {
290  setSpacing(sp);
291  }
292 
293  connect(expt->prop_FontSize(), &QcepIntProperty::valueChanged, this, &QxrdWindow::setFontSize);
294  connect(expt->prop_Spacing(), &QcepIntProperty::valueChanged, this, &QxrdWindow::setSpacing);
295  }
296 
297  // m_Calculator = new QxrdImageCalculator(m_DataProcessor);
298  // addDockWidget(Qt::RightDockWidgetArea, m_Calculator);
299 
300  connect(m_ExecuteScriptButton, &QAbstractButton::clicked, m_ActionExecuteScript, &QAction::triggered);
301  connect(m_ActionExecuteScript, &QAction::triggered, this, &QxrdWindow::executeScript);
302  connect(m_CancelScriptButton, &QAbstractButton::clicked, m_ActionCancelScript, &QAction::triggered);
303  connect(m_ActionCancelScript, &QAction::triggered, this, &QxrdWindow::cancelScript);
304  connect(m_LoadScriptButton, &QAbstractButton::clicked, m_ActionLoadScript, &QAction::triggered);
305  connect(m_ActionLoadScript, &QAction::triggered, this, &QxrdWindow::doLoadScript);
306 
307  if (app) {
308  connect(m_ActionAutoScale, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::autoScale);
309  connect(m_ActionQuit, &QAction::triggered, app.data(), &QxrdApplication::possiblyQuit);
310  connect(m_ActionGlobalPreferences, &QAction::triggered, app.data(), &QxrdApplication::editGlobalPreferences);
311  connect(m_ActionExperimentPreferences, &QAction::triggered, this, &QxrdWindow::doEditPreferences);
312  connect(m_ActionLoadPreferences, &QAction::triggered, app.data(), &QxrdApplication::doLoadPreferences);
313  connect(m_ActionSavePreferences, &QAction::triggered, app.data(), &QxrdApplication::doSavePreferences);
314 
315  connect(m_ActionNewExperiment, &QAction::triggered, app.data(), &QxrdApplication::chooseNewExperiment);
316  connect(m_ActionOpenExperiment, &QAction::triggered, app.data(), &QxrdApplication::chooseExistingExperiment);
317  connect(m_ActionCloseExperiment, &QAction::triggered, this, &QWidget::close);
318  }
319 
320  if (expt) {
321  connect(m_ActionSaveExperiment, &QAction::triggered, expt.data(), &QxrdExperiment::saveExperiment);
322 // connect(m_ActionOpenDetectorControlWindow, &QAction::triggered, this, &QxrdWindow::doOpenAcquisitionWindow);
323  }
324 
325  connect(m_ActionSaveExperimentAs, &QAction::triggered, this, &QxrdWindow::saveExperimentAs);
326  connect(m_ActionSaveExperimentCopy, &QAction::triggered, this, &QxrdWindow::saveExperimentCopy);
327 
328  m_ExperimentsMenu->menuAction()->setMenuRole(QAction::NoRole);
329 
330  connect(m_ExperimentsMenu, &QMenu::aboutToShow, this, &QxrdWindow::populateExperimentsMenu);
331  setupRecentExperimentsMenu(m_ActionRecentExperiments);
332 
333  connect(m_ConfigureDetectorMenu, &QMenu::aboutToShow, this, &QxrdWindow::populateConfigureDetectorMenu);
334  m_ConfigureDetectorMenu->menuAction()->setMenuRole(QAction::NoRole);
335 
336  connect(m_DetectorControlWindowsMenu, &QMenu::aboutToShow, this, &QxrdWindow::populateDetectorControlWindowsMenu);
337 
338  connect(m_ActionLoadData, &QAction::triggered, this, &QxrdWindow::doLoadData);
339  connect(m_ActionSaveData, &QAction::triggered, this, &QxrdWindow::doSaveData);
340  connect(m_ActionLoadDark, &QAction::triggered, this, &QxrdWindow::doLoadDark);
341  connect(m_ActionSaveDark, &QAction::triggered, this, &QxrdWindow::doSaveDark);
342  connect(m_ActionClearDark, &QAction::triggered, this, &QxrdWindow::doClearDark);
343  connect(m_ActionLoadMask, &QAction::triggered, this, &QxrdWindow::doLoadMask);
344  connect(m_ActionSaveMask, &QAction::triggered, this, &QxrdWindow::doSaveMask);
345  connect(m_ActionClearMask, &QAction::triggered, this, &QxrdWindow::doClearMask);
346  connect(m_ActionLoadGainMap, &QAction::triggered, this, &QxrdWindow::doLoadGainMap);
347  connect(m_ActionSaveGainMap, &QAction::triggered, this, &QxrdWindow::doSaveGainMap);
348  connect(m_ActionClearGainMap, &QAction::triggered, this, &QxrdWindow::doClearGainMap);
349 
350  connect(m_ActionPrintImage, &QAction::triggered, m_ImagePlot, &QcepPlot::printGraph);
351 
352  connect(m_ActionAccumulateImages, &QAction::triggered, this, &QxrdWindow::doAccumulateImages);
353  connect(m_ActionAddImage, &QAction::triggered, this, &QxrdWindow::doAddImages);
354  connect(m_ActionSubtractImage, &QAction::triggered, this, &QxrdWindow::doSubtractImages);
355  connect(m_ActionProjectImagesX, &QAction::triggered, this, &QxrdWindow::doProjectAlongX);
356  connect(m_ActionProjectImagesY, &QAction::triggered, this, &QxrdWindow::doProjectAlongY);
357  connect(m_ActionProjectImagesZ, &QAction::triggered, this, &QxrdWindow::doProjectAlongZ);
358  connect(m_ActionCorrelateImage, &QAction::triggered, this, &QxrdWindow::doCorrelate);
359  connect(m_ActionProcessData, &QAction::triggered, this, &QxrdWindow::doProcessSequence);
360 
361  connect(m_ActionReflectHorizontally, &QAction::triggered, this, &QxrdWindow::doReflectHorizontally);
362  connect(m_ActionReflectVertically, &QAction::triggered, this, &QxrdWindow::doReflectVertically);
363 
364  connect(m_DisplayDialog -> m_AutoRange, &QAbstractButton::clicked, m_ActionAutoRange, &QAction::triggered);
365  connect(m_DisplayDialog -> m_Display_5pct, &QAbstractButton::clicked, m_Action005Range, &QAction::triggered);
366  connect(m_DisplayDialog -> m_Display_10pct, &QAbstractButton::clicked, m_Action010Range, &QAction::triggered);
367  connect(m_DisplayDialog -> m_Display_100pct, &QAbstractButton::clicked, m_Action100Range, &QAction::triggered);
368 
369  connect(m_Action005Range, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::set005Range);
370  connect(m_Action010Range, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::set010Range);
371  connect(m_Action100Range, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::set100Range);
372  connect(m_ActionAutoRange, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setAutoRange);
373 
374  connect(m_ActionGrayscale, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setGrayscale);
375  connect(m_ActionInverseGrayscale, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setInverseGrayscale);
376  connect(m_ActionEarthTones, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setEarthTones);
377  connect(m_ActionSpectrum, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setSpectrum);
378  connect(m_ActionFire, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setFire);
379  connect(m_ActionIce, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::setIce);
380 
381  connect(m_ActionRefineCenterTilt, &QAction::triggered, this, &QxrdWindow::doRefineCenterTilt);
382  connect(m_ActionMoveCenterUp, &QAction::triggered, m_CenterFinderDialog, &QxrdCenterFinderDialog::centerMoveUp);
383  connect(m_ActionMoveCenterDown, &QAction::triggered, m_CenterFinderDialog, &QxrdCenterFinderDialog::centerMoveDown);
384  connect(m_ActionMoveCenterLeft, &QAction::triggered, m_CenterFinderDialog, &QxrdCenterFinderDialog::centerMoveLeft);
385  connect(m_ActionMoveCenterRight, &QAction::triggered, m_CenterFinderDialog, &QxrdCenterFinderDialog::centerMoveRight);
386 
387  if (proc) {
388  QxrdCenterFinderPtr cf(proc->centerFinder());
389 
390  if (cf) {
391  connect(m_ActionFindBeamCenter, &QAction::triggered, cf.data(), &QxrdCenterFinder::fitPowderCircle, Qt::DirectConnection);
392  connect(m_ActionClearMarkers, &QAction::triggered, cf.data(), &QxrdCenterFinder::deletePowderPoints, Qt::DirectConnection);
393  connect(m_ActionCalculateCalibrationPowder, &QAction::triggered, cf.data(), &QxrdCenterFinder::calculateCalibration);
394  }
395  }
396 
397  connect(m_ActionPlotPowderRingPoints, &QAction::triggered, this, &QxrdWindow::plotPowderRingRadii);
398  connect(m_ActionPlotPowderRingTwoTheta, &QAction::triggered, this, &QxrdWindow::plotPowderRingTwoTheta);
399  connect(m_ActionPlotPowderRingCenters, &QAction::triggered, this, &QxrdWindow::plotPowderRingCenters);
400 
401  m_AcquisitionDialog->setupAcquireMenu(m_AcquireMenu);
402 
404 
405  connect(m_ActionShowImage, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::toggleShowImage);
406  connect(m_ActionShowMask, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::toggleShowMask);
407  connect(m_ActionShowOverflow, &QAction::triggered, m_ImagePlot, &QxrdImagePlot::toggleShowOverflow);
408 
409  if (proc) {
410  connect(m_ActionShowMaskRange, &QAction::triggered, proc.data(), (void (QxrdDataProcessorBase::*)()) &QxrdDataProcessorBase::showMaskRange);
411  connect(m_ActionHideMaskRange, &QAction::triggered, proc.data(), (void (QxrdDataProcessorBase::*)()) &QxrdDataProcessorBase::hideMaskRange);
412  connect(m_ActionShowMaskAll, &QAction::triggered, proc.data(), &QxrdDataProcessorBase::showMaskAll);
413  connect(m_ActionHideMaskAll, &QAction::triggered, proc.data(), &QxrdDataProcessorBase::hideMaskAll);
414  connect(m_ActionInvertMask, &QAction::triggered, proc.data(), &QxrdDataProcessorBase::invertMask);
415  connect(m_ActionMaskCircles, &QAction::triggered, m_ImageMaskCirclesButton, &QAbstractButton::click);
416  connect(m_ActionMaskPolygons, &QAction::triggered, m_ImageMaskPolygonsButton, &QAbstractButton::click);
417 
418  connect(m_ActionROICalculate, &QAction::triggered, proc.data(), &QxrdDataProcessorBase::calculateROI);
419  connect(m_ActionHistogramCalculate, &QAction::triggered, proc.data(), &QxrdDataProcessorBase::calculateHistogram);
420  }
421 
422  connect(m_ActionTest, &QAction::triggered, this, &QxrdWindow::doTest);
423  connect(m_ActionCrashProgram, &QAction::triggered, this, &QxrdWindow::crashProgram);
424 
425  connect(m_ImageZoomInButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableZooming);
426  connect(m_ImageZoomOutButton, &QAbstractButton::clicked, m_ImagePlot, &QcepPlot::zoomOut);
427  connect(m_ImageZoomAllButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::autoScale);
428  connect(m_ImageSetCenterButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableCentering);
429  connect(m_ImageSliceButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableSlicing);
430  connect(m_ImageMeasureButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableMeasuring);
431  connect(m_ImageHistogramButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableHistograms);
432  connect(m_ImageMaskCirclesButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableMaskCircles);
433  connect(m_ImageMaskPolygonsButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enableMaskPolygons);
434  connect(m_ImagePowderPointsButton, &QAbstractButton::clicked, m_ImagePlot, &QxrdImagePlot::enablePowderPoints);
435 
436  connect(m_CenteringZoomInButton, &QAbstractButton::clicked, m_CenterFinderPlot, &QcepPlot::enableZooming);
437  connect(m_CenteringZoomOutButton, &QAbstractButton::clicked, m_CenterFinderPlot, &QcepPlot::zoomOut);
438  connect(m_CenteringZoomAllButton, &QAbstractButton::clicked, m_CenterFinderPlot, &QcepPlot::autoScale);
439  connect(m_CenteringMeasureButton, &QAbstractButton::clicked, m_CenterFinderPlot, &QcepPlot::enableMeasuring);
440 
441  connect(m_IntegratorZoomInButton, &QAbstractButton::clicked, m_IntegratorPlot, &QcepPlot::enableZooming);
442  connect(m_IntegratorZoomOutButton, &QAbstractButton::clicked, m_IntegratorPlot, &QcepPlot::zoomOut);
443  connect(m_IntegratorZoomAllButton, &QAbstractButton::clicked, m_IntegratorPlot, &QcepPlot::autoScale);
444  connect(m_IntegratorMeasureButton, &QAbstractButton::clicked, m_IntegratorPlot, &QcepPlot::enableMeasuring);
445 
446  connect(m_DistortionCorrectionZoomInButton, &QAbstractButton::clicked, m_DistortionCorrectionPlot, &QcepPlot::enableZooming);
447  connect(m_DistortionCorrectionZoomOutButton, &QAbstractButton::clicked, m_DistortionCorrectionPlot, &QcepPlot::zoomOut);
448  connect(m_DistortionCorrectionZoomAllButton, &QAbstractButton::clicked, m_DistortionCorrectionPlot, &QcepPlot::autoScale);
449  connect(m_DistortionCorrectionMeasureButton, &QAbstractButton::clicked, m_DistortionCorrectionPlot, &QcepPlot::enableMeasuring);
450 
451  connect(m_DisplayDialog -> m_DisplayOptionsButton, &QAbstractButton::clicked, this, &QxrdWindow::doEditPreferences);
452  connect(m_CorrectionDialog -> m_CorrectionOptionsButton, &QAbstractButton::clicked, this, &QxrdWindow::doEditPreferences);
453 
454  if (app) {
455  connect(m_ActionAboutQXRD, &QAction::triggered, app.data(), &QxrdApplication::doAboutQxrd);
456  connect(m_ActionOpenQXRDWebPage, &QAction::triggered, app.data(), &QxrdApplication::doOpenQXRDWebPage);
457  }
458 
459  connect(m_HelpHomeButton, &QAbstractButton::clicked, m_HelpBrowser, &QTextBrowser::home);
460  connect(m_HelpForwardButton, &QAbstractButton::clicked, m_HelpBrowser, &QTextBrowser::forward);
461  connect(m_HelpBackButton, &QAbstractButton::clicked, m_HelpBrowser, &QTextBrowser::backward);
462 
463  connect(m_HelpBrowser, &QTextBrowser::forwardAvailable, m_HelpForwardButton, &QWidget::setEnabled);
464  connect(m_HelpBrowser, &QTextBrowser::backwardAvailable, m_HelpBackButton, &QWidget::setEnabled);
465 
466  m_HelpBrowser->init(m_Experiment);
467 
468  connect(&m_UpdateTimer, &QTimer::timeout, this, &QxrdWindow::newData);
469 
470  connect(m_ActionIntegrate, &QAction::triggered, this, &QxrdWindow::doIntegrateSequence);
471  connect(m_ActionIntegrateCurrent, &QAction::triggered,
473  connect(m_ActionIntegrateInputImages, &QAction::triggered,
475 
476  connect(m_ActionPolarTransform, &QAction::triggered, this, &QxrdWindow::doPolarTransform);
477  connect(m_ActionPolarNormalization, &QAction::triggered, this, &QxrdWindow::doPolarNormalization);
478 
479  connect(m_IntegratorDialog -> m_ClearGraphButton, &QAbstractButton::clicked, m_IntegratorPlot, &QxrdIntegratorPlot::clearGraph);
480  connect(m_IntegratorDialog -> m_ClearSelectedGraphButton, &QAbstractButton::clicked, m_IntegratorPlot, &QxrdIntegratorPlot::clearSelectedCurves);
481  connect(m_ActionClearIntegratedData, &QAction::triggered, m_IntegratorPlot, &QxrdIntegratorPlot::clearGraph);
482  connect(m_ActionClearSelectedIntegratedData, &QAction::triggered, m_IntegratorPlot, &QxrdIntegratorPlot::clearSelectedCurves);
483 
484  connect(m_ActionSaveCachedGeometry, &QAction::triggered, this, &QxrdWindow::doSaveCachedGeometry);
485  connect(m_ActionSaveCachedIntensity, &QAction::triggered, this, &QxrdWindow::doSaveCachedIntensity);
486 
487  connect(m_IntegratorDialog -> m_IntegrateOptionsButton, &QAbstractButton::clicked, this, &QxrdWindow::doEditPreferences);
488 
489  if (proc) {
490  connect(proc->integrator()->prop_IntegrationXUnits(), &QcepIntProperty::valueChanged,
492  integrationXUnitsChanged(proc->integrator()->get_IntegrationXUnits());
493 
494  connect(m_ActionIntegrateVsR, &QAction::triggered, proc->integrator().data(), &QxrdIntegrator::integrateVsR);
495  connect(m_ActionIntegrateVsQ, &QAction::triggered, proc->integrator().data(), &QxrdIntegrator::integrateVsQ);
496  connect(m_ActionIntegrateVsTTH, &QAction::triggered, proc->integrator().data(), &QxrdIntegrator::integrateVsTTH);
497  }
498 
499  if (set) {
500  QxrdImagePlotSettingsPtr ps(set->imagePlotSettings());
501 
502  if (ps) {
503  ps->prop_XMouse()->linkTo(m_XMouse);
504  ps->prop_YMouse()->linkTo(m_YMouse);
505  ps->prop_ValMouse()->linkTo(m_ValMouse);
506  ps->prop_TTHMouse()->linkTo(m_TTHMouse);
507  ps->prop_QMouse()->linkTo(m_QMouse);
508  ps->prop_RMouse()->linkTo(m_RMouse);
509  }
510  }
511 
512  m_StatusMsg = new QLabel(NULL);
513  m_StatusMsg -> setMinimumWidth(200);
514  m_StatusMsg -> setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
515  m_StatusMsg -> setToolTip(tr("Status Messages"));
516 
517  statusBar() -> addPermanentWidget(m_StatusMsg);
518 
519  m_Progress = new QProgressBar(NULL);
520  m_Progress -> setMinimumWidth(150);
521  m_Progress -> setMinimum(0);
522  m_Progress -> setMaximum(100);
523  m_Progress -> setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
524  m_Progress -> setToolTip(tr("Acquisition progress"));
525 
526  statusBar() -> addPermanentWidget(m_Progress);
527 
528  m_AllocationStatus = new QProgressBar(NULL);
529  m_AllocationStatus -> setMinimumWidth(100);
530  m_AllocationStatus -> setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
531  m_AllocationStatus -> setFormat("%v/%m");
532  m_AllocationStatus -> setTextVisible(true);
533  m_AllocationStatus -> setToolTip(tr("Memory usage"));
534 
535  statusBar() -> addPermanentWidget(m_AllocationStatus);
536 
537  if (app && m_Acquisition == NULL) {
538  app->criticalMessage("Oh no, QxrdWindow::m_Acquisition == NULL");
539  }
540 
543  connect(m_Acquisition.data(), SIGNAL(acquiredFrame(QString,int,int,int,int,int,int)),
544  this, SLOT(acquiredFrame(QString,int,int,int,int,int,int)));
547 
548  if (acq) {
549  acq -> prop_OverflowLevel() -> linkTo(m_DisplayDialog->m_OverflowLevel);
550  acq -> prop_RawSaveTime() -> linkTo(m_CorrectionDialog->m_SaveRawTime);
551  acq -> prop_DarkSaveTime() -> linkTo(m_CorrectionDialog->m_SaveDarkTime);
552 
553  connect(acq->prop_OverflowLevel(), &QcepIntProperty::valueChanged,
555  }
556 
557  if (expt) {
558  expt -> prop_CompletionPercentage() -> linkTo(m_Progress);
559  }
560 
561  if (proc) {
562  proc -> prop_PerformDarkSubtraction() -> linkTo(m_CorrectionDialog->m_PerformDark);
563  proc -> prop_PerformDarkSubtractionTime() -> linkTo(m_CorrectionDialog->m_PerformDarkTime);
564  proc -> prop_SaveRawImages() -> linkTo(m_CorrectionDialog->m_SaveRaw);
565  proc -> prop_SaveDarkImages() -> linkTo(m_CorrectionDialog->m_SaveDark);
566  proc -> prop_PerformBadPixels() -> linkTo(m_CorrectionDialog->m_PerformBadPixels);
567  proc -> prop_PerformBadPixelsTime() -> linkTo(m_CorrectionDialog->m_PerformBadPixelsTime);
568  proc -> prop_PerformGainCorrection() -> linkTo(m_CorrectionDialog->m_PerformGainCorrection);
569  proc -> prop_PerformGainCorrectionTime() -> linkTo(m_CorrectionDialog->m_PerformGainCorrectionTime);
570  proc -> prop_SaveSubtracted() -> linkTo(m_CorrectionDialog->m_SaveSubtracted);
571  proc -> prop_SaveSubtractedTime() -> linkTo(m_CorrectionDialog->m_SaveSubtractedTime);
572  proc -> prop_SaveAsText() -> linkTo(m_CorrectionDialog->m_SaveAsText);
573  proc -> prop_SaveAsTextTime() -> linkTo(m_CorrectionDialog->m_SaveAsTextTime);
574  proc -> prop_PerformIntegration() -> linkTo(m_CorrectionDialog->m_PerformIntegration);
575  proc -> prop_PerformIntegrationTime() -> linkTo(m_CorrectionDialog->m_PerformIntegrationTime);
576  proc -> prop_DisplayIntegratedData() -> linkTo(m_CorrectionDialog->m_DisplayIntegratedData);
577  proc -> prop_DisplayIntegratedDataTime() -> linkTo(m_CorrectionDialog->m_DisplayIntegratedDataTime);
578  proc -> prop_SaveIntegratedData() -> linkTo(m_CorrectionDialog->m_SaveIntegratedData);
579  proc -> prop_SaveIntegratedDataTime() -> linkTo(m_CorrectionDialog->m_SaveIntegratedDataTime);
580  proc -> prop_SaveIntegratedInSeparateFiles() -> linkTo(m_CorrectionDialog->m_SaveIntegratedInSeparateFiles);
581  proc -> prop_AccumulateIntegrated2D() ->linkTo(m_CorrectionDialog->m_AccumulateIntegrated2D);
582  proc -> prop_AccumulateIntegratedName() -> linkTo(m_CorrectionDialog->m_AccumulateIntegratedName);
583  proc -> prop_EstimatedProcessingTime() -> linkTo(m_CorrectionDialog->m_EstimatedProcessingTime);
584  }
585 
586  if (set) {
587  QxrdImagePlotSettingsPtr ps(set->imagePlotSettings());
588 
589  if (ps) {
590  ps -> prop_DisplayMinimumPct() -> linkTo(m_DisplayDialog->m_DisplayMinimumPct);
591  ps -> prop_DisplayMaximumPct() -> linkTo(m_DisplayDialog->m_DisplayMaximumPct);
592  ps -> prop_DisplayMinimumVal() -> linkTo(m_DisplayDialog->m_DisplayMinimumVal);
593  ps -> prop_DisplayMaximumVal() -> linkTo(m_DisplayDialog->m_DisplayMaximumVal);
594  ps -> prop_DisplayMinimumPctle() -> linkTo(m_DisplayDialog->m_DisplayMinimumPctle);
595  ps -> prop_DisplayMaximumPctle() -> linkTo(m_DisplayDialog->m_DisplayMaximumPctle);
596 
597  ps -> prop_DisplayLog() -> linkTo(m_DisplayDialog->m_DisplayImageLog);
598  ps -> prop_DisplayScalingMode() -> linkTo(m_DisplayDialog->m_DisplayScalingMode);
599 
600  connect(ps -> prop_DisplayScalingMode(), &QcepIntProperty::valueChanged, m_DisplayDialog->m_DisplayParmsStack, &QStackedWidget::setCurrentIndex);
601  m_DisplayDialog->m_DisplayParmsStack->setCurrentIndex(ps->get_DisplayScalingMode());
602 
603  ps -> prop_DisplayColorMap() -> linkTo(m_DisplayDialog->m_DisplayColorMap);
604 
605  ps -> prop_ImageShown() -> linkTo(m_DisplayDialog->m_DisplayImage);
606  ps -> prop_MaskShown() -> linkTo(m_DisplayDialog->m_DisplayMask);
607  ps -> prop_OverflowShown() -> linkTo(m_DisplayDialog->m_DisplayOverflow);
608  ps -> prop_InterpolatePixels() -> linkTo(m_DisplayDialog->m_InterpolatePixels);
609  ps -> prop_MaintainAspectRatio() -> linkTo(m_DisplayDialog->m_MaintainAspectRatio);
610 
611  }
612  }
613 
614  m_ImagePlot -> setProcessor(m_DataProcessor);
615  m_DistortionCorrectionPlot -> setWindow(this);
616  m_CenterFinderPlot -> setWindow(this);
617  m_IntegratorPlot -> setDataProcessor(m_DataProcessor);
618 
619  if (proc) {
620  connect(proc -> centerFinder() -> prop_CenterX(), &QcepDoubleProperty::valueChanged,
621  m_ImagePlot, &QxrdImagePlot::onCenterXChanged);
622 
623  connect(proc -> centerFinder() -> prop_CenterY(), &QcepDoubleProperty::valueChanged,
624  m_ImagePlot, &QxrdImagePlot::onCenterYChanged);
625 
626  connect(proc -> centerFinder() -> prop_CenterX(), &QcepDoubleProperty::valueChanged,
627  m_CenterFinderPlot, &QxrdCenterFinderPlot::onCenterXChanged);
628 
629  connect(proc -> centerFinder() -> prop_CenterY(), &QcepDoubleProperty::valueChanged,
630  m_CenterFinderPlot, &QxrdCenterFinderPlot::onCenterYChanged);
631 
634  }
635 
637 
638  if (alloc) {
639  connect(alloc -> prop_Allocated(), &QcepIntProperty::valueChanged, this, &QxrdWindow::allocatedMemoryChanged);
640  connect(alloc -> prop_Max(), &QcepIntProperty::valueChanged, this, &QxrdWindow::allocatedMemoryChanged);
641  }
642 
643  m_WindowsMenu -> addAction(m_AcquisitionDialog -> toggleViewAction());
644  m_WindowsMenu -> addAction(m_AcquisitionScalerDialog -> toggleViewAction());
645  m_WindowsMenu -> addAction(m_AcquisitionExtraInputsDialog -> toggleViewAction());
646  m_WindowsMenu -> addAction(m_InputFileBrowser -> toggleViewAction());
647  m_WindowsMenu -> addAction(m_OutputFileBrowser -> toggleViewAction());
648  m_WindowsMenu -> addAction(m_SynchronizedAcquisitionDialog -> toggleViewAction());
649  m_WindowsMenu -> addAction(m_DisplayDialog -> toggleViewAction());
650  m_WindowsMenu -> addAction(m_CenterFinderDialog -> toggleViewAction());
651  m_WindowsMenu -> addAction(m_DistortionCorrectionDialog -> toggleViewAction());
652  m_WindowsMenu -> addAction(m_MaskDialog -> toggleViewAction());
653  m_WindowsMenu -> addAction(m_CalibrantDialog -> toggleViewAction());
654  m_WindowsMenu -> addAction(m_DatasetBrowserDialog -> toggleViewAction());
655  m_WindowsMenu -> addAction(m_CorrectionDialog -> toggleViewAction());
656  m_WindowsMenu -> addAction(m_IntegratorDialog -> toggleViewAction());
657  m_WindowsMenu -> addAction(m_SliceDialog -> toggleViewAction());
658  m_WindowsMenu -> addAction(m_HistogramDialog -> toggleViewAction());
659  m_WindowsMenu -> addAction(m_ImageInfoDialog -> toggleViewAction());
660  m_WindowsMenu -> addAction(m_ScriptDialog -> toggleViewAction());
661 
662  m_Highlighter = new QxrdHighlighter(m_ScriptEdit->document());
663 
664 // if (expt) {
665 // expt->prop_DefaultScript()->linkTo(m_ScriptEdit);
666 // }
667 
668  QxrdToDoList *toDoList = new QxrdToDoList(this);
669  QSortFilterProxyModel *sorted = new QSortFilterProxyModel(this);
670 
671  sorted->setSourceModel(toDoList);
672 
673  sorted->sort(0, Qt::DescendingOrder);
674 
675  m_ToDoList->setModel(sorted);
676  m_ToDoList->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
677  m_ToDoList->horizontalHeader()->setStretchLastSection(true);
678  m_ToDoList->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
679  m_ToDoList->setSelectionBehavior(QAbstractItemView::SelectRows);
680 
681  connect(m_ImagePlot, &QxrdImagePlot::slicePolygon,
683 
684  connect(m_ImagePlot, &QxrdImagePlot::selectHistogram,
686 
687  if (app) {
688  m_Messages -> document() -> setMaximumBlockCount(app->get_MessageWindowLines());
689 
690  connect(app->prop_MessageWindowLines(), &QcepIntProperty::valueChanged, this, &QxrdWindow::onMessageWindowLinesChanged);
691  connect(app->prop_UpdateIntervalMsec(), &QcepIntProperty::valueChanged, this, &QxrdWindow::onUpdateIntervalMsecChanged);
692  }
693 
694 #ifdef QT_NO_DEBUG
695  m_ActionRefineCenterTilt->setEnabled(false);
696 #endif
697 
698  if (expt && set) {
699  if (!expt->get_DefaultLayout()) {
700  QByteArray geometry = set->get_WindowGeometry();
701  QByteArray winstate = set->get_WindowState();
702 
703  if (!restoreGeometry(geometry)) {
704  printf("Restore geometry failed\n");
705  }
706 
707  if (!restoreState(winstate,2)) {
708  printf("Restore state failed\n");
709  }
710  } else{
711  expt->set_DefaultLayout(0);
712  }
713  }
714 
715  if (app) {
716  m_UpdateTimer.start(app->get_UpdateIntervalMsec());
717  }
718 
719  captureSize();
720 }
721 
723 {
724 #ifndef QT_NO_DEBUG
725  printf("Deleting window\n");
726 #endif
727 
729 
730  if (app && qcepDebug(DEBUG_APP)) {
731  app->printMessage("QxrdWindow::~QxrdWindow");
732  }
733 
735  printf("QxrdWindow::~QxrdWindow(%p)\n", this);
736  }
737 }
738 
740 {
742 
743  if (expt) {
744  setWindowTitle(expt->experimentFilePath()+" - QXRD");
745  } else {
746  setWindowTitle("QXRD");
747  }
748 
749  if (sizeof(void*) == 4) {
750  setWindowTitle(windowTitle()+" - 32 bit - v"+STR(QXRD_VERSION));
751  } else {
752  setWindowTitle(windowTitle()+" - 64 bit - v"+STR(QXRD_VERSION));
753  }
754 }
755 
757 {
759 }
760 
762 {
763  m_ActionRefineCenterTilt->setEnabled(enable);
764 }
765 
766 void QxrdWindow::closeEvent ( QCloseEvent * event )
767 {
768  if (wantToClose()) {
770 
771  if (app) {
772  app->closeExperiment(m_Experiment);
773  }
774  event -> accept();
775  } else {
776  event -> ignore();
777  }
778 }
779 
781 {
782  m_RecentExperimentsMenu = new QMenu(this);
783 
784  action->setMenu(m_RecentExperimentsMenu);
785 
786  connect(m_RecentExperimentsMenu, &QMenu::aboutToShow, this, &QxrdWindow::populateRecentExperimentsMenu);
787 }
788 
790 {
791  // printMessage("Populating recent experiments menu");
792 
793  m_ExperimentsMenu->clear();
794 
796 
797  if (app) {
798  QList<QxrdExperimentWPtr> exps = app->experiments();
799 
800  foreach (QxrdExperimentWPtr expw, exps) {
801  QxrdExperimentPtr exp(expw);
802 
803  if (exp) {
804  QString path = exp->experimentFilePath();
805 
806  QAction *action = new QAction(path, m_ExperimentsMenu);
807  QSignalMapper *mapper = new QSignalMapper(action);
808  connect(action, &QAction::triggered, mapper, (void (QSignalMapper::*)()) &QSignalMapper::map);
809  mapper->setMapping(action, path);
810 
811  connect(mapper, (void (QSignalMapper::*)(const QString&)) &QSignalMapper::mapped, app.data(), &QxrdApplication::activateExperiment);
812 
813  m_ExperimentsMenu -> addAction(action);
814  }
815  }
816  }
817 }
818 
820 {
821  // printMessage("Populating recent experiments menu");
822 
823  m_RecentExperimentsMenu->clear();
824 
826 
827  if (app) {
828  QStringList recent = app->get_RecentExperiments();
829 
830  foreach (QString exp, recent) {
831  QAction *action = new QAction(exp, m_RecentExperimentsMenu);
832  QSignalMapper *mapper = new QSignalMapper(action);
833  connect(action, &QAction::triggered, mapper, (void (QSignalMapper::*)()) &QSignalMapper::map);
834  mapper->setMapping(action, exp);
835 
836  connect(mapper, (void (QSignalMapper::*)(const QString&)) &QSignalMapper::mapped, app.data(),
838 
839  m_RecentExperimentsMenu -> addAction(action);
840  }
841  }
842 }
843 
845 {
846  m_ConfigureDetectorMenu->clear();
847 
849 
850  if (acq) {
851  int nDets = acq->get_DetectorCount();
852 
853  for (int i=0; i<nDets; i++) {
854  QxrdDetectorPtr det = acq->detector(i);
855  QString detType = det->get_DetectorTypeName();
856  QString detName = det->get_DetectorName();
857  bool enabled = det->get_Enabled();
858 
859  QString str = tr("(%1) Configure %2 detector \"%3\"...").arg(i).arg(detType).arg(detName);
860 
861  QAction *action = new QAction(str, m_ConfigureDetectorMenu);
862 
863  action->setCheckable(true);
864  action->setChecked(enabled);
865 
866  QSignalMapper *mapper = new QSignalMapper(action);
867 
868  connect(action, &QAction::triggered, mapper, (void (QSignalMapper::*)()) &QSignalMapper::map);
869  mapper->setMapping(action,i);
870 
871  connect(mapper, (void (QSignalMapper::*)(int)) &QSignalMapper::mapped,
872  acq.data(), &QxrdAcquisition::configureDetector, Qt::DirectConnection);
873 
874  m_ConfigureDetectorMenu->addAction(action);
875  }
876  }
877 }
878 
880 {
881  m_DetectorControlWindowsMenu->clear();
882 
884 
885  if (acq) {
886  int nDets = acq->get_DetectorCount();
887 
888  for (int i=0; i<nDets; i++) {
889  QxrdDetectorPtr det = acq->detector(i);
890  QString detType = det->get_DetectorTypeName();
891  QString detName = det->get_DetectorName();
892  bool enabled = det->get_Enabled();
893 
894  QString str = tr("(%1) Open %2 detector \"%3\" Control...").arg(i).arg(detType).arg(detName);
895 
896  QAction *action = new QAction(str, m_DetectorControlWindowsMenu);
897 
898  action->setCheckable(true);
899  action->setChecked(enabled);
900 
901  QSignalMapper *mapper = new QSignalMapper(action);
902 
903  connect(action, &QAction::triggered, mapper, (void (QSignalMapper::*)()) &QSignalMapper::map);
904  mapper->setMapping(action,i);
905 
906  connect(mapper, (void (QSignalMapper::*)(int)) &QSignalMapper::mapped,
907  acq.data(), &QxrdAcquisition::openDetectorControlWindow, Qt::DirectConnection);
908 
909  m_DetectorControlWindowsMenu->addAction(action);
910  }
911  }
912 }
913 
914 QString QxrdWindow::timeStamp() const
915 {
916  return QDateTime::currentDateTime().toString("yyyy.MM.dd : hh:mm:ss.zzz ");
917 }
918 
919 void QxrdWindow::printMessage(QString msg, QDateTime ts)
920 {
921  QString message = ts.toString("yyyy.MM.dd : hh:mm:ss.zzz ")+
922  QThread::currentThread()->objectName()+": "+
923  msg.trimmed();
924 
925  message = message.replace("\n", " : ");
926 
927  displayMessage(message);
928 }
929 
930 void QxrdWindow::warningMessage(QString msg)
931 {
932  if (QThread::currentThread()==thread()) {
933  QMessageBox::warning(this, tr("Warning"), msg);
934  } else {
935  INVOKE_CHECK(QMetaObject::invokeMethod(this,
936  "warningMessage",
937  Qt::QueuedConnection,
938  Q_ARG(QString, msg)));
939  }
940 }
941 
942 void QxrdWindow::displayMessage(QString msg)
943 {
944  if (QThread::currentThread()==thread()) {
945  m_Messages -> append(msg);
946  } else {
947  INVOKE_CHECK(QMetaObject::invokeMethod(this,
948  "displayMessage",
949  Qt::QueuedConnection,
950  Q_ARG(QString, msg)));
951  }
952 }
953 
954 void QxrdWindow::initialLogEntry(QString aline)
955 {
956  if (QThread::currentThread()==thread()) {
957  m_Messages -> append("<font color=#ff0000>"+aline+"</font>");
958  } else {
959  INVOKE_CHECK(QMetaObject::invokeMethod(this,
960  "initialLogEntry",
961  Qt::QueuedConnection,
962  Q_ARG(QString, aline)));
963  }
964 }
965 
967 {
968  if (QThread::currentThread()==thread()) {
969  static int dialogCount = 0;
970 
972 
973  if (expt) {
974  expt->printMessage(tr("critical message %1, count = %2").arg(msg).arg(dialogCount));
975  }
976 
977  dialogCount++;
978  if (dialogCount <= 1) {
979  QMessageBox::critical(this, "Error", msg);
980  }
981  dialogCount--;
982  } else {
983  INVOKE_CHECK(QMetaObject::invokeMethod(this,
984  "displayCriticalMessage",
985  Qt::QueuedConnection,
986  Q_ARG(QString, msg)));
987  }
988 }
989 
991 {
992 }
993 
995 {
996  THREAD_CHECK;
997 
998  m_Progress -> reset();
999 }
1000 
1002  QString fileName, int iphase, int nphases, int isum, int nsum, int igroup, int ngroup)
1003 {
1004  printMessage(tr("QxrdWindow::acquiredFrame(\"%1\",%2,%3,%4,%5,%6,%7)")
1005  .arg(fileName)
1006  .arg(iphase).arg(nphases)
1007  .arg(isum).arg(nsum)
1008  .arg(igroup).arg(ngroup));
1009  // printf("\n",
1010  // qPrintable(fileName), fileIndex, isum, nsum, iframe, nframe);
1011 
1012  int totalFrames = (nphases*nsum*ngroup <= 0 ? 1 : nphases*nsum*ngroup);
1013  int thisFrame = igroup*nphases*nsum + isum*nphases + iphase + 1;
1014 
1015  printMessage(tr("Frame %1 of %2").arg(thisFrame).arg(totalFrames));
1016 
1017  // printf("%d %% progress\n", thisFrame*100/totalFrames);
1018 
1020 
1021  if (expt) {
1022  if (nphases <= 1) {
1023  expt->statusMessage(tr("%1: Exposure %2 of %3, File %4 of %5")
1024  .arg(fileName)
1025  .arg(isum+1).arg(nsum)
1026  .arg(igroup+1).arg(ngroup));
1027  } else {
1028  expt->statusMessage(tr("%1: Phase %2 of %3, Sum %4 of %5, Group %6 of %7")
1029  .arg(fileName)
1030  .arg(iphase+1).arg(nphases)
1031  .arg(isum+1).arg(nsum)
1032  .arg(igroup+1).arg(ngroup));
1033  }
1034  }
1035 
1036  m_Progress -> setValue(thisFrame*100/totalFrames);
1037 }
1038 
1040 {
1042 
1043  if (set) {
1044  set->set_WindowGeometry(saveGeometry());
1045  set->set_WindowState(saveState(2));
1046  }
1047 }
1048 
1049 void QxrdWindow::resizeEvent(QResizeEvent *ev)
1050 {
1051  captureSize();
1052 
1053  QMainWindow::resizeEvent(ev);
1054 }
1055 
1056 void QxrdWindow::moveEvent(QMoveEvent *ev)
1057 {
1058  captureSize();
1059 
1060  QMainWindow::moveEvent(ev);
1061 }
1062 
1064 {
1065  if (QThread::currentThread()==thread()) {
1066  m_StatusMsg -> setText(msg);
1067 
1068  // printMessage(msg);
1069 
1070  m_StatusTimer.start(5000);
1071  } else {
1072  INVOKE_CHECK(QMetaObject::invokeMethod(this,
1073  "displayStatusMessage",
1074  Qt::QueuedConnection,
1075  Q_ARG(QString, msg)));
1076  }
1077 }
1078 
1080 {
1081  m_StatusMsg -> setText("");
1082 }
1083 
1085 {
1086  // QcepMutexLocker lock(__FILE__, __LINE__, &m_NewDataMutex);
1087 
1088  // image -> copyImage(m_NewData);
1089  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
1090 
1091  m_NewData = image;
1092  m_NewOverflow = overflow;
1093 
1094  m_NewDataAvailable.fetchAndAddOrdered(1);
1095 
1096  // INVOKE_CHECK(QMetaObject::invokeMethod(this, "newData", Qt::QueuedConnection));
1097 }
1098 
1100 {
1101  // QcepMutexLocker lock(__FILE__, __LINE__, &m_NewMaskMutex);
1102 
1103  // mask -> copyMaskTo(m_NewMask);
1104  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
1105 
1106  m_NewMask = mask;
1107  m_NewMaskAvailable.fetchAndAddOrdered(1);
1108 
1109  INVOKE_CHECK(QMetaObject::invokeMethod(this, "newMask", Qt::QueuedConnection));
1110 }
1111 
1113 {
1114  captureSize();
1115 
1116  // QcepMutexLocker lock(__FILE__, __LINE__, &m_NewDataMutex);
1117 
1118  if (m_NewDataAvailable.fetchAndStoreOrdered(0)) {
1119  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
1120 
1121  // QcepDoubleImageDataPtr tmp = m_Data;
1122  m_Data = m_NewData;
1124 
1127 
1128  m_ImagePlot -> onProcessedImageAvailable(m_Data, m_Overflow);
1129  m_CenterFinderPlot -> onProcessedImageAvailable(m_Data);
1130 
1131  if (m_ImageDisplay) {
1132  m_ImageDisplay -> updateImage(m_Data, m_Overflow);
1133  }
1134 
1135  if (m_SliceDialog) {
1136  m_SliceDialog -> onProcessedImageAvailable(m_Data, m_Overflow);
1137  }
1138 
1139  if (m_HistogramDialog) {
1140  m_HistogramDialog -> onProcessedImageAvailable(m_Data, m_Overflow);
1141  }
1142 
1143  if (m_ImageInfoDialog) {
1144  m_ImageInfoDialog -> onProcessedImageAvailable(m_Data, m_Overflow);
1145  }
1146  }
1147 }
1148 
1150 {
1151  // QcepMutexLocker lock(__FILE__, __LINE__, &m_NewMaskMutex);
1152 
1153  if (m_NewMaskAvailable.fetchAndAddOrdered(0)) {
1154  QcepMutexLocker lock(__FILE__, __LINE__, &m_Mutex);
1155 
1156  // QcepMaskDataPtr tmp = m_Mask;
1157  m_Mask = m_NewMask;
1158  m_NewMask = QcepMaskDataPtr(NULL);
1159  m_NewMaskAvailable.fetchAndStoreOrdered(0);
1160 
1161  m_ImagePlot -> onMaskedImageAvailable(m_Data, m_Mask);
1162  m_CenterFinderPlot -> onMaskedImageAvailable(m_Data, m_Mask);
1163 
1164  if (m_ImageDisplay) {
1166  }
1167  }
1168 }
1169 
1171 {
1173 
1175 
1176  prefs.exec();
1177 }
1178 
1180 {
1182 
1184 
1185  prefs.exec();
1186 }
1187 
1189 {
1191 
1194 
1195  if (app && expt) {
1196  QString path = expt->experimentFilePath();
1197  QString name = expt->defaultExperimentName(path);
1198  QString dirp = expt->defaultExperimentDirectory(path);
1199 
1200  QDir dir(expt->get_ExperimentDirectory());
1201 
1202  QString newPath = dir.filePath(name+"-copy.qxrdp");
1203 
1204  QString newChoice = QFileDialog::getSaveFileName(NULL,
1205  "Save Experiment As",
1206  newPath,
1207  "QXRD Experiments (*.qxrdp)");
1208 
1209  if (newChoice.length()>0) {
1210  expt->saveExperimentAs(newChoice);
1211  app->appendRecentExperiment(newChoice);
1212  }
1213  }
1214 }
1215 
1217 {
1219 
1222 
1223  if (app && expt) {
1224  QString path = expt->experimentFilePath();
1225  QString name = expt->defaultExperimentName(path);
1226  QString dirp = expt->defaultExperimentDirectory(path);
1227 
1228  QDir dir(expt->get_ExperimentDirectory());
1229 
1230  QString newPath = dir.filePath(name+"-copy.qxrdp");
1231 
1232  QString newChoice = QFileDialog::getSaveFileName(NULL,
1233  "Save Experiment Copy",
1234  newPath,
1235  "QXRD Experiments (*.qxrdp)");
1236 
1237  if (newChoice.length()>0) {
1238  expt->saveExperimentCopyAs(newChoice);
1239  app->appendRecentExperiment(newChoice);
1240  }
1241  }
1242 }
1243 
1245 {
1247 
1249 
1250  if (proc) {
1251  if (proc->data() == NULL) {
1252  warningMessage("No data available to save");
1253  } else {
1254  QString theFile = QFileDialog::getSaveFileName(
1255  this, "Save Data in", proc -> get_DataPath());
1256 
1257  if (theFile.length()) {
1258  proc->saveData(theFile, QxrdDataProcessor::CanOverwrite);
1259  }
1260  }
1261  }
1262 }
1263 
1265 {
1267 
1269 
1270  if (proc) {
1271  QString theFile = QFileDialog::getOpenFileName(
1272  this, "Load Data from...", proc -> get_DataPath());
1273 
1274  if (theFile.length()) {
1275  proc->loadData(theFile);
1276  }
1277  }
1278 }
1279 
1281 {
1283 
1285 
1286  if (proc) {
1287  if (proc->darkImage() == NULL) {
1288  warningMessage("No dark image available to save");
1289  } else {
1290  QString theFile = QFileDialog::getSaveFileName(
1291  this, "Save Dark Data in", proc -> get_DataPath());
1292 
1293  if (theFile.length()) {
1294  proc->saveDark(theFile, QxrdDataProcessor::CanOverwrite);
1295  }
1296  }
1297  }
1298 }
1299 
1301 {
1303 
1305 
1306  if (proc) {
1307  QString theFile = QFileDialog::getOpenFileName(
1308  this, "Load Dark Data from...", proc -> get_DataPath());
1309 
1310  if (theFile.length()) {
1311  proc->loadDark(theFile);
1312  }
1313  }
1314 }
1315 
1317 {
1319 
1321 
1322  if (proc) {
1323  if (proc->darkImage() == NULL) {
1324  warningMessage("No dark image available to clear");
1325  } else {
1326  if (QMessageBox::question(this, "Clear Dark Image?", "Do you really want to clear the dark image?",
1327  QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) {
1328  proc->clearDark();
1329  }
1330  }
1331  }
1332 }
1333 
1335 {
1337 
1339 
1340  if (proc) {
1341  if (proc->mask() == NULL) {
1342  warningMessage("No mask image to save");
1343  } else {
1344  QString theFile = QFileDialog::getSaveFileName(
1345  this, "Save Mask in", proc -> get_DataPath());
1346 
1347  if (theFile.length()) {
1348  proc->saveMask(theFile, QxrdDataProcessor::CanOverwrite);
1349  }
1350  }
1351  }
1352 }
1353 
1355 {
1357 
1359 
1360  if (proc) {
1361  QString theFile = QFileDialog::getOpenFileName(
1362  this, "Load Mask from...", proc -> get_DataPath());
1363 
1364  if (theFile.length()) {
1365  proc->loadMask(theFile);
1366  }
1367  }
1368 }
1369 
1371 {
1373 
1375 
1376  if (proc) {
1377  if (proc->mask() == NULL) {
1378  warningMessage("No mask image available to clear");
1379  } else {
1380  if (QMessageBox::question(this, "Clear Mask?", "Do you really want to clear the mask?",
1381  QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) {
1382  proc->clearMask();
1383  }
1384  }
1385  }
1386 }
1387 
1389 {
1391 
1393 
1394  if (proc) {
1395  if (proc->badPixels() == NULL) {
1396  warningMessage("No Bad Pixel data to save");
1397  } else {
1398  QString theFile = QFileDialog::getSaveFileName(
1399  this, "Save Bad Pixels in", proc -> get_DataPath());
1400 
1401  if (theFile.length()) {
1402  proc->saveBadPixels(theFile, QxrdDataProcessor::CanOverwrite);
1403  }
1404  }
1405  }
1406 }
1407 
1409 {
1411 
1413 
1414  if (proc) {
1415  QString theFile = QFileDialog::getOpenFileName(
1416  this, "Load Bad Pixel Map from...", proc -> get_DataPath());
1417 
1418  if (theFile.length()) {
1419  proc->loadBadPixels(theFile);
1420  }
1421  }
1422 }
1423 
1425 {
1427 
1429 
1430  if (proc) {
1431  if (proc->badPixels() == NULL) {
1432  warningMessage("No Bad Pixel data to clear");
1433  } else {
1434  if (QMessageBox::question(this, "Clear Bad Pixels", "Do you really want to clear the bad pixel map?",
1435  QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) {
1436  proc->clearBadPixels();
1437  }
1438  }
1439  }
1440 }
1441 
1443 {
1445 
1447 
1448  if (proc) {
1449  if (proc->gainMap() == NULL) {
1450  warningMessage("No Gain Map available to save");
1451  } else {
1452  QString theFile = QFileDialog::getSaveFileName(
1453  this, "Save Gain Map in", proc -> get_DataPath());
1454 
1455  if (theFile.length()) {
1456  proc->saveGainMap(theFile, QxrdDataProcessor::CanOverwrite);
1457  }
1458  }
1459  }
1460 }
1461 
1463 {
1465 
1467 
1468  if (proc) {
1469  QString theFile = QFileDialog::getOpenFileName(
1470  this, "Load Pixel Gain Map from...", proc -> get_DataPath());
1471 
1472  if (theFile.length()) {
1473  proc->loadGainMap(theFile);
1474  }
1475  }
1476 }
1477 
1479 {
1481 
1483 
1484  if (proc) {
1485  if (proc->gainMap() == NULL) {
1486  warningMessage("No Gain Map available to clear");
1487  } else {
1488  if (QMessageBox::question(this, "Clear Gain Map", "Do you really want to clear the gain map?",
1489  QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok) {
1490  proc->clearGainMap();
1491  }
1492  }
1493  }
1494 }
1495 
1497 {
1499 
1501 
1502  if (proc) {
1503  QxrdIntegratorPtr integ(proc->integrator());
1504 
1505  QString theFile = QFileDialog::getSaveFileName(
1506  this, "Save Cached Geometry in", m_CachedGeometryPath);
1507 
1508  if (theFile.length()) {
1509  m_CachedGeometryPath = theFile;
1510 
1511  proc -> saveCachedGeometry(theFile);
1512  }
1513  }
1514 }
1515 
1517 {
1519 
1521 
1522  if (proc) {
1523  QxrdIntegratorPtr integ(proc->integrator());
1524 
1525  QString theFile = QFileDialog::getSaveFileName(
1526  this, "Save Cached Intensity in", m_CachedIntensityPath);
1527 
1528  if (theFile.length()) {
1529  m_CachedIntensityPath = theFile;
1530 
1531  proc -> saveCachedIntensity(theFile);
1532  }
1533  }
1534 }
1535 
1537 {
1538 
1539  // m_Data -> setCircularMask();
1540 }
1541 
1543 {
1544  emit executeCommand(m_ScriptEdit -> toPlainText());
1545 
1546  m_CancelScriptButton -> setEnabled(true);
1547  m_ActionCancelScript -> setEnabled(true);
1548  m_ExecuteScriptButton -> setEnabled(false);
1549  m_ActionExecuteScript -> setEnabled(false);
1550 }
1551 
1553 {
1555 
1556  if (expt) {
1557  QxrdScriptEnginePtr eng(expt -> scriptEngine());
1558 
1559  if (eng) {
1560  eng -> cancelCommand();
1561  }
1562  }
1563 }
1564 
1565 void QxrdWindow::finishedCommand(QScriptValue result)
1566 {
1567  if (result.isError()) {
1568  int line = result.property("lineNumber").toInteger();
1569 
1570  m_Messages -> append(tr("Error in line %1").arg(line));
1571  m_Messages -> append(result.property("message").toString());
1572  } else {
1573  m_Messages -> append(QxrdScriptEngine::convertToString(result));
1574  }
1575 
1576  m_CancelScriptButton -> setEnabled(false);
1577  m_ActionCancelScript -> setEnabled(false);
1578  m_ExecuteScriptButton -> setEnabled(true);
1579  m_ActionExecuteScript -> setEnabled(true);
1580 }
1581 
1583 {
1585 
1586  if (proc) {
1587  QString theFile = QFileDialog::getOpenFileName(
1588  this, "Load Script from...", proc->get_ScriptPath());
1589 
1590  if (theFile.length()) {
1591  proc->set_ScriptPath(theFile);
1592 
1593  loadScript(theFile);
1594  }
1595  }
1596 }
1597 
1598 void QxrdWindow::loadScript(QString path)
1599 {
1601 
1602  if (expt) {
1603  QxrdScriptEnginePtr eng(expt -> scriptEngine());
1604 
1605  if (eng) {
1606  expt -> printMessage(tr("Loading script file from %1").arg(path));
1607  eng -> loadScript(path);
1608  }
1609  }
1610 }
1611 
1613 {
1614  return m_DataProcessor;
1615 }
1616 
1618 {
1619  return m_Acquisition;
1620 }
1621 
1623 {
1624  return m_Data;
1625 }
1626 
1628 {
1629  return m_Mask;
1630 }
1631 
1633 {
1634  QcepAllocatorPtr allocator(m_Allocator);
1635 
1636  if (allocator) {
1637  int alloc = allocator -> get_Allocated();
1638  int maxalloc = allocator -> get_Max();
1639 
1640  m_AllocationStatus -> setMaximum(maxalloc);
1641  m_AllocationStatus -> setValue(alloc);
1642  }
1643 }
1644 
1646 {
1647 }
1648 
1650 {
1652 
1653  if (proc) {
1654  QStringList files = QFileDialog::getOpenFileNames(this,
1655  "Select data files to accumulate...",
1656  proc -> get_DataPath());
1657 
1658  QMetaObject::invokeMethod(proc.data(), "accumulateImages", Q_ARG(QStringList, files));
1659  }
1660 }
1661 
1663 {
1665 
1666  if (proc) {
1667  QStringList files = QFileDialog::getOpenFileNames(this,
1668  "Select data file(s) to add to current...",
1669  proc -> get_DataPath());
1670 
1671  QMetaObject::invokeMethod(proc.data(), "addImages", Q_ARG(QStringList, files));
1672  }
1673 }
1674 
1676 {
1678 
1679  if (proc) {
1680  QStringList files = QFileDialog::getOpenFileNames(this,
1681  "Select data file(s) to subtract from current...",
1682  proc -> get_DataPath());
1683 
1684  QMetaObject::invokeMethod(proc.data(), "subtractImages", Q_ARG(QStringList, files));
1685  }
1686 }
1687 
1689 {
1691 
1692  if (proc) {
1693  QMetaObject::invokeMethod(proc.data(), "reflectHorizontally");
1694  }
1695 }
1696 
1698 {
1700 
1701  if (proc) {
1702  QMetaObject::invokeMethod(proc.data(), "reflectVertically");
1703  }
1704 }
1705 
1707 {
1709 
1710  if (proc) {
1711  QStringList files = QFileDialog::getOpenFileNames(this,
1712  "Select data files to project along X...",
1713  proc -> get_DataPath());
1714 
1715  QMetaObject::invokeMethod(proc.data(), "projectImages", Q_ARG(QStringList, files),
1716  Q_ARG(int, 1), Q_ARG(int, 0), Q_ARG(int, 0));
1717  }
1718 }
1719 
1721 {
1723 
1724  if (proc) {
1725  QStringList files = QFileDialog::getOpenFileNames(this,
1726  "Select data files to project along Y...",
1727  proc -> get_DataPath());
1728 
1729  QMetaObject::invokeMethod(proc.data(), "projectImages", Q_ARG(QStringList, files),
1730  Q_ARG(int, 0), Q_ARG(int, 1), Q_ARG(int, 0));
1731  }
1732 }
1733 
1735 {
1737 
1738  if (proc) {
1739  QStringList files = QFileDialog::getOpenFileNames(this,
1740  "Select data files to project along Z...",
1741  proc -> get_DataPath());
1742 
1743  QMetaObject::invokeMethod(proc.data(), "projectImages", Q_ARG(QStringList, files),
1744  Q_ARG(int, 0), Q_ARG(int, 0), Q_ARG(int, 1));
1745  }
1746 }
1747 
1749 {
1751 
1752  if (proc) {
1753  QStringList files = QFileDialog::getOpenFileNames(this,
1754  "Select data files to correlate with current image...",
1755  proc -> get_DataPath());
1756 
1757  QMetaObject::invokeMethod(proc.data(), "correlateImages", Q_ARG(QStringList, files));
1758  }
1759 }
1760 
1762 {
1764 
1765  if (proc) {
1766  QStringList files = QFileDialog::getOpenFileNames(this,
1767  "Select data files to integrate...",
1768  proc -> get_DataPath());
1769 
1770  foreach (QString file, files) {
1771  proc->integrateData(file);
1772  }
1773  }
1774 }
1775 
1777 {
1779 
1780  if (proc) {
1781  QStringList files = QFileDialog::getOpenFileNames(this,
1782  "Select data files to process...",
1783  proc -> get_DataPath());
1784 
1785  foreach (QString file, files) {
1786  proc->processData(file);
1787  }
1788  }
1789 }
1790 
1792 {
1793  m_ActionIntegrateVsR -> setChecked(newXUnits == QxrdIntegrator::RadialIntegrateR);
1794  m_ActionIntegrateVsQ -> setChecked(newXUnits == QxrdIntegrator::RadialIntegrateQ);
1795  m_ActionIntegrateVsTTH -> setChecked(newXUnits == QxrdIntegrator::RadialIntegrateTTH);
1796 }
1797 
1799 {
1800  if (QMessageBox::question(this, tr("Really Crash?"),
1801  tr("Do you really want to crash the program?"),
1802  QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
1803  int *j = NULL;
1804 
1805  *j= 42;
1806  }
1807 }
1808 
1810 {
1811  if (QThread::currentThread() != thread()) {
1812  INVOKE_CHECK(QMetaObject::invokeMethod(this, "testWidget", Qt::BlockingQueuedConnection));
1813  } else {
1814  QDockWidget *dockWidget = new QDockWidget("Test", this);
1815  QWidget *contents = new QMainWindow(dockWidget);
1816  QMenuBar *menuBar = new QMenuBar(contents);
1817 
1818  QMenu *test1Menu = menuBar->addMenu("Test1");
1819  QMenu *test2Menu = menuBar->addMenu("Test2");
1820 
1821  test1Menu->addAction("Cmd1");
1822  test1Menu->addAction("Cmd2");
1823  test2Menu->addAction("Cmd3");
1824  test2Menu->addAction("Cmd4");
1825 
1826  addDockWidget(Qt::RightDockWidgetArea, dockWidget);
1827 
1828  contents->show();
1829  }
1830 }
1831 
1833 {
1834  m_Messages -> document() -> setMaximumBlockCount(newVal);
1835 }
1836 
1838 {
1839  m_UpdateTimer.setInterval(newVal);
1840 }
1841 
1843 {
1845 
1846  if (expt) {
1847  QxrdCenterFinderPtr cf(expt->centerFinder());
1848 
1849  if (cf) {
1850  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotCurve);
1851  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotMarker);
1852 
1853  int nrgs = cf->countPowderRings();
1854  int npts = cf->countPowderRingPoints();
1855 
1856  for (int r=0; r<nrgs; r++) {
1857  QVector<double> x, y;
1858 
1859  for (int i=0; i<npts; i++) {
1860  QxrdPowderPoint pt = cf->powderRingPoint(i);
1861 
1862  if (pt.n1() == r && pt.n2() == 0) {
1863  x.append(cf->getChi(pt.x(), pt.y()));
1864  y.append(cf->getR (pt.x(), pt.y()));
1865  }
1866  }
1867 
1868  if (cf->get_SubtractRingAverages()) {
1869  double sum = 0;
1870  int n = y.count();
1871  for (int i=0; i<n; i++) {
1872  sum += y[i];
1873  }
1874 
1875  double avg = sum/(double)n - cf->get_RingAverageDisplacement()*r;
1876  for (int i=0; i<n; i++) {
1877  y[i] -= avg;
1878  }
1879 // } else {
1880 // double d = cf->get_RingAverageDisplacement()*r;
1881 // int n=y.count();
1882 // for (int i=0; i<n; i++) {
1883 // y[i] += d;
1884 // }
1885  }
1886 
1887  if (x.count() > 0) {
1888  QwtPlotCurve* pc = new QwtPlotCurve(tr("Ring %1").arg(r));
1889 
1890  m_DistortionCorrectionPlot->setPlotCurveStyle(r, pc);
1891 
1892  pc -> setSamples(x, y);
1893 
1894  pc -> setStyle(QwtPlotCurve::NoCurve);
1895  pc -> setLegendAttribute(QwtPlotCurve::LegendShowSymbol, true);
1896 
1897  pc -> attach(m_DistortionCorrectionPlot);
1898  }
1899  }
1900 
1901 // m_DistortionCorrectionPlot->autoScale();
1902  m_DistortionCorrectionPlot->replot();
1903  }
1904  }
1905 }
1906 
1908 {
1910 
1911  if (expt) {
1912  QxrdCenterFinderPtr cf(expt->centerFinder());
1913 
1914  if (cf) {
1915 // cf->updateCalibrantDSpacings();
1916 
1917  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotCurve);
1918  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotMarker);
1919 
1920  int nrgs = cf->countPowderRings();
1921  int npts = cf->countPowderRingPoints();
1922 
1923  for (int r=0; r<nrgs; r++) {
1924  QVector<double> x, y;
1925 
1926  for (int i=0; i<npts; i++) {
1927  QxrdPowderPoint pt = cf->powderRingPoint(i);
1928 
1929  if (pt.n1() == r && pt.n2() == 0) {
1930  x.append(cf->getChi(pt.x(), pt.y()));
1931  y.append(cf->getTTH(pt.x(), pt.y()));
1932  }
1933  }
1934 
1935  double avg=0;
1936 
1937  double calTTH = cf->calibrantTTH(r);
1938 
1939  if (cf->get_SubtractRingAverages()) {
1940  int n = y.count();
1941  // double sum = 0;
1942 // for (int i=0; i<n; i++) {
1943 // sum += y[i];
1944 // }
1945 
1946  avg = calTTH - cf->get_RingAverageDisplacement()*r;
1947  for (int i=0; i<n; i++) {
1948  y[i] -= avg;
1949  }
1950 // } else {
1951 // double d = cf->get_RingAverageDisplacement()*r;
1952 // int n=y.count();
1953 // for (int i=0; i<n; i++) {
1954 // y[i] += d;
1955 // }
1956  }
1957 
1958  if (x.count() >= 0) {
1959  QwtPlotCurve* pc = new QwtPlotCurve(tr("Ring %1").arg(r));
1960 
1961  m_DistortionCorrectionPlot->setPlotCurveStyle(r, pc);
1962 
1963  pc -> setSamples(x, y);
1964 
1965  pc -> setStyle(QwtPlotCurve::NoCurve);
1966  pc -> setLegendAttribute(QwtPlotCurve::LegendShowSymbol, true);
1967 
1968  pc -> attach(m_DistortionCorrectionPlot);
1969 
1970  if (calTTH > 0) {
1971  QwtPlotCurve* tth = new QwtPlotCurve(tr("Cal %1").arg(r));
1972  QVector<double> x1,y1;
1973  x1.append(0); y1.append(calTTH - avg);
1974  x1.append(360); y1.append(calTTH - avg);
1975  m_DistortionCorrectionPlot->setPlotCurveStyle(r, tth);
1976  tth -> setSamples(x1,y1);
1977  tth -> setSymbol(NULL);
1978  tth -> attach(m_DistortionCorrectionPlot);
1979  }
1980  }
1981  }
1982 
1983 // m_DistortionCorrectionPlot->autoScale();
1984  m_DistortionCorrectionPlot->replot();
1985  }
1986  }
1987 }
1988 
1990 {
1992 
1993  if (expt) {
1994  QxrdCenterFinderPtr cf(expt->centerFinder());
1995 
1996  if (cf) {
1997  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotCurve);
1998  m_DistortionCorrectionPlot->detachItems(QwtPlotItem::Rtti_PlotMarker);
1999 
2000  QxrdPowderPointVector pts = cf->get_FittedRings();
2001  int npts = pts.count();
2002 
2003  QVector<double> x, y;
2004 
2005  for (int i=0; i<npts; i++) {
2006  QxrdPowderPoint &pt = pts[i];
2007  x.append(pt.x());
2008  y.append(pt.y());
2009  }
2010 
2011  QwtPlotCurve* pc = new QwtPlotCurve(tr("Ring Centers"));
2012 
2013  m_DistortionCorrectionPlot->setPlotCurveStyle(0, pc);
2014 
2015  pc -> setSamples(x, y);
2016 
2017  pc -> setLegendAttribute(QwtPlotCurve::LegendShowSymbol, true);
2018  pc -> attach(m_DistortionCorrectionPlot);
2019 
2020  m_DistortionCorrectionPlot->replot();
2021  }
2022  }
2023 }
2024 
2025 //void QxrdWindow::doOpenAcquisitionWindow()
2026 //{
2027 // GUI_THREAD_CHECK;
2028 
2029 // QxrdExperimentPtr expt(m_Experiment);
2030 
2031 // if (expt) {
2032 // expt->openAcquisitionWindow();
2033 // }
2034 //}
2035 
2037 {
2039 
2040 
2042 
2043  if (expt) {
2044  QxrdDataProcessorPtr proc(expt->dataProcessor());
2045 
2046  if (proc) {
2047  QxrdPolarTransformDialog transform(proc, this);
2048 
2049  transform.exec();
2050  }
2051  }
2052 }
2053 
2055 {
2057 
2058 
2060 
2061  if (expt) {
2062  QxrdDataProcessorPtr proc(expt->dataProcessor());
2063 
2064  if (proc) {
2065  QxrdPolarNormalizationDialog norm(proc, this);
2066 
2067  norm.exec();
2068  }
2069  }
2070 }
QSharedPointer< QxrdExperiment > QxrdExperimentPtr
void doLoadData()
void doLoadMask()
double y() const
QSharedPointer< QxrdCenterFinder > QxrdCenterFinderPtr
void newData()
QxrdAcquisitionScalerDialog * m_AcquisitionScalerDialog
Definition: qxrdwindow.h:174
QxrdOutputFileBrowser * m_OutputFileBrowser
Definition: qxrdwindow.h:186
void populateRecentExperimentsMenu()
Definition: qxrdwindow.cpp:819
void activateExperiment(QString path)
QcepDoubleImageDataPtr m_NewData
Definition: qxrdwindow.h:201
QxrdImageCalculator * m_Calculator
Definition: qxrdwindow.h:184
void crashProgram()
QWeakPointer< QxrdDataProcessor > QxrdDataProcessorWPtr
QcepDoubleImageDataPtr data()
void doProjectAlongY()
qint64 qcepDebug(int cond)
Definition: qcepdebug.cpp:26
void doProcessSequence()
void loadScript(QString path)
int n2() const
void fitPowderCircle(int n=0)
void captureSize()
void onCenterYChanged(double cy)
void executeCommand(QString cmd)
QSharedPointer< QxrdAcquisition > QxrdAcquisitionPtr
QxrdAcquisitionExtraInputsDialogPtr m_AcquisitionExtraInputsDialog
Definition: qxrdwindow.h:175
void doLoadBadPixels()
void onUpdateIntervalMsecChanged(int newVal)
void onCenterXChanged(double cx)
QxrdDistortionCorrectionDialog * m_DistortionCorrectionDialog
Definition: qxrdwindow.h:191
QcepMaskDataPtr mask()
void selectHistogram(QRectF rect)
QxrdInputFileBrowser * m_InputFileBrowser
Definition: qxrdwindow.h:185
void onNewIntegrationAvailable(QcepIntegratedDataPtr data)
void chooseExistingExperiment()
void setInverseGrayscale()
QSharedPointer< QxrdWindowSettings > QxrdWindowSettingsPtr
void integrationXUnitsChanged(int newXUnits)
void enableMaskCircles()
QxrdAcquisitionWPtr m_Acquisition
Definition: qxrdwindow.h:170
QSharedPointer< QxrdCalibrantLibrary > QxrdCalibrantLibraryPtr
QxrdWindow(QxrdWindowSettingsWPtr settings, QxrdApplicationWPtr appl, QxrdExperimentWPtr docw, QxrdAcquisitionWPtr acqw, QxrdDataProcessorWPtr procw, QcepAllocatorWPtr allocw, QWidget *parent)
Definition: qxrdwindow.cpp:61
QSharedPointer< QxrdDataProcessor > QxrdDataProcessorPtr
void toggleShowOverflow()
#define STR(s)
Definition: qcepmacros.h:16
void warningMessage(QString msg)
Definition: qxrdwindow.cpp:930
void configureDetector(int i)
#define GUI_THREAD_CHECK
Definition: qcepmacros.h:10
QSharedPointer< QxrdScriptEngine > QxrdScriptEnginePtr
void newMaskAvailable(QcepMaskDataPtr img)
void doSaveDark()
QcepDatasetBrowserDialog * m_DatasetBrowserDialog
Definition: qxrdwindow.h:182
QcepDoubleImageDataPtr m_Data
Definition: qxrdwindow.h:199
QcepObjectNamer m_ObjectNamer
Definition: qxrdwindow.h:165
void acquireStarted()
Definition: qxrdwindow.cpp:990
QcepAllocatorWPtr m_Allocator
Definition: qxrdwindow.h:172
void acquireComplete()
Definition: qxrdwindow.cpp:994
QcepMaskDataPtr m_NewMask
Definition: qxrdwindow.h:206
QxrdAcquisitionDialog * m_AcquisitionDialog
Definition: qxrdwindow.h:173
void plotPowderRingRadii()
void doSaveBadPixels()
QWeakPointer< QxrdApplication > QxrdApplicationWPtr
void saveExperimentAs()
QWeakPointer< QxrdExperiment > QxrdExperimentWPtr
void doSubtractImages()
QxrdDisplayDialog * m_DisplayDialog
Definition: qxrdwindow.h:177
void openRecentExperiment(QString path)
void onMessageWindowLinesChanged(int newVal)
void moveEvent(QMoveEvent *)
void doEditPreferences()
void acquiredFrame(QString fileName, int isum, int nsum, int iframe, int nframe, int igroup, int ngroup)
QxrdExperimentWPtr m_Experiment
Definition: qxrdwindow.h:169
void doProjectAlongZ()
void executeScript()
virtual void autoScale()
Definition: qcepplot.cpp:188
void updateTitle()
Definition: qxrdwindow.cpp:739
void doSaveGainMap()
void doSaveData()
void doLoadScript()
void initialize()
Definition: qxrdwindow.cpp:120
QAtomicInt m_NewDataAvailable
Definition: qxrdwindow.h:203
QString timeStamp() const
Definition: qxrdwindow.cpp:914
static QString convertToString(QScriptValue result)
QProgressBar * m_AllocationStatus
Definition: qxrdwindow.h:195
void doLoadGainMap()
void resizeEvent(QResizeEvent *)
#define INVOKE_CHECK(res)
Definition: qcepmacros.h:13
QLabel * m_StatusMsg
Definition: qxrdwindow.h:194
void openDetectorControlWindow(int i)
void onCenterYChanged(double cy)
void cancelScript()
void onAcquisitionInit()
Definition: qxrdwindow.cpp:756
void printGraph()
Definition: qcepplot.cpp:199
void displayStatusMessage(QString msg)
QcepMaskDataPtr m_Mask
Definition: qxrdwindow.h:205
void enableCentering()
void newIntegrationAvailable(QcepIntegratedDataPtr data)
void doReflectVertically()
QxrdHighlighter * m_Highlighter
Definition: qxrdwindow.h:210
void enableMeasuring()
Definition: qcepplot.cpp:267
void printMessage(QString msg, QDateTime ts=QDateTime::currentDateTime())
Definition: qxrdwindow.cpp:919
virtual ~QxrdWindow()
Definition: qxrdwindow.cpp:722
void doPolarTransform()
void shrinkPanels(int fontSize, int spacing)
QxrdIntegratorDialog * m_IntegratorDialog
Definition: qxrdwindow.h:183
QxrdDataProcessorWPtr dataProcessor() const
void displayCriticalMessage(QString msg)
Definition: qxrdwindow.cpp:966
void testWidget()
void slicePolygon(QVector< QPointF > poly)
void setupAcquireMenu(QMenu *menu)
void enableTiltRefinement(bool enable)
Definition: qxrdwindow.cpp:761
void doRefineCenterTilt()
QWeakPointer< QcepAllocator > QcepAllocatorWPtr
void toggleShowImage()
QSharedPointer< QxrdIntegrator > QxrdIntegratorPtr
QxrdApplicationWPtr m_Application
Definition: qxrdwindow.h:168
void enableMeasuring()
void enablePowderPoints()
QWeakPointer< QxrdWindowSettings > QxrdWindowSettingsWPtr
void setSpacing(int spacing)
void updateImage(QcepDoubleImageDataPtr img, QcepMaskDataPtr ovflow=QcepMaskDataPtr(), QcepMaskDataPtr mask=QcepMaskDataPtr())
void doSaveMask()
#define str(s)
QTimer m_UpdateTimer
Definition: qxrdwindow.h:197
QxrdCenterFinderDialog * m_CenterFinderDialog
Definition: qxrdwindow.h:178
QSharedPointer< QxrdImagePlotSettings > QxrdImagePlotSettingsPtr
QxrdSliceDialog * m_SliceDialog
Definition: qxrdwindow.h:187
void doAccumulateImages()
void initialLogEntry(QString aline)
Definition: qxrdwindow.cpp:954
QString m_CachedGeometryPath
Definition: qxrdwindow.h:216
void finishedCommand(QScriptValue result)
void closeEvent(QCloseEvent *event)
Definition: qxrdwindow.cpp:766
void doSaveCachedIntensity()
#define THREAD_CHECK
Definition: qcepmacros.h:11
QxrdWindowSettingsWPtr m_WindowSettings
Definition: qxrdwindow.h:167
void histogramSelectionChanged(QRectF rect)
void saveExperimentCopy()
void plotPowderRingTwoTheta()
QxrdCalibrantDialog * m_CalibrantDialog
Definition: qxrdwindow.h:181
double x() const
int n1() const
QMutex m_Mutex
Definition: qxrdwindow.h:166
QxrdDataProcessorWPtr m_DataProcessor
Definition: qxrdwindow.h:171
void doIntegrateSequence()
void populateConfigureDetectorMenu()
Definition: qxrdwindow.cpp:844
void doClearGainMap()
QTimer m_StatusTimer
Definition: qxrdwindow.h:196
void doAddImages()
void populateExperimentsMenu()
Definition: qxrdwindow.cpp:789
QProgressBar * m_Progress
Definition: qxrdwindow.h:193
QxrdScriptDialog * m_ScriptDialog
Definition: qxrdwindow.h:190
QWeakPointer< QxrdAcquisition > QxrdAcquisitionWPtr
void clearStatusMessage()
void doTest()
void setupRecentExperimentsMenu(QAction *action)
Definition: qxrdwindow.cpp:780
QMenu * m_RecentExperimentsMenu
Definition: qxrdwindow.h:214
QSharedPointer< QcepAllocator > QcepAllocatorPtr
void plotPowderRingCenters()
void setFontSize(int fontSize)
void enableZooming()
Definition: qcepplot.cpp:261
void enableMaskPolygons()
void valueChanged(double val, int index)
void doReflectHorizontally()
void doPolarNormalization()
QxrdHistogramDialog * m_HistogramDialog
Definition: qxrdwindow.h:188
void zoomOut()
Definition: qcepplot.cpp:247
QxrdAcquisitionWPtr acquisition() const
void displayMessage(QString msg)
Definition: qxrdwindow.cpp:942
void populateDetectorControlWindowsMenu()
Definition: qxrdwindow.cpp:879
QxrdInfoDialog * m_ImageInfoDialog
Definition: qxrdwindow.h:189
QSharedPointer< QxrdDetector > QxrdDetectorPtr
QxrdImageDisplayWidget * m_ImageDisplay
Definition: qxrdwindow.h:209
void doLoadDark()
QString m_CachedIntensityPath
Definition: qxrdwindow.h:217
void doEditDetectorPreferences()
void newMask()
void doSaveCachedGeometry()
void valueChanged(int val, int index)
QSharedPointer< QcepMaskData > QcepMaskDataPtr
void newDataAvailable(QcepDoubleImageDataPtr img, QcepMaskDataPtr overflow)
QxrdCorrectionDialog * m_CorrectionDialog
Definition: qxrdwindow.h:180
QSharedPointer< QxrdApplication > QxrdApplicationPtr
QxrdSynchronizedAcquisitionDialogPtr m_SynchronizedAcquisitionDialog
Definition: qxrdwindow.h:176
QcepMaskDataPtr m_NewOverflow
Definition: qxrdwindow.h:202
void doClearBadPixels()
void slicePolygon(QVector< QPointF > poly)
QSharedPointer< QcepDatasetModel > QcepDatasetModelPtr
void doCorrelate()
QcepMaskDataPtr m_Overflow
Definition: qxrdwindow.h:200
void onCenterXChanged(double cx)
QxrdMaskDialog * m_MaskDialog
Definition: qxrdwindow.h:179
QAtomicInt m_NewMaskAvailable
Definition: qxrdwindow.h:207
void enableHistograms()
void doClearDark()
void doProjectAlongX()
void allocatedMemoryChanged()
QSharedPointer< QcepDoubleImageData > QcepDoubleImageDataPtr
void doClearMask()