57 this->addAction(
ui->action_Stop_current_action);
58 this->addAction(
ui->action_Optimize_positions);
59 this->addAction(
ui->action_Save_Image);
60 this->addAction(
ui->action_Save_Image);
61 this->addAction(
ui->action_Zoom_in);
62 this->addAction(
ui->action_Zoom_out);
63 this->addAction(
ui->action_Zoom_reset);
64 this->addAction(
ui->action_Zoom_fit);
65 this->addAction(
ui->action_EmitterList_Edit_name);
66 this->addAction(
ui->action_EmitterList_Remove_entry);
68 ui->action_Zoom_fit->setChecked(
true);
119 connect(
ui->WidgetConfocalGraph, &QQuickWidget::statusChanged, [
this, &
Owner](QQuickWidget::Status Status) {
120 if (Status == QQuickWidget::Status::Ready && ui->WidgetConfocalGraph->rootObject())
122 auto BackendVariant = ui->WidgetConfocalGraph->rootObject()->property(
"backend");
123 ConfocalGraph = BackendVariant.isValid() ? BackendVariant.value<DynExpQuick::DynExpSurfaceGraphBackend*>() : nullptr;
128 ConfocalGraph->GetXValueAxis()->setLabelFormat(
"%.0f");
129 ConfocalGraph->GetXValueAxis()->setAutoAdjustRange(true);
130 ConfocalGraph->GetXValueAxis()->setTitle(
"X in nm");
131 ConfocalGraph->GetXValueAxis()->setTitleVisible(true);
132 ConfocalGraph->GetYValueAxis()->setLabelFormat(
"%.0f");
133 ConfocalGraph->GetYValueAxis()->setAutoAdjustRange(false);
134 ConfocalGraph->GetYValueAxis()->setTitle(
"Count rate in Hz");
135 ConfocalGraph->GetYValueAxis()->setTitleVisible(true);
136 ConfocalGraph->GetZValueAxis()->setLabelFormat(
"%.0f");
137 ConfocalGraph->GetZValueAxis()->setAutoAdjustRange(true);
138 ConfocalGraph->GetZValueAxis()->setTitle(
"Y in nm");
139 ConfocalGraph->GetZValueAxis()->setTitleVisible(true);
140 ConfocalGraph->UpdateData();
142 Owner.RegisterConfocalGraphEvents(ConfocalGraph);
143 connect(ConfocalGraph, &DynExpQuick::DynExpSurfaceGraphBackend::selectedPointChanged, this, [this]() { NumItemsInArray = 0; });
146 ui->WidgetConfocalGraph->loadFromModule(
"Modules.DynExpQuick",
"QDynExpSurfaceGraph");
149 connect(ui->WidgetHBTGraph, &QQuickWidget::statusChanged, [
this](QQuickWidget::Status Status) {
150 if (Status == QQuickWidget::Status::Ready && ui->WidgetHBTGraph->rootObject())
152 auto BackendVariant = ui->WidgetHBTGraph->rootObject()->property(
"backend");
153 HBTGraph = BackendVariant.isValid() ? BackendVariant.value<DynExpQuick::DynExpLineGraphBackend*>() : nullptr;
156 HBTGraph->InsertSeries(
"g2");
159 ui->WidgetHBTGraph->loadFromModule(
"Modules.DynExpQuick",
"QDynExpLineGraph");
162 HBTPlotInfo.YLabel =
"g(2)";
165 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Widefield_PLE);
166 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Optimize);
167 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Spectrum);
168 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_Confocal_PLE);
169 CharacterizationStepsContextMenu->addAction(ui->action_CharacterizationSteps_HBT);
170 connect(CharacterizationStepsContextMenu, &QMenu::aboutToShow,
this, &WidefieldMicroscopeWidget::OnCharacterizationStepsContextMenuRequested);
171 ui->BAutoMeasureCharacterizationSteps->setMenu(CharacterizationStepsContextMenu);
181 if (!GetUIInitialized())
183 ui->action_Toogle_LED_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle));
184 ui->action_Toogle_pump_light_source->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle));
185 ui->GBGeneralLaserPowers->setEnabled(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
187 auto WidefieldTabIndex = ui->TabWidget->indexOf(ui->TabWidefield);
188 auto ConfocalTabIndex = ui->TabWidget->indexOf(ui->TabConfocal);
189 auto HBTTabIndex = ui->TabWidget->indexOf(ui->TabHBT);
190 ui->TabWidget->setTabVisible(WidefieldTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
191 ui->TabWidget->setTabVisible(ConfocalTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
192 ui->TabWidget->setTabVisible(HBTTabIndex, ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT));
194 ui->SBGeneralWidefieldPower->setMinimum(ModuleData->GetMinPumpPower());
195 ui->SBGeneralWidefieldPower->setMaximum(ModuleData->GetMaxPumpPower());
196 ui->SBGeneralWidefieldPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
197 ui->SBGeneralConfocalPower->setMinimum(ModuleData->GetMinPumpPower());
198 ui->SBGeneralConfocalPower->setMaximum(ModuleData->GetMaxPumpPower());
199 ui->SBGeneralConfocalPower->setSingleStep(std::abs(ModuleData->GetMaxPumpPower() - ModuleData->GetMinPumpPower()) / 100.0);
200 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
202 ui->SBGeneralFocusCurrentVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
203 ui->SBGeneralFocusCurrentVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
204 ui->SBGeneralFocusCurrentVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
205 ui->SBGeneralFocusZeroVoltage->setMinimum(ModuleData->GetMinFocusVoltage());
206 ui->SBGeneralFocusZeroVoltage->setMaximum(ModuleData->GetMaxFocusVoltage());
207 ui->SBGeneralFocusZeroVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
208 ui->SBGeneralFocusConfocalOffsetVoltage->setMinimum(-std::abs(ModuleData->GetMinFocusVoltage()) - std::abs(ModuleData->GetMaxFocusVoltage()));
209 ui->SBGeneralFocusConfocalOffsetVoltage->setMaximum(std::abs(ModuleData->GetMinFocusVoltage()) + std::abs(ModuleData->GetMaxFocusVoltage()));
210 ui->SBGeneralFocusConfocalOffsetVoltage->setSingleStep(std::abs(ModuleData->GetMaxFocusVoltage() - ModuleData->GetMinFocusVoltage()) / 100.0);
213 ui->GBGeneralFocus->setVisible(
false);
214 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
216 ui->LGeneralWidefieldPower->setText(
"Power in any mode");
217 ui->LGeneralConfocalPower->setVisible(
false);
218 ui->SBGeneralConfocalPower->setVisible(
false);
219 ui->LGeneralFocusConfocalOffsetVoltage->setVisible(
false);
220 ui->SBGeneralFocusConfocalOffsetVoltage->setVisible(
false);
223 ui->SBWidefieldLEDExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
224 ui->SBWidefieldLEDExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
225 ui->SBWidefieldPumpExposureTime->setMinimum(ModuleData->GetMinCameraExposureTime().count());
226 ui->SBWidefieldPumpExposureTime->setMaximum(ModuleData->GetMaxCameraExposureTime().count());
228 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterName, 96);
229 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_x, 134);
230 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::Sample_y, 134);
231 ui->TWEmitterList->setColumnWidth(EmitterListColumnType::EmitterState, 134);
233 ui->action_CharacterizationSteps_Widefield_PLE->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator));
234 ui->action_CharacterizationSteps_Optimize->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
235 ui->action_CharacterizationSteps_Spectrum->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator));
236 ui->action_CharacterizationSteps_Confocal_PLE->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator));
237 ui->action_CharacterizationSteps_HBT->setVisible(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT));
239 UIInitialized =
true;
246 bool IsReady = State->
GetState() == StateType::Ready;
247 StatusBar.CurrentState = State;
248 StatusBar.CurrentContext = Context;
250 StatusBar.CellIDLabel->setText(ModuleData->HasCellID() ? QString::fromStdString(ModuleData->GetCellID().IDString) :
"< Unknown cell ID. >");
251 StatusBar.CellIDLabel->setToolTip(ModuleData->HasCellID() ?
252 (
"(" + QString::number(ModuleData->GetCellID().X_id) +
", " + QString::number(ModuleData->GetCellID().Y_id) +
")") :
"n/a");
254 QString HomePosString =
"home: (" + QString::number(ModuleData->GetSampleHomePosition().x) +
" nm, " + QString::number(ModuleData->GetSampleHomePosition().y) +
" nm)";
255 StatusBar.HomePosLabel->setText(ModuleData->GetSampleHomePosition().IsEmpty() ?
"< No home position set. >" : HomePosString);
257 StatusBar.PumpPowerLabel->setText(ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::MeasurePumpPower) ?
258 (
" Pump power: " + QString::number(ModuleData->GetMeasuredPumpPower(),
'f', 2) +
" V") :
"");
259 if (ModuleData->GetPumpLightTurnedOn())
262 StatusBar.PumpPowerLabel->setStyleSheet(
"");
264 MainGraphicsView->EnableActions(IsReady);
265 ui->action_Save_Image->setEnabled(IsReady);
266 ui->action_Stop_current_action->setEnabled(!IsReady);
267 ui->action_Set_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
268 ui->action_Go_home_position->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal));
269 ui->action_Widefield_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
270 ui->action_Confocal_mode->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
271 ui->action_Autofocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
272 ui->action_Optimize_positions->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
273 && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
274 ui->action_Toggle_HBT_mirror->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch));
275 ui->action_Reset_CellID->setEnabled(IsReady);
276 ui->GBGeneralLaserPowers->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower));
277 ui->GBGeneralFocus->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment));
278 ui->SBWidefieldLEDExposureTime->setEnabled(IsReady &&
279 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
280 ui->BWidefieldApplyLEDExposureTime->setEnabled(IsReady &&
281 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
282 ui->SBWidefieldPumpExposureTime->setEnabled(IsReady &&
283 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
284 ui->BWidefieldApplyPumpExposureTime->setEnabled(IsReady &&
285 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) && ModuleData->GetWidefieldCamera()->CanSetExposureTime());
286 ui->BWidefieldFindConfocalSpot->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch));
287 ui->BWidefieldLEDCapture->setEnabled(IsReady);
288 ui->BWidefieldCapture->setEnabled(IsReady);
289 ui->BReadCellID->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
290 ui->BAnalyzeImageDistortion->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
291 ui->BLocalizeEmitters->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
292 ui->action_EmitterList_Edit_name->setEnabled(IsReady);
293 ui->action_EmitterList_Remove_entry->setEnabled(IsReady);
294 ui->action_EmitterList_Go_to_sample_position->setEnabled(IsReady);
295 ui->action_EmitterList_Bring_marker_to_confocal_spot->setEnabled(IsReady);
296 ui->action_EmitterList_Run_characterization_from_ID->setEnabled(IsReady);
297 ui->SBConfocalWidth->setEnabled(IsReady);
298 ui->SBConfocalHeight->setEnabled(IsReady);
299 ui->SBConfocalDistPerPixel->setEnabled(IsReady);
300 ui->SBConfocalSPDExposureTime->setEnabled(IsReady);
301 ui->SBConfocalOptimizationInitXYStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
302 ui->SBConfocalOptimizationInitZStepSize->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
303 ui->SBConfocalOptimizationTolerance->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization));
304 ui->BConfocalScan->setEnabled(IsReady);
305 ui->action_confocal_map_save_raw_data->setEnabled(IsReady);
306 ui->SBHBTBinWidth->setEnabled(IsReady);
307 ui->SBHBTBinCount->setEnabled(IsReady);
308 ui->BHBTSaveData->setEnabled(IsReady);
309 ui->BHBT->setEnabled(IsReady);
310 ui->GBAutoMeasureGeneralSettings->setEnabled(IsReady);
311 ui->GBAutoMeasureLocalizationSettings->setEnabled(IsReady);
312 ui->GBAutoMeasureCharacterizationSettings->setEnabled(IsReady);
313 ui->GBAutoMeasureCellSettings->setEnabled(IsReady);
314 ui->BAutoMeasureRunLocalization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield));
315 ui->BAutoMeasureRunCharacterization->setEnabled(IsReady);
316 ui->BAutoMeasureRunSampleCharacterization->setEnabled(IsReady && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) &&
317 ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization));
323 ui->action_Toogle_LED_light_source->setChecked(ModuleData->GetLEDLightTurnedOn());
324 ui->action_Toogle_pump_light_source->setChecked(ModuleData->GetPumpLightTurnedOn());
325 ui->action_Widefield_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield);
326 ui->action_Confocal_mode->setChecked(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal);
330 if (!ui->SBGeneralWidefieldPower->hasFocus())
331 ui->SBGeneralWidefieldPower->setValue(ModuleData->GetWidefieldPumpPower());
332 if (!ui->SBGeneralConfocalPower->hasFocus())
333 ui->SBGeneralConfocalPower->setValue(ModuleData->GetConfocalPumpPower());
334 if (!ui->SBGeneralFocusCurrentVoltage->hasFocus())
335 ui->SBGeneralFocusCurrentVoltage->setValue(ModuleData->GetFocusCurrentVoltage());
336 if (!ui->SBGeneralFocusZeroVoltage->hasFocus())
337 ui->SBGeneralFocusZeroVoltage->setValue(ModuleData->GetFocusZeroVoltage());
338 if (!ui->SBGeneralFocusConfocalOffsetVoltage->hasFocus())
339 ui->SBGeneralFocusConfocalOffsetVoltage->setValue(ModuleData->GetFocusConfocalOffsetVoltage());
342 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning))
344 auto SamplePosition = ModuleData->GetSamplePosition();
345 MainGraphicsView->SetCurrentImagePos({
static_cast<qreal
>(SamplePosition.x),
static_cast<qreal
>(SamplePosition.y) });
348 MainGraphicsView->SetCurrentImagePos({ });
353 if (!ui->SBWidefieldLEDExposureTime->hasFocus())
354 ui->SBWidefieldLEDExposureTime->setValue(ModuleData->GetLEDCameraExposureTime().count());
356 if (!ui->SBWidefieldPumpExposureTime->hasFocus())
357 ui->SBWidefieldPumpExposureTime->setValue(ModuleData->GetWidefieldCameraExposureTime().count());
359 if (ModuleData->IsCurrentImageAvlbl())
362 SetMainGraphicsImage(ModuleData->GetCurrentImage());
363 ModuleData->ResetCurrentImageAvlbl();
366 if (!SaveWidefieldImageFilename.isEmpty())
368 ModuleData->EnqueueEvent(
DynExp::MakeEvent(&GetCastOwner(), &WidefieldMicroscope::OnSaveCurrentImage, SaveWidefieldImageFilename));
370 SaveWidefieldImageFilename.clear();
373 if (ModuleData->HaveLocalizedPositionsChanged())
375 MainGraphicsView->RemoveMarkers(
true);
376 for (
const auto& Position : ModuleData->GetLocalizedPositions())
377 MainGraphicsView->AddMarker(Position.second.Position, QColorConstants::DarkYellow,
true, Position.first,
"Emitter " +
Util::ToStr(Position.first));
379 ModuleData->ResetLocalizedPositionsChanged();
382 if (CurrentConfocalSpotPosition != ModuleData->GetConfocalSpotImagePosition())
384 MainGraphicsView->RemoveMarker(CurrentConfocalSpotPosition);
385 MainGraphicsView->AddMarker(ModuleData->GetConfocalSpotImagePosition(), QColorConstants::Red,
false, -1,
"Confocal spot");
387 CurrentConfocalSpotPosition = ModuleData->GetConfocalSpotImagePosition();
390 if (MainGraphicsView->HaveMarkersChanged())
393 const auto LocalizedPositions = ModuleData->GetLocalizedPositions();
394 ModuleData->ClearLocalizedPositions();
396 bool SortingEnabled = ui->TWEmitterList->isSortingEnabled();
397 ui->TWEmitterList->setSortingEnabled(
false);
399 ui->TWEmitterList->clearContents();
400 ui->TWEmitterList->setRowCount(0);
402 auto& Markers = MainGraphicsView->GetMarkers();
403 for (
const auto& Marker : Markers)
405 const auto Row = ui->TWEmitterList->rowCount();
406 ui->TWEmitterList->insertRow(Row);
408 QTableWidgetItem* IDItem =
new QTableWidgetItem;
410 if (Marker.GetID() >= 0)
412 IDItem->setData(Qt::EditRole, Marker.GetID());
413 IDItem->setData(Qt::UserRole, Marker.GetID());
415 auto OldLocalizedPosition = LocalizedPositions.find(Marker.GetID());
416 if (OldLocalizedPosition != LocalizedPositions.cend())
417 LocalizedEmitterState = OldLocalizedPosition->second.State;
418 ModuleData->AppendLocalizedPosition({ Marker.GetID(), { Marker.GetMarkerPos(), LocalizedEmitterState } });
423 IDItem->setText(
"n/a");
426 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterID, IDItem);
427 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterName,
new QTableWidgetItem(Marker.GetName().data()));
428 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Image_x,
new QTableWidgetItem(QString::number(Marker.GetMarkerPos().x())));
429 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().x());
430 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Image_y,
new QTableWidgetItem(QString::number(Marker.GetMarkerPos().y())));
431 ui->TWEmitterList->item(Row, EmitterListColumnType::Image_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetMarkerPos().y());
432 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Sample_x,
new QTableWidgetItem(Marker.GetImagePos().isNull() ?
"n/a" : QString::number(Marker.GetImagePos().x(),
'f', 0)));
433 ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_x)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().x());
434 ui->TWEmitterList->setItem(Row, EmitterListColumnType::Sample_y,
new QTableWidgetItem(Marker.GetImagePos().isNull() ?
"n/a" : QString::number(Marker.GetImagePos().y(),
'f', 0)));
435 ui->TWEmitterList->item(Row, EmitterListColumnType::Sample_y)->setData(Qt::ItemDataRole::UserRole, Marker.GetImagePos().y());
436 ui->TWEmitterList->setItem(Row, EmitterListColumnType::EmitterState,
new QTableWidgetItem(WidefieldMicroscopeData::GetLocalizedEmitterStateString(LocalizedEmitterState)));
437 ui->TWEmitterList->item(Row, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(LocalizedEmitterState));
440 ui->TWEmitterList->setSortingEnabled(SortingEnabled);
442 ModuleData->ResetLocalizedPositionsChanged();
443 ModuleData->ResetAutoMeasureCurrentEmitter();
446 if (ModuleData->HaveLocalizedPositionsStateChanged())
448 for (
int i = 0; i < ui->TWEmitterList->rowCount(); ++i)
451 auto Emitter = ModuleData->GetLocalizedPositions().find(ID);
452 if (Emitter == ModuleData->GetLocalizedPositions().cend())
455 ui->TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setText(WidefieldMicroscopeData::GetLocalizedEmitterStateString(Emitter->second.State));
456 ui->TWEmitterList->item(i, EmitterListColumnType::EmitterState)->setForeground(WidefieldMicroscopeData::GetLocalizedEmitterColor(Emitter->second.State));
459 ModuleData->ClearLocalizedPositionsStateChanged();
462 switch (EmitterListTask)
464 case EmitterListTaskType::GoToSamplePos:
465 ModuleData->EnqueueEvent(
DynExp::MakeEvent(&GetCastOwner(), &WidefieldMicroscope::OnGoToSamplePos, SamplePos));
466 EmitterListTask = EmitterListTaskType::None;
468 case EmitterListTaskType::MarkerToConfocalSpot:
469 ModuleData->EnqueueEvent(
DynExp::MakeEvent(&GetCastOwner(), &WidefieldMicroscope::OnBringMarkerToConfocalSpot, MarkerPos, SamplePos));
470 EmitterListTask = EmitterListTaskType::None;
472 case EmitterListTaskType::RunCharacterization:
473 ModuleData->EnqueueEvent(
DynExp::MakeEvent(&GetCastOwner(), &WidefieldMicroscope::OnRunCharacterizationFromID, MarkerID));
474 EmitterListTask = EmitterListTaskType::None;
482 if (!ui->SBConfocalWidth->hasFocus())
483 ui->SBConfocalWidth->setValue(ModuleData->GetConfocalScanWidth());
484 if (!ui->SBConfocalHeight->hasFocus())
485 ui->SBConfocalHeight->setValue(ModuleData->GetConfocalScanHeight());
486 if (!ui->SBConfocalDistPerPixel->hasFocus())
487 ui->SBConfocalDistPerPixel->setValue(ModuleData->GetConfocalScanDistPerPixel());
488 if (!ui->SBConfocalOptimizationInitXYStepSize->hasFocus())
489 ui->SBConfocalOptimizationInitXYStepSize->setValue(ModuleData->GetConfocalOptimizationInitXYStepSize());
490 if (!ui->SBConfocalOptimizationInitZStepSize->hasFocus())
491 ui->SBConfocalOptimizationInitZStepSize->setValue(ModuleData->GetConfocalOptimizationInitZStepSize());
492 if (!ui->SBConfocalOptimizationTolerance->hasFocus())
493 ui->SBConfocalOptimizationTolerance->setValue(ModuleData->GetConfocalOptimizationTolerance());
495 if (ModuleData->HasConfocalScanSurfacePlotRows())
498 ConfocalSurfaceMinCounts = std::numeric_limits<
decltype(ConfocalSurfaceMinCounts)>::max();
499 ConfocalSurfaceMaxCounts = 0;
501 ConfocalGraph->GetProxy()->resetArray(ModuleData->GetConfocalScanSurfacePlotRows());
502 ConfocalGraph->ResetSelectedPoint();
505 if (ModuleData->GetConfocalScanResults().size() > NumItemsInArray)
507 QPoint Selection = { -1, -1 };
508 for (
auto i = NumItemsInArray; i < ModuleData->GetConfocalScanResults().size(); ++i)
510 const auto& ResultItem = ModuleData->GetConfocalScanResults()[i];
511 if (ResultItem.first.RowIndex < 0 || ResultItem.first.ColumnIndex < 0)
514 QSurfaceDataItem SurfaceItem = ConfocalGraph->GetProxy()->itemAt(ResultItem.first.RowIndex, ResultItem.first.ColumnIndex);
515 SurfaceItem.setY(ResultItem.second);
516 ConfocalGraph->GetProxy()->setItem(ResultItem.first.RowIndex, ResultItem.first.ColumnIndex, SurfaceItem);
518 if (ConfocalGraph->GetSelectedPoint().x() == ResultItem.first.RowIndex &&
519 ConfocalGraph->GetSelectedPoint().y() == ResultItem.first.ColumnIndex)
520 Selection = { ResultItem.first.RowIndex, ResultItem.first.ColumnIndex };
522 ConfocalSurfaceMinCounts = std::min(ConfocalSurfaceMinCounts, ResultItem.second);
523 ConfocalSurfaceMaxCounts = std::max(ConfocalSurfaceMaxCounts, ResultItem.second);
528 if (Selection.x() >= 0 && Selection.y() >= 0)
530 QSurfaceDataItem SurfaceItem = ConfocalGraph->GetProxy()->itemAt(Selection.x(), Selection.y());
531 SurfaceItem.setY(ConfocalSurfaceMaxCounts * 1.03);
532 ConfocalGraph->GetProxy()->setItem(Selection.x(), Selection.y(), SurfaceItem);
535 if (ConfocalSurfaceMinCounts < std::numeric_limits<
decltype(ConfocalSurfaceMinCounts)>::max() && ConfocalSurfaceMaxCounts > 0 &&
536 ConfocalSurfaceMinCounts < ConfocalSurfaceMaxCounts)
537 ConfocalGraph->GetYValueAxis()->setRange(ConfocalSurfaceMinCounts, ConfocalSurfaceMaxCounts * 1.03);
539 ConfocalGraph->GetYValueAxis()->setRange(ConfocalSurfaceMaxCounts - 1, ConfocalSurfaceMaxCounts + 1);
541 ConfocalGraph->UpdateData();
547 if (!ui->SBHBTBinWidth->hasFocus())
548 ui->SBHBTBinWidth->setValue(ModuleData->GetHBTBinWidth().count());
549 if (!ui->SBHBTBinCount->hasFocus())
550 ui->SBHBTBinCount->setValue(Util::NumToT<int>(ModuleData->GetHBTBinCount()));
551 if (!ui->SBHBTAcquisitionTime->hasFocus())
552 ui->SBHBTAcquisitionTime->setValue(
static_cast<double>(ModuleData->GetHBTMaxIntegrationTime().count()) / std::chrono::microseconds::period::den);
553 ui->LEHBTTotalIntegrationTime->setText(QString::number(ModuleData->GetHBTTotalIntegrationTime().count() / std::chrono::microseconds::period::den) +
" s");
555 if (ui->WidgetHBTGraph->isVisible() && HBTGraph)
558 HBTPlotInfo.MaxSampleCountPerSeries = Util::NumToT<size_t>(ModuleData->GetHBTDataPoints().size());
559 HBTPlotInfo.MinValues = ModuleData->GetHBTDataPointsMinValues();
560 HBTPlotInfo.MaxValues = ModuleData->GetHBTDataPointsMaxValues();
561 HBTPlotInfo.AdjustAxesLimits();
562 HBTPlotInfo.ReprocessSamples(ModuleData->GetHBTDataPoints(), 0);
564 HBTGraph->UpdateSeries(0, ModuleData->GetHBTDataPoints(), HBTPlotInfo);
565 HBTGraph->UpdateData(HBTPlotInfo);
567 ui->LEHBTMinValue->setText(QString::number(ModuleData->GetHBTDataPointsMinValues().y()));
574 const QSignalBlocker Blocker(ui->LEAutoMeasureSavePath);
575 ui->LEAutoMeasureSavePath->setText(QString::fromUtf16(ModuleData->GetAutoMeasureSavePath().u16string().c_str()));
578 if (!ui->SBAutoMeasureNumberImageSets->hasFocus())
579 ui->SBAutoMeasureNumberImageSets->setValue(ModuleData->GetAutoMeasureNumberImageSets());
580 if (!ui->SBAutoMeasureInitialImageSetWaitTime->hasFocus())
581 ui->SBAutoMeasureInitialImageSetWaitTime->setValue(ModuleData->GetAutoMeasureInitialImageSetWaitTime().count());
582 if (!ui->SBAutoMeasureImagePositionScatterRadius->hasFocus())
583 ui->SBAutoMeasureImagePositionScatterRadius->setValue(ModuleData->GetAutoMeasureImagePositionScatterRadius());
584 if (!ui->CBAutoMeasureLocalize->hasFocus())
585 ui->CBAutoMeasureLocalize->setCurrentIndex(ModuleData->GetAutoMeasureLocalizationType());
586 if (!ui->SBAutoMeasureOptimizationAttempts->hasFocus())
587 ui->SBAutoMeasureOptimizationAttempts->setValue(ModuleData->GetAutoMeasureNumOptimizationAttempts());
588 if (!ui->SBAutoMeasureOptimizationReruns->hasFocus())
589 ui->SBAutoMeasureOptimizationReruns->setValue(ModuleData->GetAutoMeasureMaxOptimizationReruns());
590 if (!ui->SBAutoMeasureOptimizationMaxDistance->hasFocus())
591 ui->SBAutoMeasureOptimizationMaxDistance->setValue(ModuleData->GetAutoMeasureOptimizationMaxDistance());
592 if (!ui->SBAutoMeasureCountRateThreshold->hasFocus())
593 ui->SBAutoMeasureCountRateThreshold->setValue(ModuleData->GetAutoMeasureCountRateThreshold());
594 if (!ui->SBAutoMeasureCellRangeFromX->hasFocus())
595 ui->SBAutoMeasureCellRangeFromX->setValue(ModuleData->GetAutoMeasureCellRangeFrom().x());
596 if (!ui->SBAutoMeasureCellRangeFromY->hasFocus())
597 ui->SBAutoMeasureCellRangeFromY->setValue(ModuleData->GetAutoMeasureCellRangeFrom().y());
598 if (!ui->SBAutoMeasureCellRangeToX->hasFocus())
599 ui->SBAutoMeasureCellRangeToX->setValue(ModuleData->GetAutoMeasureCellRangeTo().x());
600 if (!ui->SBAutoMeasureCellRangeToY->hasFocus())
601 ui->SBAutoMeasureCellRangeToY->setValue(ModuleData->GetAutoMeasureCellRangeTo().y());
602 if (!ui->SBAutoMeasureCellSkipX->hasFocus())
603 ui->SBAutoMeasureCellSkipX->setValue(ModuleData->GetAutoMeasureCellSkip().x());
604 if (!ui->SBAutoMeasureCellSkipY->hasFocus())
605 ui->SBAutoMeasureCellSkipY->setValue(ModuleData->GetAutoMeasureCellSkip().y());
607 if (ModuleData->GetAutoMeasureCurrentImageSet() >= 0 && ModuleData->GetAutoMeasureCurrentImageSet() < ModuleData->GetAutoMeasureNumberImageSets())
609 ui->LAutoMeasureCellProgress->setText(
"Recording image set " + QString::number(ModuleData->GetAutoMeasureCurrentImageSet() + 1) +
610 " / " + QString::number(ModuleData->GetAutoMeasureNumberImageSets()));
611 ui->PBAutoMeasureCellProgress->setValue(
static_cast<int>(100.0 * ModuleData->GetAutoMeasureCurrentImageSet() / ModuleData->GetAutoMeasureNumberImageSets()));
612 ui->PBAutoMeasureCellProgress->setVisible(
true);
614 else if (ModuleData->IsAutoMeasureRunning())
616 const auto EmitterCount = std::distance(ModuleData->GetAutoMeasureFirstEmitter(), ModuleData->GetLocalizedPositions().end());
617 const auto CurrentEmitter = EmitterCount - std::distance(ModuleData->GetAutoMeasureCurrentEmitter(), ModuleData->GetLocalizedPositions().end());
619 ui->LAutoMeasureCellProgress->setText(
"Emitter " + QString::number(CurrentEmitter + 1) +
620 " / " + QString::number(EmitterCount) +
", " +
621 QString::number(ModuleData->GetNumFinishedLocalizedPositions()) +
" successful, " +
622 QString::number(ModuleData->GetNumFailedLocalizedPositions()) +
" failed");
623 ui->PBAutoMeasureCellProgress->setValue(
static_cast<int>(100.0 * CurrentEmitter / EmitterCount));
624 ui->PBAutoMeasureCellProgress->setVisible(
true);
628 ui->LAutoMeasureCellProgress->setText(
"Ready");
629 ui->PBAutoMeasureCellProgress->setVisible(
false);
632 ui->GBAutoMeasureSampleProgress->setVisible(IsCharacterizingSample && ModuleData->HasCellID());
633 if (IsCharacterizingSample && ModuleData->HasCellID())
635 const auto CurrentCell = ModuleData->GetAutoMeasureCurrentCellIndex();
636 const auto CellCount = ModuleData->GetAutoMeasureCellCount();
638 ui->LAutoMeasureSampleProgress->setText(
"Cell " + QString::number(CurrentCell + 1) +
639 " / " + QString::number(CellCount));
640 ui->PBAutoMeasureSampleProgress->setValue(
static_cast<int>(100.0 * CurrentCell / CellCount));