VESPERSEXAFSScanConfigurationView::VESPERSEXAFSScanConfigurationView(VESPERSEXAFSScanConfiguration *config, QWidget *parent) : VESPERSScanConfigurationView(parent) { config_ = config; AMTopFrame *frame = new AMTopFrame("VESPERS EXAFS Configuration"); // Regions setup regionsView_ = new AMRegionsView(config_->regions()); regionsView_->setMinimumWidth(300); regionsLineView_ = new AMEXAFSLineView(config_->exafsRegions()); // The fluorescence detector setup QGroupBox *fluorescenceDetectorGroupBox = addFluorescenceDetectorSelectionView(); connect(fluorescenceButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(onFluorescenceChoiceChanged(int))); connect(config_->dbObject(), SIGNAL(fluorescenceDetectorChanged(int)), this, SLOT(updateFluorescenceDetector(int))); fluorescenceButtonGroup_->button((int)config_->fluorescenceDetector())->setChecked(true); // Ion chamber selection QGroupBox *ItGroupBox = addItSelectionView(); connect(ItGroup_, SIGNAL(buttonClicked(int)), this, SLOT(onItClicked(int))); connect(config_->dbObject(), SIGNAL(transmissionChoiceChanged(int)), this, SLOT(updateItButtons(int))); QGroupBox *I0GroupBox = addI0SelectionView(); connect(I0Group_, SIGNAL(buttonClicked(int)), this, SLOT(onI0Clicked(int))); connect(config_->dbObject(), SIGNAL(incomingChoiceChanged(int)), this, SLOT(updateI0Buttons(int))); I0Group_->button((int)config_->incomingChoice())->click(); ItGroup_->button((int)config_->transmissionChoice())->click(); QHBoxLayout *ionChambersLayout = new QHBoxLayout; ionChambersLayout->addWidget(I0GroupBox); ionChambersLayout->addWidget(ItGroupBox); // Scan name selection scanName_ = addScanNameView(config_->name()); connect(scanName_, SIGNAL(editingFinished()), this, SLOT(onScanNameEdited())); connect(config_, SIGNAL(nameChanged(QString)), scanName_, SLOT(setText(QString))); onScanNameEdited(); QFormLayout *scanNameLayout = new QFormLayout; scanNameLayout->addRow("Scan Name:", scanName_); // Energy (Eo) selection energy_ = new QDoubleSpinBox; energy_->setSuffix(" eV"); energy_->setMinimum(0); energy_->setMaximum(30000); connect(energy_, SIGNAL(editingFinished()), this, SLOT(setEnergy())); elementChoice_ = new QToolButton; connect(elementChoice_, SIGNAL(clicked()), this, SLOT(onElementChoiceClicked())); lineChoice_ = new QComboBox; connect(lineChoice_, SIGNAL(currentIndexChanged(int)), this, SLOT(onLinesComboBoxIndexChanged(int))); if (config_->edge().isEmpty()){ elementChoice_->setText("Cu"); fillLinesComboBox(AMPeriodicTable::table()->elementBySymbol("Cu")); lineChoice_->setCurrentIndex(0); } // Resets the view for the view to what it should be. Using the saved for the energy in case it is different from the original line energy. else onEdgeChanged(); connect(config_, SIGNAL(edgeChanged(QString)), this, SLOT(onEdgeChanged())); QCheckBox *useFixedTime = new QCheckBox("Use fixed time (EXAFS)"); useFixedTime->setEnabled(config_->useFixedTime()); connect(config_->exafsRegions(), SIGNAL(regionsHaveKSpaceChanged(bool)), useFixedTime, SLOT(setEnabled(bool))); connect(useFixedTime, SIGNAL(toggled(bool)), config_, SLOT(setUseFixedTime(bool))); QSpinBox *numberOfScans = new QSpinBox; numberOfScans->setMinimum(1); numberOfScans->setValue(config_->numberOfScans()); numberOfScans->setAlignment(Qt::AlignCenter); connect(numberOfScans, SIGNAL(valueChanged(int)), config_, SLOT(setNumberOfScans(int))); connect(config_, SIGNAL(numberOfScansChanged(int)), this, SLOT(onEstimatedTimeChanged())); QFormLayout *numberOfScansLayout = new QFormLayout; numberOfScansLayout->addRow("Number of Scans:", numberOfScans); QFormLayout *energySetpointLayout = new QFormLayout; energySetpointLayout->addRow("Energy:", energy_); QHBoxLayout *energyLayout = new QHBoxLayout; energyLayout->addLayout(energySetpointLayout); energyLayout->addWidget(elementChoice_); energyLayout->addWidget(lineChoice_); // Setting the scan position. QGroupBox *goToPositionGroupBox = addGoToPositionView(config_->goToPosition(), config_->x(), config_->y()); connect(config_, SIGNAL(gotoPositionChanged(bool)), goToPositionCheckBox_, SLOT(setChecked(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), config_, SLOT(setGoToPosition(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), setCurrentPositionButton_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), savedXPosition_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), savedYPosition_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), positionsSaved_, SLOT(setEnabled(bool))); connect(setCurrentPositionButton_, SIGNAL(clicked()), this, SLOT(setScanPosition())); setSampleStage(VESPERSBeamline::vespers()->experimentConfiguration()->sampleStageChoice()); // The estimated scan time. estimatedTime_ = new QLabel; estimatedSetTime_ = new QLabel; connect(config_, SIGNAL(totalTimeChanged(double)), this, SLOT(onEstimatedTimeChanged())); onEstimatedTimeChanged(); // The roi text edit. roiText_ = new QTextEdit; roiText_->setReadOnly(true); QPushButton *configureXRFDetectorButton = new QPushButton(QIcon(":/hammer-wrench.png"), "Configure XRF Detector"); connect(configureXRFDetectorButton, SIGNAL(clicked()), this, SLOT(onConfigureXRFDetectorClicked())); QFormLayout *roiTextLayout = new QFormLayout; roiTextLayout->addRow(roiText_); roiTextLayout->addRow(configureXRFDetectorButton); roiTextBox_ = new QGroupBox("Regions Of Interest"); roiTextBox_->setLayout(roiTextLayout); roiTextBox_->setVisible(config_->fluorescenceDetector() == VESPERS::NoXRF ? false : true); // Label showing where the data will be saved. QLabel *exportPath = addExportPathLabel(); // Label with a help message for EXAFS. QLabel *helpMessage = new QLabel("Note when using EXAFS: when using variable integration time, the time column is the maximum time."); // Default XANES and EXAFS buttons. QPushButton *defaultXANESButton = new QPushButton("Default XANES"); connect(defaultXANESButton, SIGNAL(clicked()), this, SLOT(onDefaultXANESScanClicked())); QPushButton *defaultEXAFSButton = new QPushButton("Default EXAFS"); connect(defaultEXAFSButton, SIGNAL(clicked()), this, SLOT(onDefaultEXAFSScanClicked())); // Setting up the steps to show the time offset for scan time estimation. connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); setContextMenuPolicy(Qt::CustomContextMenu); QGroupBox *timeOffsetBox = addTimeOffsetLabel(config_->timeOffset()); connect(timeOffset_, SIGNAL(valueChanged(double)), this, SLOT(setTimeOffset(double))); QVBoxLayout *defaultLayout = new QVBoxLayout; defaultLayout->addSpacing(35); defaultLayout->addWidget(defaultXANESButton); defaultLayout->addWidget(defaultEXAFSButton); defaultLayout->addStretch(); // Auto-export option. QGroupBox *autoExportGroupBox = addExporterOptionsView(QStringList(), config_->exportSpectraSources()); connect(autoExportSpectra_, SIGNAL(toggled(bool)), config_, SLOT(setExportSpectraSources(bool))); // Setting up the layout. QGridLayout *contentsLayout = new QGridLayout; contentsLayout->addWidget(regionsView_, 1, 1, 2, 2); contentsLayout->addWidget(fluorescenceDetectorGroupBox, 1, 3); contentsLayout->addLayout(scanNameLayout, 4, 1); contentsLayout->addLayout(energyLayout, 0, 1, 1, 3); contentsLayout->addWidget(goToPositionGroupBox, 4, 3, 4, 1); contentsLayout->addLayout(ionChambersLayout, 2, 3, 2, 1); contentsLayout->addWidget(roiTextBox_, 1, 4, 2, 2); contentsLayout->addWidget(useFixedTime, 3, 1); contentsLayout->addWidget(estimatedTime_, 6, 1, 1, 2); contentsLayout->addWidget(estimatedSetTime_, 7, 1, 1, 2); contentsLayout->addLayout(numberOfScansLayout, 5, 1); contentsLayout->addWidget(timeOffsetBox, 8, 1, 1, 2); contentsLayout->addWidget(autoExportGroupBox, 4, 5, 2, 3); QHBoxLayout *squeezeContents = new QHBoxLayout; squeezeContents->addStretch(); squeezeContents->addLayout(defaultLayout); squeezeContents->addLayout(contentsLayout); squeezeContents->addStretch(); QVBoxLayout *configViewLayout = new QVBoxLayout; configViewLayout->addWidget(frame); configViewLayout->addStretch(); configViewLayout->addWidget(regionsLineView_, 0, Qt::AlignCenter); configViewLayout->addSpacing(30); configViewLayout->addLayout(squeezeContents); configViewLayout->addSpacing(30); configViewLayout->addWidget(exportPath, 0, Qt::AlignCenter); configViewLayout->addSpacing(30); configViewLayout->addWidget(helpMessage, 0, Qt::AlignCenter); configViewLayout->addStretch(); setLayout(configViewLayout); }
VESPERS2DScanConfigurationView::VESPERS2DScanConfigurationView(VESPERS2DScanConfiguration *config, QWidget *parent) : VESPERSScanConfigurationView(parent) { configuration_ = config; AMTopFrame *frame = new AMTopFrame("VESPERS 2D Map Configuration"); // Setup the group box for setting the start and end points. QGroupBox *positionsBox = new QGroupBox("Positions"); hStart_ = createPositionDoubleSpinBox("H: ", " mm", configuration_->scanAxisAt(0)->regionAt(0)->regionStart(), 3); connect(hStart_, SIGNAL(editingFinished()), this, SLOT(onXStartChanged())); connect(configuration_->scanAxisAt(0)->regionAt(0), SIGNAL(regionStartChanged(AMNumber)), this, SLOT(setXAxisStart(AMNumber))); vStart_ = createPositionDoubleSpinBox("V: ", " mm", configuration_->scanAxisAt(1)->regionAt(0)->regionStart(), 3); connect(vStart_, SIGNAL(editingFinished()), this, SLOT(onYStartChanged())); connect(configuration_->scanAxisAt(1)->regionAt(0), SIGNAL(regionStartChanged(AMNumber)), this, SLOT(setYAxisStart(AMNumber))); QPushButton *startUseCurrentButton = new QPushButton("Use Current"); connect(startUseCurrentButton, SIGNAL(clicked()), this, SLOT(onSetStartPosition())); QHBoxLayout *startPointLayout = new QHBoxLayout; startPointLayout->addWidget(new QLabel("Start:")); startPointLayout->addWidget(hStart_); startPointLayout->addWidget(vStart_); startPointLayout->addWidget(startUseCurrentButton); hEnd_ = createPositionDoubleSpinBox("H: ", " mm", configuration_->scanAxisAt(0)->regionAt(0)->regionEnd(), 3); connect(hEnd_, SIGNAL(editingFinished()), this, SLOT(onXEndChanged())); connect(configuration_->scanAxisAt(0)->regionAt(0), SIGNAL(regionEndChanged(AMNumber)), this, SLOT(setXAxisEnd(AMNumber))); vEnd_ = createPositionDoubleSpinBox("V: ", " mm", configuration_->scanAxisAt(1)->regionAt(0)->regionEnd(), 3); connect(vEnd_, SIGNAL(editingFinished()), this, SLOT(onYEndChanged())); connect(configuration_->scanAxisAt(1)->regionAt(0), SIGNAL(regionEndChanged(AMNumber)), this, SLOT(setYAxisEnd(AMNumber))); QPushButton *endUseCurrentButton = new QPushButton("Use Current"); connect(endUseCurrentButton, SIGNAL(clicked()), this, SLOT(onSetEndPosition())); QHBoxLayout *endPointLayout = new QHBoxLayout; endPointLayout->addWidget(new QLabel("End:")); endPointLayout->addWidget(hEnd_); endPointLayout->addWidget(vEnd_); endPointLayout->addWidget(endUseCurrentButton); hStep_ = createPositionDoubleSpinBox("H: ", QString(" %1").arg(QString::fromUtf8("µm")), double(configuration_->scanAxisAt(0)->regionAt(0)->regionStep())*1000, 1); // xStep needs to be in mm. connect(hStep_, SIGNAL(editingFinished()), this, SLOT(onXStepChanged())); connect(configuration_->scanAxisAt(0)->regionAt(0), SIGNAL(regionStepChanged(AMNumber)), this, SLOT(setXAxisStep(AMNumber))); vStep_ = createPositionDoubleSpinBox("V: ", QString(" %1").arg(QString::fromUtf8("µm")), double(configuration_->scanAxisAt(1)->regionAt(0)->regionStep())*1000, 1); // yStep needs to be in mm. connect(vStep_, SIGNAL(editingFinished()), this, SLOT(onYStepChanged())); connect(configuration_->scanAxisAt(1)->regionAt(0), SIGNAL(regionStepChanged(AMNumber)), this, SLOT(setYAxisStep(AMNumber))); QHBoxLayout *stepSizeLayout = new QHBoxLayout; stepSizeLayout->addWidget(new QLabel("Step Size:")); stepSizeLayout->addWidget(hStep_); stepSizeLayout->addWidget(vStep_); stepSizeLayout->addStretch(); normalPosition_ = createPositionDoubleSpinBox("N: ", " mm", configuration_->normalPosition(), 3); connect(normalPosition_, SIGNAL(editingFinished()), this, SLOT(onNormalPositionChanged())); connect(configuration_->dbObject(), SIGNAL(normalPositionChanged(double)), normalPosition_, SLOT(setValue(double))); QPushButton *updateNormalPosition = new QPushButton("Set Normal"); connect(updateNormalPosition, SIGNAL(clicked()), this, SLOT(onSetNormalPosition())); QHBoxLayout *normalLayout = new QHBoxLayout; normalLayout->addWidget(new QLabel("Focus Position:")); normalLayout->addWidget(normalPosition_); normalLayout->addWidget(updateNormalPosition); mapInfo_ = new QLabel; updateMapInfo(); QVBoxLayout *positionsLayout = new QVBoxLayout; positionsLayout->addLayout(startPointLayout); positionsLayout->addLayout(endPointLayout); positionsLayout->addLayout(stepSizeLayout); positionsLayout->addLayout(normalLayout); positionsLayout->addWidget(mapInfo_); positionsBox->setLayout(positionsLayout); // Dwell time. dwellTime_ = createDwellTimeSpinBox(configuration_->scanAxisAt(0)->regionAt(0)->regionTime()); connect(dwellTime_, SIGNAL(editingFinished()), this, SLOT(onDwellTimeChanged())); connect(configuration_->scanAxisAt(0)->regionAt(0), SIGNAL(regionTimeChanged(AMNumber)), this, SLOT(setDwellTime(AMNumber))); connect(configuration_->scanAxisAt(0)->regionAt(0), SIGNAL(regionTimeChanged(AMNumber)), configuration_->scanAxisAt(1)->regionAt(0), SLOT(setRegionTime(AMNumber))); QHBoxLayout *timeLayout = new QHBoxLayout; timeLayout->addWidget(new QLabel("Dwell Time:")); timeLayout->addWidget(dwellTime_); // The estimated scan time. estimatedTime_ = new QLabel; connect(configuration_, SIGNAL(totalTimeChanged(double)), this, SLOT(onEstimatedTimeChanged())); onEstimatedTimeChanged(); QVBoxLayout *timeBoxLayout = new QVBoxLayout; timeBoxLayout->addLayout(timeLayout); timeBoxLayout->addWidget(estimatedTime_); QGroupBox *timeGroupBox = new QGroupBox("Time"); timeGroupBox->setLayout(timeBoxLayout); // CCD label. ccdText_ = new QLabel; ccdHelpText_ = new QLabel; ccdTextBox_ = new QGroupBox("CCD Detector Info"); QVBoxLayout *ccdTextLayout = new QVBoxLayout; ccdTextLayout->addWidget(ccdText_); ccdTextLayout->addWidget(ccdHelpText_); ccdTextBox_->setLayout(ccdTextLayout); ccdTextBox_->setVisible(configuration_->ccdDetector() != VESPERS::NoCCD); // Using the CCD. ccdComboBox_ = createCCDComboBox(); connect(ccdComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onCCDDetectorChanged(int))); connect(configuration_->dbObject(), SIGNAL(ccdDetectorChanged(int)), this, SLOT(updateCCDDetectorComboBox(int))); // The fluorescence detector setup fluorescenceDetectorComboBox_ = createFluorescenceComboBox(); connect(fluorescenceDetectorComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onFluorescenceChoiceChanged(int))); connect(configuration_->dbObject(), SIGNAL(fluorescenceDetectorChanged(int)), this, SLOT(updateFluorescenceDetectorComboBox(int))); // Ion chamber selection i0ComboBox_ = createIonChamberComboBox(); connect(i0ComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onI0Clicked(int))); connect(configuration_->dbObject(), SIGNAL(incomingChoiceChanged(int)), this, SLOT(updateI0ComboBox(int))); // Motor selection. motorSelectionComboBox_ = createMotorSelectionComboBox( QStringList() << "H & V" << "X & Z" << "Atto H & V" << "Atto X & Z" << "Big Beam X & Z", QList<int>() << (VESPERS::H | VESPERS::V) << (VESPERS::X | VESPERS::Z) << (VESPERS::AttoH | VESPERS::AttoV) << (VESPERS::AttoX | VESPERS::AttoZ) << (VESPERS::BigBeamX | VESPERS::BigBeamZ)); connect(motorSelectionComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onMotorChanged(int))); connect(configuration_->dbObject(), SIGNAL(motorChanged(int)), this, SLOT(updateMotorSelectionComboBox(int))); // Scan name selection scanName_ = createScanNameView(configuration_->name()); connect(scanName_, SIGNAL(editingFinished()), this, SLOT(onScanNameEdited())); connect(configuration_, SIGNAL(nameChanged(QString)), scanName_, SLOT(setText(QString))); // Only connecting this signal because it is the only CCD available currently. It would need some logic for switching which CCD it was actually connected to. connect(VESPERSBeamline::vespers()->vespersPilatusAreaDetector(), SIGNAL(ccdPathChanged(QString)), this, SLOT(onScanNameEdited())); onScanNameEdited(); QFormLayout *scanNameLayout = new QFormLayout; scanNameLayout->addRow("Scan Name:", scanName_); QGroupBox *scanNameGroupBox = new QGroupBox("Scan Name"); scanNameGroupBox->setLayout(scanNameLayout); // Label showing where the data will be saved. QLabel *exportPath = addExportPathLabel(); QGroupBox *timeOffsetBox = addTimeOffsetLabel(configuration_->timeOffset()); connect(timeOffset_, SIGNAL(valueChanged(double)), this, SLOT(setTimeOffset(double))); // Auto-export option. QGroupBox *autoExportGroupBox = addExporterOptionsView(QStringList() << "Ascii" << "SMAK", configuration_->exportSpectraSources(), configuration_->exportSpectraInRows()); connect(autoExportButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(updateAutoExporter(int))); connect(autoExportSpectra_, SIGNAL(toggled(bool)), configuration_, SLOT(setExportSpectraSources(bool))); connect(autoExportSpectra_, SIGNAL(toggled(bool)), exportSpectraInRows_, SLOT(setEnabled(bool))); connect(exportSpectraInRows_, SIGNAL(toggled(bool)), this, SLOT(updateExportSpectraInRows(bool))); autoExportButtonGroup_->button(configuration_->exportAsAscii() ? 0 : 1)->click(); ccdComboBox_->setCurrentIndex(ccdComboBox_->findData(int(configuration_->ccdDetector()))); i0ComboBox_->setCurrentIndex((int)configuration_->incomingChoice()); fluorescenceDetectorComboBox_->setCurrentIndex((int)configuration_->fluorescenceDetector()); motorSelectionComboBox_->setCurrentIndex(motorSelectionComboBox_->findData(int(configuration_->motor()))); disableStandardFluorescenceOptions(); disableStandardXRDOptions(); disableStandardI0Options(); QFormLayout *detectorLayout = new QFormLayout; detectorLayout->addRow("XRF:", fluorescenceDetectorComboBox_); detectorLayout->addRow("XRD:", ccdComboBox_); detectorLayout->addRow("I0:", i0ComboBox_); detectorLayout->addRow("Stage:", motorSelectionComboBox_); QGroupBox *detectorGroupBox = new QGroupBox("Detectors"); detectorGroupBox->setLayout(detectorLayout); QGroupBox *afterScanBox = createAfterScanOptionsBox(configuration_->closeFastShutter(), configuration_->returnToOriginalPosition(), configuration_->cleanupScaler()); connect(closeFastShutterCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setCloseFastShutter(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setReturnToOriginalPosition(bool))); connect(cleanupScalerCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setCleanupScaler(bool))); // Setting up the layout. QGridLayout *contentsLayout = new QGridLayout; contentsLayout->addWidget(positionsBox, 0, 0, 2, 3); contentsLayout->addWidget(timeGroupBox, 2, 0, 1, 3); contentsLayout->addWidget(scanNameGroupBox, 3, 0, 1, 3); contentsLayout->addWidget(ccdTextBox_, 4, 0, 1, 3); contentsLayout->addWidget(timeOffsetBox, 5, 0, 1, 3); contentsLayout->addWidget(detectorGroupBox, 0, 3, 2, 1); contentsLayout->addWidget(autoExportGroupBox, 2, 3, 2, 1); contentsLayout->addWidget(afterScanBox, 4, 3, 1, 1); QHBoxLayout *squeezeContents = new QHBoxLayout; squeezeContents->addStretch(); squeezeContents->addLayout(contentsLayout); squeezeContents->addStretch(); QVBoxLayout *configViewLayout = new QVBoxLayout; configViewLayout->addWidget(frame); configViewLayout->addStretch(); configViewLayout->addLayout(squeezeContents); configViewLayout->addStretch(); configViewLayout->addWidget(exportPath, 0, Qt::AlignCenter); configViewLayout->addSpacing(30); setLayout(configViewLayout); }
VESPERS2DScanConfigurationView::VESPERS2DScanConfigurationView(VESPERS2DScanConfiguration *config, QWidget *parent) : VESPERSScanConfigurationView(parent) { config_ = config; AMTopFrame *frame = new AMTopFrame("VESPERS 2D Map Configuration"); // Setup the group box for setting the start and end points. QGroupBox *positionsBox = new QGroupBox("Positions"); hStart_ = buildPositionDoubleSpinBox("H: ", " mm", config_->xStart(), 3); connect(hStart_, SIGNAL(editingFinished()), this, SLOT(onXStartChanged())); connect(config_, SIGNAL(xStartChanged(double)), hStart_, SLOT(setValue(double))); vStart_ = buildPositionDoubleSpinBox("V: ", " mm", config_->yStart(), 3); connect(vStart_, SIGNAL(editingFinished()), this, SLOT(onYStartChanged())); connect(config_, SIGNAL(yStartChanged(double)), vStart_, SLOT(setValue(double))); QPushButton *startUseCurrentButton = new QPushButton("Use Current"); connect(startUseCurrentButton, SIGNAL(clicked()), this, SLOT(onSetStartPosition())); QHBoxLayout *startPointLayout = new QHBoxLayout; startPointLayout->addWidget(new QLabel("Start:")); startPointLayout->addWidget(hStart_); startPointLayout->addWidget(vStart_); startPointLayout->addWidget(startUseCurrentButton); hEnd_ = buildPositionDoubleSpinBox("H: ", " mm", config_->xEnd(), 3); connect(hEnd_, SIGNAL(editingFinished()), this, SLOT(onXEndChanged())); connect(config_, SIGNAL(xEndChanged(double)), hEnd_, SLOT(setValue(double))); vEnd_ = buildPositionDoubleSpinBox("V: ", " mm", config_->yEnd(), 3); connect(vEnd_, SIGNAL(editingFinished()), this, SLOT(onYEndChanged())); connect(config_, SIGNAL(yEndChanged(double)), vEnd_, SLOT(setValue(double))); QPushButton *endUseCurrentButton = new QPushButton("Use Current"); connect(endUseCurrentButton, SIGNAL(clicked()), this, SLOT(onSetEndPosition())); QHBoxLayout *endPointLayout = new QHBoxLayout; endPointLayout->addWidget(new QLabel("End:")); endPointLayout->addWidget(hEnd_); endPointLayout->addWidget(vEnd_); endPointLayout->addWidget(endUseCurrentButton); hStep_ = buildPositionDoubleSpinBox("H: ", QString(" %1").arg(QString::fromUtf8("µm")), config_->xStep()*1000, 1); // xStep needs to be in mm. connect(hStep_, SIGNAL(editingFinished()), this, SLOT(onXStepChanged())); connect(config_, SIGNAL(xStepChanged(double)), this, SLOT(updateXStep(double))); vStep_ = buildPositionDoubleSpinBox("V: ", QString(" %1").arg(QString::fromUtf8("µm")), config_->yStep()*1000, 1); // yStep needs to be in mm. connect(vStep_, SIGNAL(editingFinished()), this, SLOT(onYStepChanged())); connect(config_, SIGNAL(yStepChanged(double)), this, SLOT(updateYStep(double))); QHBoxLayout *stepSizeLayout = new QHBoxLayout; stepSizeLayout->addWidget(new QLabel("Step Size:")); stepSizeLayout->addWidget(hStep_); stepSizeLayout->addWidget(vStep_); stepSizeLayout->addStretch(); mapInfo_ = new QLabel; updateMapInfo(); QVBoxLayout *positionsLayout = new QVBoxLayout; positionsLayout->addLayout(startPointLayout); positionsLayout->addLayout(endPointLayout); positionsLayout->addLayout(stepSizeLayout); positionsLayout->addWidget(mapInfo_); positionsBox->setLayout(positionsLayout); // Dwell time. dwellTime_ = addDwellTimeWidget(config_->timeStep()); connect(dwellTime_, SIGNAL(editingFinished()), this, SLOT(onDwellTimeChanged())); connect(config_, SIGNAL(timeStepChanged(double)), dwellTime_, SLOT(setValue(double))); QHBoxLayout *timeLayout = new QHBoxLayout; timeLayout->addWidget(new QLabel("Dwell Time:")); timeLayout->addWidget(dwellTime_); // The estimated scan time. estimatedTime_ = new QLabel; connect(config_, SIGNAL(totalTimeChanged(double)), this, SLOT(onEstimatedTimeChanged())); onEstimatedTimeChanged(); QVBoxLayout *timeBoxLayout = new QVBoxLayout; timeBoxLayout->addLayout(timeLayout); timeBoxLayout->addWidget(estimatedTime_); QGroupBox *timeGroupBox = new QGroupBox("Time"); timeGroupBox->setLayout(timeBoxLayout); // Using the CCD. QGroupBox *ccdBox = addCCDDetectorSelectionView(); connect(ccdButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(onCCDDetectorChanged(int))); connect(config_->dbObject(), SIGNAL(ccdDetectorChanged(int)), this, SLOT(updateCCDDetectorButtons(int))); ccdButtonGroup_->button(int(config_->ccdDetector()))->setChecked(true); ccdButtonGroup_->button((int)VESPERS::Roper)->hide(); ccdButtonGroup_->button((int)VESPERS::Mar)->hide(); configureCCDButton_ = new QPushButton(QIcon(":/hammer-wrench.png"), "Configure CCD"); configureCCDButton_->setEnabled(config_->ccdDetector()); connect(configureCCDButton_, SIGNAL(clicked()), this, SLOT(onConfigureCCDDetectorClicked())); // The fluorescence detector setup QGroupBox *fluorescenceDetectorGroupBox = addFluorescenceDetectorSelectionView(); fluorescenceButtonGroup_->button(int(VESPERS::NoXRF))->setDisabled(true); connect(fluorescenceButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(onFluorescenceChoiceChanged(int))); connect(config_->dbObject(), SIGNAL(fluorescenceDetectorChanged(int)), this, SLOT(updateFluorescenceDetector(int))); fluorescenceButtonGroup_->button((int)config_->fluorescenceDetector())->setChecked(true); // Ion chamber selection QGroupBox *I0GroupBox = addI0SelectionView(); connect(I0Group_, SIGNAL(buttonClicked(int)), this, SLOT(onI0Clicked(int))); connect(config_->dbObject(), SIGNAL(incomingChoiceChanged(int)), this, SLOT(updateI0Buttons(int))); I0Group_->button((int)config_->incomingChoice())->click(); // Motor selection. QGroupBox *motorSetChoiceBox = addMotorSelectionView(QStringList() << "H and V" << "X and Z", QList<int>() << (VESPERS::H | VESPERS::V) << (VESPERS::X | VESPERS::Z)); connect(motorButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(onMotorChanged(int))); motorButtonGroup_->button(int(config_->motor()))->click(); // CCD label. ccdText_ = new QLabel; ccdHelpText_ = new QLabel; ccdTextBox_ = new QGroupBox("CCD Detector Info"); QVBoxLayout *ccdTextLayout = new QVBoxLayout; ccdTextLayout->addWidget(ccdText_); ccdTextLayout->addWidget(ccdHelpText_); ccdTextBox_->setLayout(ccdTextLayout); ccdTextBox_->setVisible(config_->ccdDetector() != VESPERS::NoCCD); // Scan name selection scanName_ = addScanNameView(config_->name()); connect(scanName_, SIGNAL(editingFinished()), this, SLOT(onScanNameEdited())); connect(config_, SIGNAL(nameChanged(QString)), scanName_, SLOT(setText(QString))); onScanNameEdited(); QFormLayout *scanNameLayout = new QFormLayout; scanNameLayout->addRow("Scan Name:", scanName_); // The roi text edit and configuration. roiText_ = new QTextEdit; roiText_->setReadOnly(true); QPushButton *configureXRFDetectorButton = new QPushButton(QIcon(":/hammer-wrench.png"), "Configure XRF Detector"); connect(configureXRFDetectorButton, SIGNAL(clicked()), this, SLOT(onConfigureXRFDetectorClicked())); QFormLayout *roiTextLayout = new QFormLayout; roiTextLayout->addRow(roiText_); roiTextLayout->addRow(configureXRFDetectorButton); QGroupBox *roiTextBox = new QGroupBox("Regions Of Interest"); roiTextBox->setLayout(roiTextLayout); // Label showing where the data will be saved. QLabel *exportPath = addExportPathLabel(); QGroupBox *timeOffsetBox = addTimeOffsetLabel(config_->timeOffset()); connect(timeOffset_, SIGNAL(valueChanged(double)), this, SLOT(setTimeOffset(double))); // Auto-export option. QGroupBox *autoExportGroupBox = addExporterOptionsView(QStringList() << "Ascii" << "SMAK", config_->exportSpectraSources()); connect(autoExportButtonGroup_, SIGNAL(buttonClicked(int)), this, SLOT(updateAutoExporter(int))); connect(autoExportSpectra_, SIGNAL(toggled(bool)), config_, SLOT(setExportSpectraSources(bool))); autoExportButtonGroup_->button(config_->exportAsAscii() ? 0 : 1)->click(); // Setting up the layout. QGridLayout *contentsLayout = new QGridLayout; contentsLayout->addWidget(positionsBox, 0, 0, 2, 3); contentsLayout->addWidget(timeGroupBox, 2, 0, 1, 1); contentsLayout->addWidget(ccdBox, 3, 0, 1, 1); contentsLayout->addLayout(scanNameLayout, 4, 0, 1, 1); contentsLayout->addWidget(timeOffsetBox, 5, 0, 1, 1); contentsLayout->addWidget(configureCCDButton_, 6, 0, 1, 1); contentsLayout->addWidget(motorSetChoiceBox, 0, 3, 1, 1); contentsLayout->addWidget(fluorescenceDetectorGroupBox, 1, 3, 2, 1); contentsLayout->addWidget(I0GroupBox, 3, 3, 2, 1); contentsLayout->addWidget(ccdTextBox_, 7, 0, 1, 6); contentsLayout->addWidget(roiTextBox, 0, 5, 3, 3); contentsLayout->addWidget(autoExportGroupBox, 3, 5, 2, 3); QHBoxLayout *squeezeContents = new QHBoxLayout; squeezeContents->addStretch(); squeezeContents->addLayout(contentsLayout); squeezeContents->addStretch(); QVBoxLayout *configViewLayout = new QVBoxLayout; configViewLayout->addWidget(frame); configViewLayout->addStretch(); configViewLayout->addLayout(squeezeContents); configViewLayout->addStretch(); configViewLayout->addWidget(exportPath, 0, Qt::AlignCenter); configViewLayout->addSpacing(30); setLayout(configViewLayout); }
VESPERSEXAFSScanConfigurationView::VESPERSEXAFSScanConfigurationView(VESPERSEXAFSScanConfiguration *config, QWidget *parent) : VESPERSScanConfigurationView(parent) { configuration_ = config; AMTopFrame *frame = new AMTopFrame("VESPERS EXAFS Configuration"); // Regions setup regionsView_ = new AMEXAFSScanAxisView("", configuration_); QVBoxLayout *regionsViewLayout = new QVBoxLayout; regionsViewLayout->addWidget(regionsView_); QGroupBox *regionsViewGroupBox = new QGroupBox("Regions Setup"); regionsViewGroupBox->setLayout(regionsViewLayout); // The fluorescence detector setup fluorescenceDetectorComboBox_ = createFluorescenceComboBox(); connect(fluorescenceDetectorComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onFluorescenceChoiceChanged(int))); connect(configuration_->dbObject(), SIGNAL(fluorescenceDetectorChanged(int)), this, SLOT(updateFluorescenceDetectorComboBox(int))); fluorescenceDetectorComboBox_->setCurrentIndex((int)configuration_->fluorescenceDetector()); // Ion chamber selection itComboBox_ = createIonChamberComboBox(); connect(itComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onItClicked(int))); connect(configuration_->dbObject(), SIGNAL(transmissionChoiceChanged(int)), this, SLOT(updateItComboBox(int))); i0ComboBox_ = createIonChamberComboBox(); connect(i0ComboBox_, SIGNAL(currentIndexChanged(int)), this, SLOT(onI0Clicked(int))); connect(configuration_->dbObject(), SIGNAL(incomingChoiceChanged(int)), this, SLOT(updateI0ComboBox(int))); QHBoxLayout *ionChambersLayout = new QHBoxLayout; ionChambersLayout->addWidget(i0ComboBox_); ionChambersLayout->addWidget(itComboBox_); // Scan name selection scanName_ = createScanNameView(configuration_->name()); connect(scanName_, SIGNAL(editingFinished()), this, SLOT(onScanNameEdited())); connect(configuration_, SIGNAL(nameChanged(QString)), scanName_, SLOT(setText(QString))); onScanNameEdited(); // The estimated scan time. estimatedTime_ = new QLabel; connect(configuration_, SIGNAL(totalTimeChanged(double)), this, SLOT(onEstimatedTimeChanged())); onEstimatedTimeChanged(); QFormLayout *scanNameLayout = new QFormLayout; scanNameLayout->addRow("Scan Name:", scanName_); scanNameLayout->addRow(estimatedTime_); QGroupBox *scanNameGroupBox = new QGroupBox("Scan Name"); scanNameGroupBox->setLayout(scanNameLayout); // Energy (Eo) selection energy_ = new QDoubleSpinBox; energy_->setSuffix(" eV"); energy_->setMinimum(0); energy_->setMaximum(30000); connect(energy_, SIGNAL(editingFinished()), this, SLOT(setEnergy())); elementChoice_ = new QToolButton; connect(elementChoice_, SIGNAL(clicked()), this, SLOT(onElementChoiceClicked())); lineChoice_ = new QComboBox; connect(lineChoice_, SIGNAL(currentIndexChanged(int)), this, SLOT(onLinesComboBoxIndexChanged(int))); if (configuration_->edge().isEmpty()){ elementChoice_->setText("Cu"); fillLinesComboBox(AMPeriodicTable::table()->elementBySymbol("Cu")); lineChoice_->setCurrentIndex(0); } // Resets the view for the view to what it should be. Using the saved for the energy in case it is different from the original line energy. else onEdgeChanged(); connect(configuration_, SIGNAL(edgeChanged(QString)), this, SLOT(onEdgeChanged())); QFormLayout *energySetpointLayout = new QFormLayout; energySetpointLayout->addRow("Energy:", energy_); QHBoxLayout *energyLayout = new QHBoxLayout; energyLayout->addLayout(energySetpointLayout); energyLayout->addWidget(elementChoice_); energyLayout->addWidget(lineChoice_); // Setting the scan position. QGroupBox *goToPositionGroupBox = addGoToPositionView(configuration_->goToPosition(), configuration_->x(), configuration_->y()); connect(configuration_, SIGNAL(gotoPositionChanged(bool)), goToPositionCheckBox_, SLOT(setChecked(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), configuration_, SLOT(setGoToPosition(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), setCurrentPositionButton_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), savedXPosition_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), savedYPosition_, SLOT(setEnabled(bool))); connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), positionsSaved_, SLOT(setEnabled(bool))); connect(setCurrentPositionButton_, SIGNAL(clicked()), this, SLOT(setScanPosition())); connect(configuration_->dbObject(), SIGNAL(motorChanged(int)), this, SLOT(onMotorsUpdated(int))); onMotorsUpdated(configuration_->motor()); // Label showing where the data will be saved. QLabel *exportPath = addExportPathLabel(); // Default XANES and EXAFS buttons. QPushButton *defaultXANESButton = new QPushButton("Default XANES"); connect(defaultXANESButton, SIGNAL(clicked()), this, SLOT(setupDefaultXANESScanRegions())); QPushButton *defaultEXAFSButton = new QPushButton("Default EXAFS"); connect(defaultEXAFSButton, SIGNAL(clicked()), this, SLOT(setupDefaultEXAFSScanRegions())); // Setting up the steps to show the time offset for scan time estimation. connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCustomContextMenuRequested(QPoint))); setContextMenuPolicy(Qt::CustomContextMenu); QGroupBox *timeOffsetBox = addTimeOffsetLabel(configuration_->timeOffset()); connect(timeOffset_, SIGNAL(valueChanged(double)), this, SLOT(setTimeOffset(double))); // Auto-export option. QGroupBox *autoExportGroupBox = addExporterOptionsView(QStringList(), configuration_->exportSpectraSources(), configuration_->exportSpectraInRows()); connect(autoExportSpectra_, SIGNAL(toggled(bool)), configuration_, SLOT(setExportSpectraSources(bool))); connect(autoExportSpectra_, SIGNAL(toggled(bool)), exportSpectraInRows_, SLOT(setEnabled(bool))); connect(exportSpectraInRows_, SIGNAL(toggled(bool)), this, SLOT(updateExportSpectraInRows(bool))); fluorescenceDetectorComboBox_->setCurrentIndex((int)configuration_->fluorescenceDetector()); i0ComboBox_->setCurrentIndex((int)configuration_->incomingChoice()); itComboBox_->setCurrentIndex((int)configuration_->transmissionChoice()); disableStandardI0Options(); disableStandardItOptions(); QVBoxLayout *defaultLayout = new QVBoxLayout; defaultLayout->addSpacing(35); defaultLayout->addWidget(defaultXANESButton); defaultLayout->addWidget(defaultEXAFSButton); defaultLayout->addStretch(); QFormLayout *detectorLayout = new QFormLayout; detectorLayout->addRow("XRF:", fluorescenceDetectorComboBox_); detectorLayout->addRow("I0:", i0ComboBox_); detectorLayout->addRow("It:", itComboBox_); QGroupBox *detectorGroupBox = new QGroupBox("Detectors"); detectorGroupBox->setLayout(detectorLayout); QGroupBox *afterScanBox = createAfterScanOptionsBox(configuration_->closeFastShutter(), configuration_->returnToOriginalPosition(), configuration_->cleanupScaler()); connect(closeFastShutterCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setCloseFastShutter(bool))); // connect(goToPositionCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setReturnToOriginalPosition(bool))); connect(cleanupScalerCheckBox_, SIGNAL(toggled(bool)), this, SLOT(setCleanupScaler(bool))); goToPositionCheckBox_->setDisabled(true); // Setting up the layout. QGridLayout *contentsLayout = new QGridLayout; contentsLayout->addLayout(energyLayout, 0, 0, 1, 3); contentsLayout->addWidget(regionsViewGroupBox, 1, 0, 2, 3); contentsLayout->addWidget(scanNameGroupBox, 3, 0, 1, 2); contentsLayout->addWidget(goToPositionGroupBox, 4, 0, 1, 1); contentsLayout->addWidget(timeOffsetBox, 5, 0, 1, 1); contentsLayout->addWidget(detectorGroupBox, 3, 2, 1, 1); contentsLayout->addWidget(autoExportGroupBox, 4, 1, 1, 2); contentsLayout->addWidget(afterScanBox, 5, 2, 1, 1); QHBoxLayout *squeezeContents = new QHBoxLayout; squeezeContents->addStretch(); squeezeContents->addLayout(defaultLayout); squeezeContents->addLayout(contentsLayout); squeezeContents->addStretch(); QVBoxLayout *configViewLayout = new QVBoxLayout; configViewLayout->addWidget(frame); configViewLayout->addStretch(); configViewLayout->addSpacing(30); configViewLayout->addLayout(squeezeContents); configViewLayout->addSpacing(30); configViewLayout->addWidget(exportPath, 0, Qt::AlignCenter); configViewLayout->addStretch(); setLayout(configViewLayout); }