4#include "ui_WidefieldMicroscope.h"
31 if (UsingX && Other.
UsingX)
32 dist += (x - Other.
x) * (x - Other.
x);
33 if (UsingY && Other.
UsingY)
34 dist += (y - Other.
y) * (y - Other.
y);
35 if (UsingZ && Other.
UsingZ)
36 dist += (z - Other.
z) * (z - Other.
z);
38 return std::sqrt(dist);
43 std::stringstream stream;
44 stream << std::setprecision(9);
46 stream << Prefix <<
"Valid = " << (!IsEmpty() ?
"yes" :
"no") <<
"\n";
49 stream << Prefix <<
"X = " << x <<
" nm\n";
50 stream << Prefix <<
"MeasuredX = " << MeasuredX <<
" nm\n";
54 stream << Prefix <<
"Y = " << y <<
" nm\n";
55 stream << Prefix <<
"MeasuredY = " << MeasuredY <<
" nm\n";
59 stream << Prefix <<
"Z = " << z <<
" nm\n";
60 stream << Prefix <<
"MeasuredZ = " << MeasuredZ <<
" nm\n";
84 default:
return QApplication::palette().text().color();
98 auto X = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
GetSampleStageX()->GetInstrumentData())->GetCurrentPosition();
99 auto Y = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
GetSampleStageY()->GetInstrumentData())->GetCurrentPosition();
101 return {
static_cast<decltype(X)
>(X * Ratio) ,
static_cast<decltype(Y)
>(Y * Ratio) };
106 std::stringstream CSVData;
107 CSVData << std::setprecision(9);
122 if (IncludeConfocalScan)
137 CSVData <<
"HBTBinWidth = " <<
HBTBinWidth.count() <<
" ps\n";
138 CSVData <<
"HBTBinCount = " <<
HBTBinCount <<
"\n";
145 if (IncludeAutoMeasure)
177 CSVData <<
"HEADER_END\n";
184 Stream <<
"X_measured(nm);Y_measured(nm);X_destiny(nm);Y_destiny(nm);C(Hz)\n";
187 for (
const auto& ResultItem : ResultItems)
188 Stream << ResultItem.first.MeasuredX <<
";" << ResultItem.first.MeasuredY <<
";"
189 << ResultItem.first.x <<
";" << ResultItem.first.y <<
";"
190 << ResultItem.second <<
"\n";
195 Stream <<
"t(ps);g2\n";
198 Stream << ResultItem.x() <<
";" << ResultItem.y() <<
"\n";
227 return Pos.second.State == LocalizedEmitterStateType::Finished;
234 return Pos.second.State == LocalizedEmitterStateType::Failed;
307 if (FirstEmitterID < 0)
418 Point.
x = lhs.
x + rhs.
x;
437 Point.
y = lhs.
y + rhs.
y;
456 Point.
z = lhs.
z + rhs.
z;
482 Point.
x = lhs.
x - rhs.
x;
501 Point.
y = lhs.
y - rhs.
y;
520 Point.
z = lhs.
z - rhs.
z;
541 : QModuleBase(OwnerThreadID, std::move(Params)),
542 StateMachine(InitializingState,
543 SetupTransitionBeginState, SetupTransitioningState, SetupTransitionEndState, SetupTransitionFinishedState,
545 AutofocusBeginState, AutofocusWaitingState, AutofocusFinishedState,
546 LEDImageAcquisitionBeginState, WidefieldImageAcquisitionBeginState,
547 WaitingForLEDImageReadyToCaptureState, WaitingForLEDImageState, WaitingForLEDImageFinishedState,
548 WaitingForWidefieldImageReadyToCaptureState, WaitingForWidefieldImageState, WaitingForWidefieldImageFinishedState,
549 WaitingForWidefieldCellIDState, WidefieldCellWaitUntilCenteredState, WidefieldCellIDReadFinishedState,
550 WaitingForWidefieldLocalizationState, WidefieldLocalizationFinishedState,
551 FindingConfocalSpotBeginState, FindingConfocalSpotAfterTransitioningToConfocalModeState, FindingConfocalSpotAfterRecordingWidefieldImageState,
552 ConfocalScanStepState, ConfocalScanWaitUntilMovedState, ConfocalScanCaptureState, ConfocalScanWaitUntilCapturedState,
553 ConfocalOptimizationInitState, ConfocalOptimizationInitSubStepState, ConfocalOptimizationWaitState, ConfocalOptimizationStepState, ConfocalOptimizationFinishedState,
554 HBTAcquiringState, HBTFinishedState,
555 WaitingState, WaitingFinishedState,
556 PLEAcquisitionWaitingState, PLEAcquisitionFinishedState,
557 SpectrumAcquisitionWaitingState, SpectrumAcquisitionFinishedState,
558 AutoMeasureLocalizationStepState, AutoMeasureLocalizationSaveLEDImageState, AutoMeasureLocalizationSaveWidefieldImageState,
559 AutoMeasureLocalizationMovingState,
560 AutoMeasureLocalizationPLEBeginState, AutoMeasureLocalizationPLEFinishedState,
561 AutoMeasureLocalizationFinishedState,
562 AutoMeasureCharacterizationStepState, AutoMeasureCharacterizationGotoEmitterState, AutoMeasureCharacterizationOptimizationFinishedState,
563 AutoMeasureCharacterizationSpectrumBeginState, AutoMeasureCharacterizationSpectrumFinishedState,
564 AutoMeasureCharacterizationPLEBeginState, AutoMeasureCharacterizationPLEFinishedState,
565 AutoMeasureCharacterizationHBTBeginState, AutoMeasureCharacterizationHBTWaitForInitState, AutoMeasureCharacterizationHBTFinishedState,
566 AutoMeasureCharacterizationFinishedState,
567 AutoMeasureSampleStepState, AutoMeasureSampleReadCellIDState, AutoMeasureSampleReadCellIDFinishedState,
568 AutoMeasureSampleLocalizeState, AutoMeasureSampleFindEmittersState,
569 AutoMeasureSampleCharacterizeState, AutoMeasureSampleAdvanceCellState, AutoMeasureSampleFinishedState),
575 GSLConfocalOptimizationState(gsl_multimin_fminimizer_alloc(GSLConfocalOptimizationMinimizer, GSLConfocalOptimizationNumDimensions)),
576 GSLConfocalOptimizationStepSize(gsl_vector_alloc(GSLConfocalOptimizationNumDimensions)),
577 GSLConfocalOptimizationInitialPoint(gsl_vector_alloc(GSLConfocalOptimizationNumDimensions))
595 auto CurrentState =
StateMachine.GetCurrentState()->GetState();
599 return std::chrono::milliseconds(30);
601 return std::chrono::milliseconds(2);
611 static constexpr const char* SaveErrorMsg =
"[WidefieldMicroscope] Saving an image failed.";
619 if (!Image.save(Filename))
639 { Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()) },
646 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
669 if (
ModuleData->GetPumpPowerIndicator()->CanRead())
711 auto Widget = std::make_unique<WidefieldMicroscopeWidget>(*
this);
780 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(
Widget->GetUI()->SBConfocalSPDExposureTime->value()));
787 auto Widget = GetWidget<WidefieldMicroscopeWidget>();
788 std::string UIMessage;
791 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(ModuleDataGetter());
809 if (!UIMessage.empty())
810 QMessageBox::warning(
Widget,
"Widefield Microscope", UIMessage.data());
823 ModuleData->ResetAutoMeasureCurrentImageSet();
859 ModuleData->GetSampleStageX()->MoveAbsolute(Point.
x /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
861 *PositionerState = PositionerStateType::Moving;
869 ModuleData->GetSampleStageY()->MoveAbsolute(Point.
y /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
871 *PositionerState = PositionerStateType::Moving;
879 ModuleData->GetSampleStageZ()->MoveAbsolute(Point.
z /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
881 *PositionerState = PositionerStateType::Moving;
900 auto SampleStageXData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageX()->GetInstrumentData());
901 auto SampleStageYData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageY()->GetInstrumentData());
902 bool IsMoving = !SampleStageXData->HasArrived() || !SampleStageYData->HasArrived();
919 std::min(
ModuleData->GetMaxFocusVoltage(), Voltage +
925 QPoint MarkerPos, QPointF SamplePos)
const
927 const auto DiffPosInPx =
ModuleData->GetConfocalSpotImagePosition() - MarkerPos;
928 const WidefieldMicroscopeData::PositionPoint SamplePosPoint(Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()));
934 QPoint MarkerPos, QPointF SamplePos)
const
942 QSurfaceDataArray QSurfaceDataRows;
945 for (
int i = 1; i <= Height; ++i)
947 auto y = CenterPosition.
y + (-
static_cast<double>(Height) / 2 + i) * DistPerPixel;
948 auto Row = QSurfaceDataRow(Width);
950 for (
auto j = Width; j > 0; --j)
956 x = CenterPosition.
x + (-
static_cast<double>(Width) / 2 + j) * DistPerPixel;
958 x = CenterPosition.
x + (
static_cast<double>(Width) / 2 - j + 1) * DistPerPixel;
960 auto ColIndex = i % 2 ? j - 1 : Width - j;
961 Row[ColIndex].setPosition(QVector3D(std::round(x), 0, std::round(y)));
967 QSurfaceDataRows << std::move(Row);
970 return QSurfaceDataRows;
990 ModuleData->GetWidefieldCamera()->StopCapturingSync();
993 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(
ModuleData->GetWidefieldCamera()->GetInstrumentData());
994 CameraData->ClearImage();
1000 ModuleData->GetWidefieldCamera()->CaptureSingle();
1037 if (ModuleData->GetCurrentImage().isNull())
1038 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Failed;
1048 *LocalizerState = WidefieldImageProcessingStateType::Failed;
1049 Exception.ClearError();
1057 *LocalizerState = WidefieldImageProcessingStateType::Finished;
1060 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Waiting;
1062 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
1065 ModuleData->GetWidefieldLocalizer()->RecallPositions(ModuleData->GetCurrentImage(),
1069 return StateType::WaitingForWidefieldLocalization;
1074 ModuleData->GetSPD1()->SetStreamSize(1);
1075 ModuleData->GetSPD1()->SetExposureTime(ModuleData->GetSPDExposureTime());
1076 ModuleData->GetSPD1()->SetCoincidenceWindow(ModuleData->GetSPD1()->GetResolution());
1078 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1080 ModuleData->GetSPD2()->SetStreamSize(1);
1081 ModuleData->GetSPD2()->SetExposureTime(ModuleData->GetSPDExposureTime());
1082 ModuleData->GetSPD2()->SetCoincidenceWindow(ModuleData->GetSPD2()->GetResolution());
1088 ConfocalOptimizationNumStepsPerformed = 0;
1090 PrepareAPDsForConfocalMode(ModuleData);
1091 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1092 auto SamplePosition = ModuleData->GetSamplePosition();
1094 gsl_vector_set(GSLConfocalOptimizationStepSize, 0,
1095 ModuleData->GetSampleStageX()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1096 gsl_vector_set(GSLConfocalOptimizationStepSize, 1,
1097 ModuleData->GetSampleStageY()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1098 gsl_vector_set(GSLConfocalOptimizationStepSize, 2,
1099 ModuleData->GetSampleFocusPiezoZ()->GetHardwareResolution() * ModuleData->GetConfocalOptimizationInitZStepSize());
1100 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 0, SamplePosition.x);
1101 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 1, SamplePosition.y);
1102 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 2, ModuleData->GetFocusZeroVoltage());
1108 ModuleData->GetWidefieldHBTSwitch()->Set(IsHBTMode);
1113 ModuleData->ClearHBTDataPoints();
1114 ModuleData->SetHBTSamplePosition(ModuleData->GetSamplePosition());
1116 auto TimeTagger = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1117 TimeTagger->SetHBTActive(
true);
1118 TimeTagger->ConfigureHBT(ModuleData->GetHBTBinWidth(), ModuleData->GetHBTBinCount());
1119 TimeTagger->ResetHBT();
1120 HBTIntegrationTimeBeforeReset = ModuleData->GetHBTTotalIntegrationTime();
1125 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1127 auto SPD1 = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1128 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(SPD1->GetInstrumentData());
1129 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
1130 SPD1->SetHBTActive(
false);
1131 SPD1Data->ResetStreamMode();
1132 SPD2Data->ResetStreamMode();
1138 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1140 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1142 if (!IsCharacterizingSample())
1143 StateMachine.SetContext(&AutofocusSetupTransitioningContext);
1145 return StateType::SetupTransitionBegin;
1148 return StateType::AutofocusBegin;
1153 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
1156 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1157 ModuleData->ResetAutoMeasureCurrentImageSet();
1158 WaitingEndTimePoint = std::chrono::system_clock::now() + ModuleData->GetAutoMeasureInitialImageSetWaitTime();
1160 LogUIMessagesOnly =
true;
1162 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleLocalizationContext : &AutoMeasureLocalizationContext);
1163 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1165 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1167 return StateType::SetupTransitionBegin;
1170 return StateType::Waiting;
1175 if (FirstEmitterID < 0)
1176 ModuleData->ResetAutoMeasureCurrentEmitter();
1179 bool Success = ModuleData->SetAutoMeasureFirstEmitter(FirstEmitterID);
1181 return ResetState(ModuleData);
1184 std::ranges::for_each(ModuleData->GetLocalizedPositions(), [](
auto& Item) { Item.second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet; });
1185 ModuleData->SetLocalizedPositionsStateChanged();
1186 ModuleData->SetAutoMeasureRunning(
true);
1187 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1189 LogUIMessagesOnly =
true;
1191 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationContext : &AutoMeasureCharacterizationContext);
1192 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1194 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1196 return StateType::SetupTransitionBegin;
1199 return StateType::AutoMeasureCharacterizationStep;
1204 LogUIMessagesOnly =
true;
1206 StateMachine.SetContext(&AutoMeasureSampleContext);
1208 return StateType::AutoMeasureSampleStep;
1213 auto SavePath = ModuleData->GetAutoMeasureSavePath();
1214 SavePath.replace_filename(SavePath.filename().stem().concat(FilenameSuffix));
1215 std::filesystem::create_directories(SavePath.parent_path());
1222 static std::random_device random_devce;
1223 static std::mt19937 random_generator(random_devce());
1224 static std::uniform_real_distribution<double> angle_random_distribution(0., 2. * std::numbers::pi);
1225 std::uniform_real_distribution<double> radius_random_distribution(0., Radius);
1227 const auto angle = angle_random_distribution(random_generator);
1228 const auto r = radius_random_distribution(random_generator);
1229 const auto x = Util::NumToT<ModuleDataType::PositionType>(r * std::cos(angle));
1230 const auto y = Util::NumToT<ModuleDataType::PositionType>(r * std::sin(angle));
1235 void WidefieldMicroscope::ConfocalOptimizationInitPromises()
1237 ConfocalOptimizationStatePromise =
decltype(ConfocalOptimizationStatePromise)();
1238 ConfocalOptimizationStateFuture = ConfocalOptimizationStatePromise.get_future();
1239 ConfocalOptimizationFeedbackPromise =
decltype(ConfocalOptimizationFeedbackPromise)();
1240 ConfocalOptimizationFeedbackFuture = ConfocalOptimizationFeedbackPromise.get_future();
1242 ConfocalOptimizationPromisesRenewed =
true;
1256 return Status ? ConfocalOptimizationThreadReturnType::Failed : ConfocalOptimizationThreadReturnType::NextStep;
1262 return ConfocalOptimizationThreadReturnType::Failed;
1267 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Owner->
GetModuleData());
1269 Status = gsl_multimin_test_size(Size, ModuleData->GetConfocalOptimizationTolerance());
1272 return Status == GSL_SUCCESS ? ConfocalOptimizationThreadReturnType::Finished :
1273 (Status == GSL_CONTINUE ? ConfocalOptimizationThreadReturnType::NextStep : ConfocalOptimizationThreadReturnType::Failed);
1278 return ConfocalOptimizationThreadReturnType::Failed;
1283 double WidefieldMicroscope::ConfocalOptimizationFuncForwarder(
const gsl_vector* vector,
void* params)
1288 double WidefieldMicroscope::ConfocalOptimizationFunc(
const gsl_vector* vector)
noexcept
1293 while (!ConfocalOptimizationPromisesRenewed)
1294 std::this_thread::yield();
1296 auto X =
static_cast<decltype(ConfocalOptimizationStateType::X)
>(gsl_vector_get(vector, 0));
1297 auto Y =
static_cast<decltype(ConfocalOptimizationStateType::Y)
>(gsl_vector_get(vector, 1));
1298 auto Z =
static_cast<decltype(ConfocalOptimizationStateType::Z)
>(gsl_vector_get(vector, 2));
1302 ConfocalOptimizationStatePromise.set_value({ X, Y, Z });
1304 if (!ConfocalOptimizationFeedbackFuture.valid())
1308 return ConfocalOptimizationFeedbackFuture.get();
1318 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1319 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1321 if (ModuleParams->ImageAcqCommunicator.ContainsID())
1323 Instance->
LockObject(ModuleParams->ImageAcqCommunicator, ModuleData->GetImageAcqCommunicator());
1324 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator);
1330 if (ModuleParams->SpectrumAcqCommunicator.ContainsID())
1332 Instance->
LockObject(ModuleParams->SpectrumAcqCommunicator, ModuleData->GetSpectrumAcqCommunicator());
1333 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator);
1335 FinishedEvent::Register(*
this, &WidefieldMicroscope::OnSpectrumFinishedRecording, ModuleData->GetSpectrumAcqCommunicator()->GetID());
1338 if (ModuleParams->PLEAcqCommunicator.ContainsID())
1340 Instance->
LockObject(ModuleParams->PLEAcqCommunicator, ModuleData->GetPLEAcqCommunicator());
1341 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator);
1343 FinishedEvent::Register(*
this, &WidefieldMicroscope::OnPLEAcquisitionFinished, ModuleData->GetPLEAcqCommunicator()->GetID());
1346 if (ModuleParams->WidefieldCamera.ContainsID())
1348 Instance->
LockObject(ModuleParams->WidefieldCamera, ModuleData->GetWidefieldCamera());
1349 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Widefield);
1352 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
1353 ModuleData->SetMinCameraExposureTime(CameraData->GetMinExposureTime());
1354 ModuleData->SetMaxCameraExposureTime(CameraData->GetMaxExposureTime());
1357 if (ModuleParams->WidefieldLocalizer.ContainsID())
1359 Instance->
LockObject(ModuleParams->WidefieldLocalizer, ModuleData->GetWidefieldLocalizer());
1360 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization);
1364 if (ModuleParams->SampleStageX.ContainsID() && ModuleParams->SampleStageY.ContainsID())
1366 Instance->
LockObject(ModuleParams->SampleStageX, ModuleData->GetSampleStageX());
1367 Instance->
LockObject(ModuleParams->SampleStageY, ModuleData->GetSampleStageY());
1369 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning);
1371 if (ModuleParams->SPD1.ContainsID())
1373 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1374 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Confocal);
1378 if (ModuleParams->SampleStageZ.ContainsID())
1380 Instance->
LockObject(ModuleParams->SampleStageZ, ModuleData->GetSampleStageZ());
1381 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleZPositioning);
1384 if (ModuleParams->FocusPiezoZ.ContainsID())
1386 Instance->
LockObject(ModuleParams->FocusPiezoZ, ModuleData->GetSampleFocusPiezoZ());
1388 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator))
1389 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment);
1390 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning))
1391 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization);
1393 ModuleData->SetMinFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMinValue());
1394 ModuleData->SetMaxFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMaxValue());
1397 if (ModuleParams->SPD1.ContainsID() && ModuleParams->SPD2.ContainsID())
1399 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1400 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1401 Instance->
LockObject(ModuleParams->SPD2, ModuleData->GetSPD2());
1403 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBT);
1406 if (ModuleParams->LEDSwitch.ContainsID())
1408 Instance->
LockObject(ModuleParams->LEDSwitch, ModuleData->GetLEDSwitch());
1409 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle);
1411 ModuleData->SetLEDLightTurnedOn(
false);
1414 if (ModuleParams->PumpSwitch.ContainsID())
1416 Instance->
LockObject(ModuleParams->PumpSwitch, ModuleData->GetPumpSwitch());
1417 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle);
1419 ModuleData->SetPumpLightTurnedOn(
false);
1422 if (ModuleParams->PumpPower.ContainsID())
1424 Instance->
LockObject(ModuleParams->PumpPower, ModuleData->GetPumpPower());
1425 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower);
1427 ModuleData->SetMinPumpPower(ModuleData->GetPumpPower()->GetUserMinValue());
1428 ModuleData->SetMaxPumpPower(ModuleData->GetPumpPower()->GetUserMaxValue());
1429 ModuleData->SetWidefieldPumpPower(ModuleParams->DefaultPowerWidefieldMode);
1430 ModuleData->SetConfocalPumpPower(ModuleParams->DefaultPowerConfocalMode);
1433 if (ModuleParams->PumpPowerIndicator.ContainsID())
1435 Instance->
LockObject(ModuleParams->PumpPowerIndicator, ModuleData->GetPumpPowerIndicator());
1436 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::MeasurePumpPower);
1439 if (ModuleParams->WidefieldConfocalSwitch.ContainsID())
1441 Instance->
LockObject(ModuleParams->WidefieldConfocalSwitch, ModuleData->GetWidefieldConfocalSwitch());
1442 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch);
1444 if (ModuleParams->WidefieldConfocalIndicator.ContainsID())
1446 Instance->
LockObject(ModuleParams->WidefieldConfocalIndicator, ModuleData->GetWidefieldConfocalIndicator());
1447 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator);
1449 ModuleData->SetSetupMode(ModuleData->GetWidefieldConfocalIndicator()->GetSync() ? WidefieldMicroscopeData::SetupModeType::Confocal : WidefieldMicroscopeData::SetupModeType::Widefield);
1452 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1455 if (ModuleParams->WidefieldHBTSwitch.ContainsID())
1457 Instance->
LockObject(ModuleParams->WidefieldHBTSwitch, ModuleData->GetWidefieldHBTSwitch());
1458 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch);
1460 MakeAndEnqueueEvent(
this, &WidefieldMicroscope::OnToggleHBTMirror,
false);
1466 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1468 OnStopAction(Instance,
false);
1470 Instance->
UnlockObject(ModuleData->GetImageAcqCommunicator());
1471 Instance->
UnlockObject(ModuleData->GetSpectrumAcqCommunicator());
1472 Instance->
UnlockObject(ModuleData->GetPLEAcqCommunicator());
1476 Instance->
UnlockObject(ModuleData->GetSampleFocusPiezoZ());
1479 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalSwitch());
1480 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalIndicator());
1481 Instance->
UnlockObject(ModuleData->GetWidefieldHBTSwitch());
1483 Instance->
UnlockObject(ModuleData->GetPumpPowerIndicator());
1484 Instance->
UnlockObject(ModuleData->GetWidefieldCamera());
1485 Instance->
UnlockObject(ModuleData->GetWidefieldLocalizer());
1501 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1504 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1506 ModuleData->GetSampleStageX()->StopMotion();
1507 ModuleData->GetSampleStageY()->StopMotion();
1510 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1511 ModuleData->GetWidefieldCamera()->StopCapturing();
1513 StopHBT(ModuleData);
1515 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator) &&
1516 StateMachine.GetCurrentState()->GetState() == StateType::SpectrumAcquisitionWaiting)
1517 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
StopEvent{});
1518 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator) &&
1519 StateMachine.GetCurrentState()->GetState() == StateType::PLEAcquisitionWaiting)
1520 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StopEvent{});
1522 if (ConfocalOptimizationThreadReturnFuture.valid())
1527 ConfocalOptimizationFeedbackPromise =
decltype(ConfocalOptimizationFeedbackPromise)();
1528 ConfocalOptimizationPromisesRenewed =
true;
1533 ConfocalOptimizationThreadReturnFuture.wait();
1536 if (ModuleData->IsAutoMeasureRunning())
1538 if (ModuleData->GetAutoMeasureCurrentEmitter() != ModuleData->GetLocalizedPositions().cend())
1540 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet;
1541 ModuleData->SetLocalizedPositionsStateChanged();
1544 ModuleData->SetAutoMeasureRunning(
false);
1547 StateMachine.SetCurrentState(ResetState(ModuleData));
1552 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1554 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1557 ModuleData->SetSampleHomePosition(ModuleData->GetSamplePosition());
1562 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1564 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1567 MoveSampleTo(ModuleData->GetSampleHomePosition(), ModuleData);
1572 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1574 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1577 ModuleData->SetLEDLightTurnedOn(State);
1582 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1584 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
1587 ModuleData->SetPumpLightTurnedOn(State);
1592 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1594 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1597 if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI()->action_Widefield_mode)
1598 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1599 else if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI()->action_Confocal_mode)
1600 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1604 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1609 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1611 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
1614 StateMachine.SetCurrentState(StartAutofocus(ModuleData));
1619 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1621 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
1622 || ModuleData->GetSetupMode() != WidefieldMicroscopeData::SetupModeType::Confocal)
1625 InitializeConfocalOptimizer(ModuleData);
1628 StateMachine.SetContext(&ConfocalOptimizationContext);
1629 StateMachine.SetCurrentState(StateType::ConfocalOptimizationInit);
1634 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1635 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1637 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
1640 SetHBTSwitch(ModuleParams, ModuleData, Checked);
1645 if (!IsReadyState())
1648 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1649 ModuleData->ResetCellID();
1654 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1655 ModuleData->SetWidefieldPumpPower(Value);
1657 UpdatePumpPower(ModuleData);
1662 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1663 ModuleData->SetConfocalPumpPower(Value);
1665 UpdatePumpPower(ModuleData);
1670 if (!IsReadyState())
1673 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1674 SetFocus(ModuleData, Value);
1679 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1680 ModuleData->SetFocusZeroVoltage(Value);
1685 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1686 ModuleData->SetFocusConfocalOffsetVoltage(Value);
1688 if (IsReadyState() && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
1689 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
1694 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1695 ModuleData->SetFocusZeroVoltage(ModuleData->GetFocusCurrentVoltage());
1700 if (!IsReadyState())
1703 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1704 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1709 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1710 ModuleData->SetLEDCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1715 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1717 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1720 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1721 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetLEDCameraExposureTime());
1726 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1727 ModuleData->SetWidefieldCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1732 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1734 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1737 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1738 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetWidefieldCameraExposureTime());
1743 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1745 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield)
1746 || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1749 StateMachine.SetCurrentState(StateType::FindingConfocalSpotBegin);
1754 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1756 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1759 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1761 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1763 StateMachine.SetContext(&LEDImageAcquisitionSetupTransitioningContext);
1764 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1767 StateMachine.SetCurrentState(StateType::LEDImageAcquisitionBegin);
1772 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1774 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1777 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1779 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1781 StateMachine.SetContext(&WidefieldImageAcquisitionSetupTransitioningContext);
1782 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1785 StateMachine.SetCurrentState(StateType::WidefieldImageAcquisitionBegin);
1790 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1792 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1795 StateMachine.SetCurrentState(InitiateReadCellIDFromImage(ModuleData));
1800 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1802 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization) || ModuleData->GetCurrentImage().isNull())
1805 ModuleData->GetWidefieldLocalizer()->AnalyzeDistortion(ModuleData->GetCurrentImage());
1810 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1812 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1815 StateMachine.SetCurrentState(InitiateLocalizationFromImage(ModuleData));
1820 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1823 if (ModuleData->GetWidefieldPosition().IsEmpty())
1826 OnBringMarkerToConfocalSpot(Instance, Position, {
static_cast<qreal
>(ModuleData->GetWidefieldPosition().x),
static_cast<qreal
>(ModuleData->GetWidefieldPosition().y) });
1831 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1832 ModuleData->SetConfocalScanWidth(Value);
1837 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1838 ModuleData->SetConfocalScanHeight(Value);
1843 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1844 ModuleData->SetConfocalScanDistPerPixel(Value);
1849 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1850 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(Value));
1855 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1856 ModuleData->SetConfocalOptimizationInitXYStepSize(Value);
1861 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1862 ModuleData->SetConfocalOptimizationInitZStepSize(Value);
1867 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1868 ModuleData->SetConfocalOptimizationTolerance(Value);
1873 int Width{}, Height{}, DistPerPixel{};
1876 OnGoToHomePosition(Instance,
false);
1879 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1881 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1884 CenterPosition = ModuleData->GetSamplePosition();
1886 Width = ModuleData->GetConfocalScanWidth();
1887 Height = ModuleData->GetConfocalScanHeight();
1888 DistPerPixel = ModuleData->GetConfocalScanDistPerPixel();
1890 PrepareAPDsForConfocalMode(ModuleData);
1892 ModuleData->ClearConfocalScanResults();
1897 auto SurfaceDataRows = CalculateConfocalScanPositions(Width, Height, DistPerPixel, CenterPosition);
1899 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1900 ModuleData->SetConfocalScanSurfacePlotRows(std::move(SurfaceDataRows));
1902 StateMachine.SetCurrentState(StateType::ConfocalScanStep);
1907 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1909 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1912 const auto& Results = ModuleData->GetConfocalScanResults();
1913 auto ResultItemIt = std::find_if(Results.cbegin(), Results.cend(), [&Position](
const std::pair<WidefieldMicroscopeData::PositionPoint, double>& ResultItem) {
1914 return ResultItem.first.RowIndex == Position.x() && ResultItem.first.ColumnIndex == Position.y();
1917 if (ResultItemIt != Results.cend())
1918 MoveSampleTo({ ResultItemIt->first.MeasuredX, ResultItemIt->first.MeasuredY }, ModuleData);
1923 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1924 ModuleData->SetHBTBinWidth(
Util::picoseconds(
static_cast<Util::picoseconds::rep
>(Value)));
1929 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1930 ModuleData->SetHBTBinCount(Value);
1935 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1936 ModuleData->SetHBTMaxIntegrationTime(std::chrono::microseconds(Util::NumToT<std::chrono::microseconds::rep>(Value * std::chrono::microseconds::period::den)));
1941 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1943 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1946 InitializeHBT(ModuleData);
1948 StateMachine.SetCurrentState(StateType::HBTAcquiring);
1953 ImageCapturingPaused =
true;
1958 static constexpr const char* AutofocusFailedErrorMsg =
"[WidefieldMicroscope] Autofocusing failed!";
1960 if (StateMachine.GetCurrentState()->GetState() != StateType::AutofocusWaiting)
1963 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1964 ModuleData->SetAutofocusFinished();
1968 Voltage -= ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? ModuleData->GetFocusConfocalOffsetVoltage() : .0;
1970 SetFocus(ModuleData, Voltage);
1971 ModuleData->SetFocusZeroVoltage(Voltage);
1975 if (LogUIMessagesOnly)
1979 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1980 ModuleData->SetUIMessage(AutofocusFailedErrorMsg);
1984 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1985 ModuleData->SetLEDLightTurnedOn(
false);
1990 StateMachine.SetCurrentState(StateType::SpectrumAcquisitionFinished);
1995 StateMachine.SetCurrentState(StateType::PLEAcquisitionFinished);
2000 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2001 ModuleData->SetAutoMeasureSavePath(Path.toStdString());
2006 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2007 ModuleData->SetAutoMeasureNumberImageSets(Value);
2012 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2013 ModuleData->SetAutoMeasureInitialImageSetWaitTime(std::chrono::seconds(
static_cast<std::chrono::seconds::rep
>(Value)));
2018 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2019 ModuleData->SetAutoMeasureImagePositionScatterRadius(Value);
2024 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2030 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2031 ModuleData->SetAutoMeasureWidefieldPLEEnabled(State);
2036 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2037 ModuleData->SetAutoMeasureOptimizeEnabled(State);
2042 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2043 ModuleData->SetAutoMeasureSpectrumEnabled(State);
2048 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2049 ModuleData->SetAutoMeasureConfocalPLEEnabled(State);
2054 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2055 ModuleData->SetAutoMeasureHBTEnabled(State);
2060 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2061 ModuleData->SetAutoMeasureNumOptimizationAttempts(Value);
2066 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2067 ModuleData->SetAutoMeasureMaxOptimizationReruns(Value);
2072 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2073 ModuleData->SetAutoMeasureOptimizationMaxDistance(Value);
2078 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2079 ModuleData->SetAutoMeasureCountRateThreshold(Value);
2084 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2085 ModuleData->GetAutoMeasureCellRangeFrom().setX(Value);
2090 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2091 ModuleData->GetAutoMeasureCellRangeFrom().setY(Value);
2096 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2097 ModuleData->GetAutoMeasureCellRangeTo().setX(Value);
2102 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2103 ModuleData->GetAutoMeasureCellRangeTo().setY(Value);
2108 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2109 ModuleData->GetAutoMeasureCellSkip().setX(Value);
2114 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2115 ModuleData->GetAutoMeasureCellSkip().setY(Value);
2120 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2121 ModuleData->SetAutoMeasureSampleRotated(State == Qt::CheckState::Checked);
2126 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2128 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
2131 StateMachine.SetCurrentState(StartAutoMeasureLocalization(ModuleData));
2136 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2138 if (!IsReadyState() || ModuleData->GetLocalizedPositions().empty() || ModuleData->GetWidefieldPosition().IsEmpty())
2141 StateMachine.SetCurrentState(StartAutoMeasureCharacterization(ModuleData));
2146 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2148 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) ||
2149 !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
2152 if (!ModuleData->IsCellRangeValid())
2154 ModuleData->SetUIMessage(
"Please specify a valid cell range.");
2161 ModuleData->ResetCellID();
2163 StateMachine.SetCurrentState(StartAutoMeasureSampleCharacterization(ModuleData));
2168 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2172 return ResetState(ModuleData);
2177 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2179 ResetState(ModuleData);
2181 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
2182 return StateType::SetupTransitionBegin;
2184 return StateType::Ready;
2190 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2191 SetupTransitionFinishedTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldConfocalTransitionTime);
2194 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2196 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Unknown)
2198 ModuleData->SetUIMessage(
"Transitioning failed due to unknown destiny setup mode!");
2200 return ResetState(ModuleData);
2203 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2205 TurnOnPumpSourceAfterTransitioning = ModuleData->GetPumpLightTurnedOn();
2206 ModuleData->SetPumpLightTurnedOn(
false);
2209 TurnOnPumpSourceAfterTransitioning =
false;
2211 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield)
2212 ModuleData->GetWidefieldConfocalSwitch()->Set(
false);
2213 else if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2214 ModuleData->GetWidefieldConfocalSwitch()->Set(
true);
2216 return StateType::SetupTransitioning;
2221 return std::chrono::system_clock::now() >= SetupTransitionFinishedTimePoint ? StateType::SetupTransitionEnd : StateType::SetupTransitioning;
2226 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2228 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator)
2229 && ModuleData->GetWidefieldConfocalIndicator()->GetSync() != (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal))
2231 ModuleData->SetUIMessage(
"Transitioning into " + std::string(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ?
"confocal" :
"widefield") +
" mode failed!");
2232 ModuleData->SetSetupMode(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? WidefieldMicroscopeData::SetupModeType::Widefield : WidefieldMicroscopeData::SetupModeType::Confocal);
2234 return ResetState(ModuleData);
2238 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2240 UpdatePumpPower(ModuleData);
2241 if (TurnOnPumpSourceAfterTransitioning)
2242 ModuleData->SetPumpLightTurnedOn(
true);
2244 return StateType::SetupTransitionFinished;
2249 return StateType::Ready;
2254 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2258 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
2259 return StateType::AutofocusFinished;
2261 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2262 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2264 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2265 ModuleData->SetLEDLightTurnedOn(
true);
2266 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2267 ModuleData->SetPumpLightTurnedOn(
false);
2269 ModuleData->ResetAutofocusFinished();
2272 return StateType::AutofocusWaiting;
2277 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2281 if (StateMachine.GetContext() == &AutoMeasureSampleContext)
2282 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::seconds(2);
2284 return ModuleData->IsAutofocusFinished() ? StateType::AutofocusFinished : StateType::AutofocusWaiting;
2289 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2291 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2292 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2294 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2295 ModuleData->SetLEDLightTurnedOn(
true);
2296 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2297 ModuleData->SetPumpLightTurnedOn(
false);
2300 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage(),
true);
2302 PrepareImageRecording(ModuleData);
2304 return StateType::WaitingForLEDImageReadyToCapture;
2309 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2311 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2312 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2314 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2315 ModuleData->SetLEDLightTurnedOn(
false);
2316 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2317 ModuleData->SetPumpLightTurnedOn(
true);
2319 PrepareImageRecording(ModuleData);
2321 return StateType::WaitingForWidefieldImageReadyToCapture;
2326 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2328 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator) && !ImageCapturingPaused)
2329 return StateMachine.GetCurrentState()->GetState();
2331 RecordImage(ModuleData);
2333 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImageReadyToCapture ?
2334 StateType::WaitingForLEDImage : StateType::WaitingForWidefieldImage;
2339 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2340 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
2342 if (CameraData->IsImageAvailbale())
2344 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2345 ModuleData->SetLEDLightTurnedOn(
false);
2346 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2347 ModuleData->SetPumpLightTurnedOn(
false);
2350 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2352 ModuleData->SetCurrentImage(CameraData->GetImage());
2354 if (StateMachine.GetCurrentState()->GetState() == StateType::WaitingForWidefieldImage)
2355 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
2357 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator))
2360 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImage ?
2361 StateType::WaitingForLEDImageFinished : StateType::WaitingForWidefieldImageFinished;
2364 return StateMachine.GetCurrentState()->GetState();
2369 static constexpr const char* ReadCellIDErrorMsg =
"[WidefieldMicroscope] Reading cell ID from current image failed. See log for further information.";
2371 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Waiting)
2372 return StateType::WaitingForWidefieldCellID;
2374 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2375 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2377 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Finished)
2379 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2380 ModuleData->SetCellID(WidefieldLocalizerData->GetCellID());
2382 if (WidefieldLocalizerData->GetCellID().HasCellShift())
2384 MoveSampleTo(ModuleData->GetSamplePosition() +
2385 PositionPointFromPixelDist(ModuleParams, ModuleData, WidefieldLocalizerData->GetCellID().CellShift_px_x, WidefieldLocalizerData->GetCellID().CellShift_px_y),
2388 return StateType::WidefieldCellWaitUntilCentered;
2393 ModuleData->ResetCellID();
2395 if (LogUIMessagesOnly)
2398 ModuleData->SetUIMessage(ReadCellIDErrorMsg);
2401 return StateType::WidefieldCellIDReadFinished;
2406 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2407 if (IsSampleMoving(ModuleData))
2408 return StateType::WidefieldCellWaitUntilCentered;
2410 if (IsCharacterizingSample())
2412 StateMachine.SetContext(&AutoMeasureSampleRecenterCellContext);
2415 return StateType::LEDImageAcquisitionBegin;
2418 return StateType::WidefieldCellIDReadFinished;
2423 static constexpr const char* LocalizationFailedErrorMsg =
"[WidefieldMicroscope] Localization of emitters in widefield image failed. See log for further information.";
2425 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Waiting)
2426 return StateType::WaitingForWidefieldLocalization;
2428 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2430 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Finished)
2432 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2433 auto& LocalizedPositionsRaw = WidefieldLocalizerData->GetLocalizedPositions();
2436 for (
const auto& Position : LocalizedPositionsRaw)
2437 LocalizedPositions[Util::NumToT<WidefieldMicroscopeData::LocalizedPositionsMapType::key_type>(Position.first)] = { Position.second };
2439 ModuleData->SetLocalizedPositions(std::move(LocalizedPositions));
2443 ModuleData->ClearLocalizedPositions();
2445 if (LogUIMessagesOnly)
2448 ModuleData->SetUIMessage(LocalizationFailedErrorMsg);
2451 return StateType::WidefieldLocalizationFinished;
2456 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2460 ModuleData->GetWidefieldCamera()->StopCapturing();
2462 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2463 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2465 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
2467 StateMachine.SetContext(&FindingConfocalSpotBeginContext);
2468 return StateType::SetupTransitionBegin;
2473 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2475 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2476 ModuleData->SetLEDLightTurnedOn(
false);
2477 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2478 ModuleData->SetPumpLightTurnedOn(
true);
2480 PrepareImageRecording(ModuleData);
2482 StateMachine.SetContext(&FindingConfocalSpotRecordingWidefieldImageContext);
2483 return StateType::WaitingForWidefieldImageReadyToCapture;
2488 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2490 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2491 ModuleData->SetPumpLightTurnedOn(
false);
2493 auto IntensityImage = ModuleData->GetCurrentImage().convertToFormat(QImage::Format_Grayscale8);
2494 const unsigned char* DataPtr = IntensityImage.constBits();
2496 QPoint MaxCoord(0, 0);
2497 unsigned char MaxValue = 0;
2498 for (
int y = 0; y < IntensityImage.width(); ++y)
2499 for (
int x = 0; x < IntensityImage.height(); ++x)
2500 if (*DataPtr++ > MaxValue)
2502 MaxCoord = { x, y };
2503 MaxValue = *(DataPtr - 1);
2506 ModuleData->SetConfocalSpotImagePosition(MaxCoord);
2507 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
2509 return StateType::SetupTransitionBegin;
2514 if (ConfocalScanPositions.empty())
2515 return StateType::Ready;
2517 const auto& Position = ConfocalScanPositions.front();
2520 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2521 ModuleData->GetSampleStageX()->UpdateData();
2522 ModuleData->GetSampleStageY()->UpdateData();
2523 MoveSampleTo(Position, ModuleData);
2526 return StateType::ConfocalScanWaitUntilMoved;
2531 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2532 if (IsSampleMoving(ModuleData))
2533 return StateType::ConfocalScanWaitUntilMoved;
2535 auto MeasuredPos = ModuleData->GetSamplePosition();
2536 ConfocalScanPositions.front().MeasuredX = MeasuredPos.x;
2537 ConfocalScanPositions.front().MeasuredY = MeasuredPos.y;
2539 return StateType::ConfocalScanCapture;
2544 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2546 ModuleData->ResetSPD1State();
2547 ModuleData->ResetSPD2State();
2550 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2553 ModuleData->GetSPD1()->ReadData();
2555 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
2558 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2561 ModuleData->GetSPD2()->ReadData();
2564 return StateType::ConfocalScanWaitUntilCaptured;
2570 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2571 bool UsingSPD2 = ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT);
2574 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2576 if (SPD1DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD1SamplesWritten() + 2)
2577 ModuleData->SetSPD1Ready(SPD1DataSampleStream->ReadSample().Value);
2579 ModuleData->GetSPD1()->ReadData();
2584 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2586 if (SPD2DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD2SamplesWritten() + 2)
2587 ModuleData->SetSPD2Ready(SPD2DataSampleStream->ReadSample().Value);
2589 ModuleData->GetSPD2()->ReadData();
2592 if (ModuleData->GetSPD1Ready() && (!UsingSPD2 || ModuleData->GetSPD2Ready()))
2594 auto ExposureTime = ModuleData->GetSPDExposureTime().count();
2595 double CountRate = (ModuleData->GetSPD1Value() + ModuleData->GetSPD2Value())
2596 / ExposureTime * WidefieldMicroscope::ModuleDataType::SPDTimeType::period::den;
2598 if (StateMachine.GetContext() != &ConfocalOptimizationContext &&
2599 StateMachine.GetContext() != &AutoMeasureCharacterizationContext &&
2600 StateMachine.GetContext() != &AutoMeasureCharacterizationOptimizationContext &&
2601 StateMachine.GetContext() != &AutoMeasureCharacterizationSpectrumContext &&
2602 StateMachine.GetContext() != &AutoMeasureCharacterizationHBTContext &&
2603 !IsCharacterizingSample())
2604 ModuleData->GetConfocalScanResults().emplace_back(ConfocalScanPositions.front(), CountRate);
2605 ModuleData->SetLastCountRate(CountRate);
2607 ConfocalScanPositions.pop_front();
2609 return StateType::ConfocalScanStep;
2612 return StateType::ConfocalScanWaitUntilCaptured;
2617 ConfocalOptimizationInitPromises();
2619 ConfocalOptimizationThreadReturnFuture = std::async(std::launch::async, &WidefieldMicroscope::ConfocalOptimizationThread,
this);
2621 return StateType::ConfocalOptimizationWait;
2626 ConfocalOptimizationInitPromises();
2628 return StateType::ConfocalOptimizationWait;
2634 if (ConfocalOptimizationStateFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2636 const auto State = ConfocalOptimizationStateFuture.get();
2638 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2640 SetFocus(ModuleData, State.Z);
2641 ConfocalScanPositions.clear();
2642 ConfocalScanPositions.emplace_back(State.X, State.Y);
2645 return StateType::DummyState;
2649 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2650 return StateType::ConfocalOptimizationStep;
2652 return StateType::ConfocalOptimizationWait;
2657 static constexpr const char* OptimizationMaxIterReachedErrorMsg =
"[WidefieldMicroscope] Optimizing confocal count rate failed - maximal number of iterations reached!";
2658 static constexpr const char* OptimizationFailedErrorMsg =
"[WidefieldMicroscope] Optimizing confocal count rate failed!";
2661 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2663 ConfocalOptimizationPromisesRenewed =
false;
2666 ConfocalOptimizationFeedbackPromise.set_value(-ModuleData->GetLastCountRate());
2670 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2672 auto Result = ConfocalOptimizationThreadReturnFuture.get();
2674 if (++ConfocalOptimizationNumStepsPerformed > 100)
2676 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2677 if (LogUIMessagesOnly)
2680 ModuleData->SetUIMessage(OptimizationMaxIterReachedErrorMsg);
2683 if (Result == ConfocalOptimizationThreadReturnType::NextStep)
2684 return StateType::ConfocalOptimizationInit;
2685 if (Result == ConfocalOptimizationThreadReturnType::Failed)
2687 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2688 if (LogUIMessagesOnly)
2691 ModuleData->SetUIMessage(OptimizationFailedErrorMsg);
2694 return StateType::ConfocalOptimizationFinished;
2698 return StateType::ConfocalOptimizationInitSubStep;
2703 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2704 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2708 if (SPD1Data->GetNumEnqueuedTasks() < 10)
2709 ModuleData->GetSPD1()->ReadData();
2711 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
2712 ModuleData->SetHBTNumEventCounts(SPD1Data->GetHBTResults().EventCounts);
2714 double XMin(std::numeric_limits<double>::max()), XMax(std::numeric_limits<double>::lowest());
2715 double YMin(std::numeric_limits<double>::max()), YMax(std::numeric_limits<double>::lowest());
2716 ModuleData->GetHBTDataPoints().clear();
2717 for (
const auto& ResultItem : SPD1Data->GetHBTResults().ResultVector)
2719 auto X = ResultItem.Time * std::pico::den;
2720 auto Y = ResultItem.Value;
2721 ModuleData->GetHBTDataPoints().append(QPointF(X, Y));
2723 XMin = std::min(XMin, X);
2724 XMax = std::max(XMax, X);
2725 YMin = std::min(YMin, Y);
2726 YMax = std::max(YMax, Y);
2727 ModuleData->SetHBTDataPointsMaxValues({ XMax, YMax });
2728 ModuleData->SetHBTDataPointsMinValues({ XMin, YMin });
2731 if (ModuleData->GetHBTMaxIntegrationTime() > std::chrono::microseconds(0) && ModuleData->GetHBTTotalIntegrationTime() >= ModuleData->GetHBTMaxIntegrationTime())
2733 StopHBT(ModuleData);
2735 return StateType::HBTFinished;
2738 return StateType::HBTAcquiring;
2743 return std::chrono::system_clock::now() >= WaitingEndTimePoint ? StateType::WaitingFinished : StateType::Waiting;
2749 return StateType::PLEAcquisitionWaiting;
2755 return StateType::SpectrumAcquisitionWaiting;
2760 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2762 if (ModuleData->IncrementAutoMeasureCurrentImageSet() >= ModuleData->GetAutoMeasureNumberImageSets())
2764 if (ModuleData->GetAutoMeasureWidefieldPLEEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator))
2765 return StateType::AutoMeasureLocalizationPLEBegin;
2767 return StateType::AutoMeasureLocalizationFinished;
2770 return StateType::LEDImageAcquisitionBegin;
2776 std::filesystem::path Filename;
2779 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2781 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2782 Filename = BuildFilename(ModuleData,
"_LED_" +
Util::ToStr(Index) +
".png");
2785 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2787 return StateType::WidefieldImageAcquisitionBegin;
2792 int Index, ImagePositionScatterRadius;
2793 std::filesystem::path Filename;
2796 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2798 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2799 ImagePositionScatterRadius = ModuleData->GetAutoMeasureImagePositionScatterRadius();
2800 Filename = BuildFilename(ModuleData,
"_WF_" +
Util::ToStr(Index) +
".png");
2803 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2806 if (ImagePositionScatterRadius > 0)
2808 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2813 if (ModuleData->GetAutoMeasureNumberImageSets() > 2 &&
2814 ModuleData->GetAutoMeasureCurrentImageSet() != ModuleData->GetAutoMeasureNumberImageSets() - 2)
2815 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition() + RandomPointInCircle(ImagePositionScatterRadius), ModuleData);
2817 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition(), ModuleData);
2819 return StateType::AutoMeasureLocalizationMoving;
2822 return StateType::AutoMeasureLocalizationStep;
2827 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2829 if (IsSampleMoving(ModuleData))
2830 return StateType::AutoMeasureLocalizationMoving;
2832 return StateType::AutoMeasureLocalizationStep;
2837 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2839 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
SetFilenameEvent{ BuildFilename(ModuleData,
"_WFPLE").string() });
2840 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StartEvent{});
2842 return StateType::PLEAcquisitionWaiting;
2847 return StateType::AutoMeasureLocalizationFinished;
2852 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2853 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2856 std::stringstream CSVData;
2857 CSVData = ModuleData->AssembleCSVHeader(
false,
false,
true);
2858 CSVData <<
"ID;X(px);Y(px);State\n";
2860 auto& Positions = ModuleData->GetLocalizedPositions();
2861 for (
const auto& Position : Positions)
2862 CSVData << Position.first <<
";" << Position.second.Position.x() <<
";" << Position.second.Position.y() <<
";"
2863 << WidefieldMicroscopeData::GetLocalizedEmitterStateString(Position.second.State) <<
"\n";
2865 if (!
Util::SaveToFile(QString::fromUtf16(BuildFilename(ModuleData,
"_Emitters.csv").u16string().c_str()), CSVData.str()))
2868 if (ModuleData->GetAutoMeasureCurrentEmitter() == ModuleData->GetLocalizedPositions().cend())
2870 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2871 ModuleData->SetPumpLightTurnedOn(
false);
2873 ModuleData->SetAutoMeasureRunning(
false);
2875 return StateType::AutoMeasureCharacterizationFinished;
2878 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2879 ModuleData->SetLEDLightTurnedOn(
false);
2880 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2881 ModuleData->SetPumpLightTurnedOn(
true);
2883 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Characterizing;
2884 ModuleData->SetLocalizedPositionsStateChanged();
2885 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2886 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2888 ModuleData->ResetAutoMeasureCurrentOptimizationAttempt();
2890 return StateType::AutoMeasureCharacterizationGotoEmitter;
2895 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2896 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2898 if (IsSampleMoving(ModuleData))
2899 return StateType::AutoMeasureCharacterizationGotoEmitter;
2901 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2902 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2904 ModuleData->ResetAutoMeasureCurrentOptimizationRerun();
2905 InitializeConfocalOptimizer(ModuleData);
2907 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationOptimizationContext : &AutoMeasureCharacterizationOptimizationContext);
2908 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2910 SetHBTSwitch(ModuleParams, ModuleData,
true);
2912 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2914 return StateType::Waiting;
2917 return StateType::ConfocalOptimizationInit;
2920 return StateType::AutoMeasureCharacterizationOptimizationFinished;
2925 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2926 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2928 const auto EmitterDestiny = CalcMarkerToConfocalSpotDestiny(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2929 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2931 if (ModuleData->GetLastCountRate() >= ModuleData->GetAutoMeasureCountRateThreshold() &&
2932 EmitterDestiny.DistTo(ModuleData->GetSamplePosition()) <= ModuleData->GetAutoMeasureOptimizationMaxDistance())
2935 if (ModuleData->GetAutoMeasureSpectrumEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
2937 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationSpectrumContext : &AutoMeasureCharacterizationSpectrumContext);
2938 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2940 SetHBTSwitch(ModuleParams, ModuleData,
false);
2942 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2944 return StateType::Waiting;
2947 return StateType::AutoMeasureCharacterizationSpectrumBegin;
2950 return StateType::AutoMeasureCharacterizationSpectrumFinished;
2953 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2954 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2956 if (ModuleData->IncrementAutoMeasureCurrentOptimizationRerun() >= ModuleData->GetAutoMeasureMaxOptimizationReruns())
2958 if (ModuleData->IncrementAutoMeasureCurrentOptimizationAttempt() <= ModuleData->GetAutoMeasureNumOptimizationAttempts())
2960 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2961 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2963 return StateType::AutoMeasureCharacterizationGotoEmitter;
2968 InitializeConfocalOptimizer(ModuleData);
2970 return StateType::ConfocalOptimizationInit;
2974 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Failed;
2975 ModuleData->SetLocalizedPositionsStateChanged();
2977 ModuleData->IncrementAutoMeasureCurrentEmitter();
2978 return StateType::AutoMeasureCharacterizationStep;
2983 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2985 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
SetFilenameEvent{
2986 BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_Spectrum").string() });
2987 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
TriggerEvent{});
2989 return StateType::SpectrumAcquisitionWaiting;
2994 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2995 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2997 if (ModuleData->GetAutoMeasureConfocalPLEEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator))
2999 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationPLEContext : &AutoMeasureCharacterizationPLEContext);
3000 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
3002 SetHBTSwitch(ModuleParams, ModuleData,
true);
3004 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
3006 return StateType::Waiting;
3009 return StateType::AutoMeasureCharacterizationPLEBegin;
3012 return StateType::AutoMeasureCharacterizationPLEFinished;
3017 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3020 BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_PLE").string() });
3021 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StartEvent{});
3023 return StateType::PLEAcquisitionWaiting;
3028 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
3029 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3031 if (ModuleData->GetAutoMeasureHBTEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
3033 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationHBTContext : &AutoMeasureCharacterizationHBTContext);
3034 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
3036 SetHBTSwitch(ModuleParams, ModuleData,
true);
3038 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
3040 return StateType::Waiting;
3043 return StateType::AutoMeasureCharacterizationHBTBegin;
3046 return StateType::AutoMeasureCharacterizationHBTFinished;
3051 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3053 InitializeHBT(ModuleData);
3055 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
3060 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3061 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
3065 if (SPD1Data->GetNumEnqueuedTasks() < 10)
3066 ModuleData->GetSPD1()->ReadData();
3068 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
3070 if (HBTIntegrationTimeBeforeReset <= std::chrono::milliseconds(10) || ModuleData->GetHBTTotalIntegrationTime() < HBTIntegrationTimeBeforeReset)
3071 return StateType::HBTAcquiring;
3073 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
3078 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3080 if (ModuleData->GetAutoMeasureHBTEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
3082 auto Filename = BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_g2.csv");
3083 std::stringstream CSVData;
3085 CSVData = ModuleData->AssembleCSVHeader(
false,
true,
false);
3086 ModuleData->WriteHBTResults(CSVData);
3088 if (!
Util::SaveToFile(QString::fromUtf16(Filename.u16string().c_str()), CSVData.str()))
3092 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Finished;
3093 ModuleData->SetLocalizedPositionsStateChanged();
3095 ModuleData->IncrementAutoMeasureCurrentEmitter();
3096 return StateType::AutoMeasureCharacterizationStep;
3101 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3103 if (IsSampleMoving(ModuleData))
3104 return StateType::AutoMeasureSampleStep;
3107 return StartAutofocus(ModuleData);
3112 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3114 return InitiateReadCellIDFromImage(ModuleData);
3119 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3123 if (!ModuleData->GetCellID().Valid)
3125 ModuleData->SetCellIDToLastCellID();
3126 ModuleData->IncrementCellID();
3128 Util::EventLog().
Log(
"[WidefieldMicroscope] Reading a cell ID failed. Estimating it to " +
3135 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) < ModuleData->GetAutoMeasureCellRangeFrom().x() ||
3136 Util::NumToT<int>(ModuleData->GetCellID().Y_id) < ModuleData->GetAutoMeasureCellRangeFrom().y() ||
3137 Util::NumToT<int>(ModuleData->GetCellID().X_id) > ModuleData->GetAutoMeasureCellRangeTo().x() ||
3138 Util::NumToT<int>(ModuleData->GetCellID().Y_id) > ModuleData->GetAutoMeasureCellRangeTo().y())
3140 ModuleData->SetUIMessage(
"The current cell's ID is outside the specified cell range. Probably moved in wrong direction? Characterizing the sample cannot continue.");
3142 return ResetState(ModuleData);
3145 if (ModuleData->GetLastCellID().Valid &&
3146 ((!ModuleData->GetAutoMeasureSampleRotated() && ModuleData->GetLastCellID() >= ModuleData->GetCellID()) ||
3147 (ModuleData->GetAutoMeasureSampleRotated() && ModuleData->GetLastCellID().SwapCoords() >= ModuleData->GetCellID().SwapCoords())))
3149 ModuleData->SetUIMessage(
"The current cell's ID is not larger than the previous cell's ID. Probably moved in wrong direction? Characterizing the sample cannot continue.");
3151 return ResetState(ModuleData);
3154 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3155 return StartAutoMeasureLocalization(ModuleData);
3157 return InitiateLocalizationFromImage(ModuleData);
3162 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3165 if (ModuleData->GetLocalizedPositions().empty())
3170 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
3172 return StateType::AutoMeasureSampleAdvanceCell;
3175 return StartAutoMeasureLocalization(ModuleData);
3180 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3182 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
3185 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3186 return InitiateLocalizationFromImage(ModuleData);
3188 return StateType::WidefieldLocalizationFinished;
3193 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3195 return StartAutoMeasureCharacterization(ModuleData);
3210 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3212 if (ModuleData->GetWidefieldPosition().IsEmpty())
3214 ModuleData->SetUIMessage(
"The current widefield image's position is invalid. Characterizing the sample cannot continue.");
3216 return ResetState(ModuleData);
3220 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x() &&
3221 Util::NumToT<int>(ModuleData->GetCellID().Y_id) == ModuleData->GetAutoMeasureCellRangeTo().y())
3222 return StateType::AutoMeasureSampleFinished;
3225 if ((!ModuleData->GetAutoMeasureSampleRotated() && Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x()) ||
3226 (ModuleData->GetAutoMeasureSampleRotated() && Util::NumToT<int>(ModuleData->GetCellID().Y_id) == ModuleData->GetAutoMeasureCellRangeTo().y()))
3228 ModuleData->GetWidefieldPosition().x - Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()) *
3229 ((ModuleData->GetAutoMeasureSampleRotated() ? ModuleData->GetAutoMeasureCellColumnLength() : ModuleData->GetAutoMeasureCellLineLength()) - 1),
3230 ModuleData->GetWidefieldPosition().y + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().y())
3234 ModuleData->GetWidefieldPosition().x + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()),
3235 ModuleData->GetWidefieldPosition().y
3238 return StartAutoMeasureSampleCharacterization(ModuleData);
Implementation of a module to control a combined widefield and confocal microscope.
Implements a circular data stream based on Util::circularbuf using samples of type BasicSample.
virtual size_t GetNumSamplesWritten() const noexcept override
Determines the number of samples which have been written to the stream in total. Before overflowing,...
This event tells the receiver where to store e.g. acquired data.
This event is intended to make the receiver prepare an action (like a measurement) that is started wh...
This event is intended to make the receiver stop an action (like a measurement).
This event is intended to make the receiver start an action (like a measurement) after it received a ...
bool AutoMeasureHBTEnabled
bool IsCellRangeValid() const noexcept
int AutoMeasureMaxOptimizationReruns
bool LocalizedPositionsChanged
LocalizedPositionsMapType LocalizedPositions
bool AutoMeasureSpectrumEnabled
int AutoMeasureNumOptimizationAttempts
PositionPoint SampleHomePosition
Location set by the user as a home position in nm.
double FocusCurrentVoltage
bool LocalizedPositionsStateChanged
std::chrono::microseconds HBTTotalIntegrationTime
std::chrono::seconds AutoMeasureInitialImageSetWaitTime
void ClearLocalizedPositions()
void ClearConfocalScanSurfacePlotRows()
bool AutoMeasureConfocalPLEEnabled
size_t GetNumFailedLocalizedPositions() const
DynExpInstr::WidefieldLocalizationCellIDType LastCellID
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > LEDSwitch
static QColor GetLocalizedEmitterColor(LocalizedEmitterStateType State)
CameraTimeType MinCameraExposureTime
CameraTimeType WidefieldCameraExposureTime
CameraTimeType MaxCameraExposureTime
std::filesystem::path AutoMeasureSavePath
double WidefieldPumpPower
void WriteConfocalScanResults(std::stringstream &Stream) const
bool AutoMeasureSampleRotated
QPoint AutoMeasureCellRangeTo
Util::picoseconds HBTBinWidth
bool AutoMeasureWidefieldPLEEnabled
WidefieldMicroscopeWidget::LocalizationType AutoMeasureLocalizationType
PositionPoint WidefieldPosition
Location where the current widefield image has been taken in nm.
LocalizedPositionsMapType::iterator AutoMeasureCurrentEmitter
Iterator to the emitter being characterized.
int AutoMeasureCountRateThreshold
QList< QPointF > HBTDataPoints
DynExpInstr::WidefieldLocalizationCellIDType CurrentCellID
std::chrono::microseconds HBTMaxIntegrationTime
LocalizedEmitterStateType
Util::FeatureTester< FeatureType > Features
bool SetAutoMeasureFirstEmitter(Util::MarkerGraphicsView::MarkerType::IDType FirstEmitterID) noexcept
Returns true in case of success, false otherwise.
double ConfocalOptimizationInitZStepSize
@ SpectrumInterModuleCommunicator
@ ImageInterModuleCommunicator
void ClearConfocalScanResults()
long long HBTNumEventCounts
LocalizedPositionsMapType::iterator AutoMeasureFirstEmitter
Iterator to the first emitter to be characterized.
auto & GetConfocalScanResults() noexcept
double ConfocalOptimizationTolerance
PositionPoint GetSamplePosition() const
Returns current sample position.
QPointF HBTDataPointsMinValues
int AutoMeasureCurrentOptimizationAttempt
int AutoMeasureCurrentOptimizationRerun
int ConfocalScanDistPerPixel
bool AutoMeasureOptimizeEnabled
QPoint ConfocalSpotImagePosition
Location of confocal spot in units of px within widefield image.
DynExpInstr::CameraData::TimeType CameraTimeType
void ResetAutoMeasureCurrentEmitter() noexcept
void SetPumpLightTurnedOn(bool State)
double ConfocalOptimizationInitXYStepSize
DynExpInstr::PositionerStageData::PositionType PositionType
auto & GetHBTDataPoints() noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > PumpSwitch
auto & GetSampleStageX() noexcept
QPointF HBTDataPointsMaxValues
int GetAutoMeasureCurrentCellIndex() const
auto & GetSampleStageY() noexcept
size_t GetNumFinishedLocalizedPositions() const
double FocusConfocalOffsetVoltage
PositionPoint AutoMeasureCurrentCellPosition
Center position of the current cell in nm where an automated measurement takes place.
int GetAutoMeasureCellColumnLength() const noexcept
int GetAutoMeasureCellCount() const noexcept
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
QPoint AutoMeasureCellRangeFrom
void WriteHBTResults(std::stringstream &Stream) const
void SetLocalizedPositions(LocalizedPositionsMapType &&Positions)
static const char * GetLocalizedEmitterStateString(LocalizedEmitterStateType State)
std::map< Util::MarkerGraphicsView::MarkerType::IDType, LocalizedEmitterType > LocalizedPositionsMapType
void AppendLocalizedPosition(LocalizedPositionsMapType::value_type &&Position)
SPDTimeType SPDExposureTime
PositionPoint HBTSamplePosition
Location in nm where the HBT measurement has been started.
CameraTimeType LEDCameraExposureTime
void SetLEDLightTurnedOn(bool State)
int AutoMeasureCurrentImageSet
Index of the image set being recorded if auto-measure localization is running, -1 otherwise.
bool TestFeature(const std::array< FeatureType, N > &Flags) const
int GetAutoMeasureCellLineLength() const noexcept
QPoint AutoMeasureCellSkip
std::stringstream AssembleCSVHeader(bool IncludeConfocalScan, bool IncludeHBT, bool IncludeAutoMeasure) const
std::filesystem::path GetAutoMeasureSavePath() const
int AutoMeasureOptimizationMaxDistance
int AutoMeasureImagePositionScatterRadius
int AutoMeasureNumberImageSets
void OnCaptureWidefieldImage(DynExp::ModuleInstance *Instance, bool) const
void OnConfocalSPDExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationContext
void OnAutofocus(DynExp::ModuleInstance *Instance, bool) const
void OnToggleAutoMeasureWidefieldPLEEnabled(DynExp::ModuleInstance *Instance, bool State) const
void OnOptimizePositions(DynExp::ModuleInstance *Instance, bool) const
void OnAutoMeasureCellRangeFromXChanged(DynExp::ModuleInstance *Instance, int Value) const
std::chrono::microseconds HBTIntegrationTimeBeforeReset
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleContext
void OnRunCharacterizationFromID(DynExp::ModuleInstance *Instance, Util::MarkerGraphicsView::MarkerType::IDType ID) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleLocalizationContext
void OnHBTBinWidthChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnGoToHomePosition(DynExp::ModuleInstance *Instance, bool) const
void OnAutoMeasureMaxOptimizationRerunsChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnConfocalConfocalWidthChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType InitiateReadCellIDFromImage(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void MoveSampleTo(const ModuleDataType::PositionPoint &Point, Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
static ModuleDataType::PositionPoint PositionPointFromPixelDist(Util::SynchronizedPointer< const ParamsType > &ModuleParams, Util::SynchronizedPointer< ModuleDataType > &ModuleData, const PosT x, const PosT y)
std::unique_ptr< DynExp::QModuleWidget > MakeUIWidget() override final
Used by InitUI() as a factory function for the module's user interface widget. Create the widget here...
bool IsCharacterizingSample() const noexcept
Returns true if an entire sample (multiple cells) are processed, false if only a single cell is proce...
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleRecenterCellContext
void OnConfocalConfocalDistPerPixelChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnAutoMeasureNumberImageSetsChanged(DynExp::ModuleInstance *Instance, int Value) const
const std::shared_ptr< AtomicWidefieldImageProcessingStateType > WidefieldCellIDState
void OnAutoMeasureCountRateThresholdChanged(DynExp::ModuleInstance *Instance, int Value) const
bool IsReadyState() const noexcept
void OnWidefieldLEDExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnGeneralConfocalPowerChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnAutoMeasureOptimizationMaxDistanceChanged(DynExp::ModuleInstance *Instance, int Value) const
WidefieldMicroscope(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateY
void OnConfocalOptimizationInitZStepSizeChanged(DynExp::ModuleInstance *Instance, double Value) const
ModuleDataType::PositionPoint CalcMarkerToConfocalSpotDestiny(Util::SynchronizedPointer< const ParamsType > &ModuleParams, Util::SynchronizedPointer< ModuleDataType > &ModuleData, QPoint MarkerPos, QPointF SamplePos) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationPLEContext
void OnConfocalOptimizationInitXYStepSizeChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnGeneralFocusConfocalOffsetVoltageChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnGoToSamplePos(DynExp::ModuleInstance *Instance, QPointF SamplePos) const
void OnAutoMeasureCellRangeToXChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnResetCellID(DynExp::ModuleInstance *Instance, bool) const
const std::shared_ptr< AtomicWidefieldImageProcessingStateType > WidefieldLocalizationState
void OnSaveCurrentImage(DynExp::ModuleInstance *Instance, QString Filename) const
void OnAutoMeasureImagePositionScatterRadius(DynExp::ModuleInstance *Instance, int Value) const
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
void OnCaptureLEDImage(DynExp::ModuleInstance *Instance, bool) const
void OnConfocalConfocalHeightChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnAutoMeasureSavePathChanged(DynExp::ModuleInstance *Instance, QString Path) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationHBTContext
gsl_multimin_fminimizer *const GSLConfocalOptimizationState
void OnWidefieldLocalizeEmitters(DynExp::ModuleInstance *Instance, bool) const
std::atomic< size_t > ConfocalOptimizationNumStepsPerformed
void OnConfocalOptimizationToleranceChanged(DynExp::ModuleInstance *Instance, double Value) const
bool TurnOnPumpSourceAfterTransitioning
void OnHHBTMaxIntegrationTimeChanged(DynExp::ModuleInstance *Instance, double Value) const
QSurfaceDataArray CalculateConfocalScanPositions(const int Width, const int Height, const int DistPerPixel, const WidefieldMicroscopeData::PositionPoint CenterPosition) const
Util::DynExpErrorCodes::DynExpErrorCodes ModuleMainLoop(DynExp::ModuleInstance &Instance) override final
Module main loop. The function is executed periodically by the module thread. Also refer to GetMainLo...
void OnPerformConfocalScan(DynExp::ModuleInstance *Instance, bool) const
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateX
bool ImageCapturingPaused
void OnTogglePumpLightSource(DynExp::ModuleInstance *Instance, bool State) const
void OnWidefieldApplyPumpExposureTime(DynExp::ModuleInstance *Instance, bool) const
void RecordImage(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void ConfocalSurfaceSelectedPointChanged(DynExp::ModuleInstance *Instance, QPoint Position) const
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateZ
void OnWidefieldApplyLEDExposureTime(DynExp::ModuleInstance *Instance, bool) const
bool IsSampleMoving(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
Checks whether the sample is moving in x- or y-direction. The z-direction is ignored currently since ...
void OnAutoMeasureInitialImageSetWaitTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnToggleHBTMirror(DynExp::ModuleInstance *Instance, bool Checked) const
void OnAutoMeasureRunLocalization(DynExp::ModuleInstance *Instance, bool) const
std::atomic< PositionerStateType > AtomicPositionerStateType
void OnHBTBinCountChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnGeneralFocusZeroVoltageChanged(DynExp::ModuleInstance *Instance, double Value) const
Util::StateMachine< StateMachineStateType > StateMachine
void OnToggleAutoMeasureOptimizeEnabled(DynExp::ModuleInstance *Instance, bool State) const
void OnAutoMeasureLocalizationTypeChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnWidefieldReadCellID(DynExp::ModuleInstance *Instance, bool) const
StateType ResetState(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
Aborts a measurement or experimental sequence and continues with the ready state.
void RegisterConfocalGraphEvents(DynExpQuick::DynExpSurfaceGraphBackend *ConfocalGraph)
void OnSetupModeChanged(DynExp::ModuleInstance *Instance, QAction *Action) const
void OnAutoMeasureCellSkipYChanged(DynExp::ModuleInstance *Instance, int Value) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationSpectrumContext
void OnTerminate(DynExp::ModuleInstance *Instance, bool) const
void OnAutoMeasureRunCharacterization(DynExp::ModuleInstance *Instance, bool) const
void OnWidefieldAnalyzeImageDistortion(DynExp::ModuleInstance *Instance, bool) const
void OnSetHomePosition(DynExp::ModuleInstance *Instance, bool) const
void UpdatePumpPower(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnToggleAutoMeasureSampleRotated(DynExp::ModuleInstance *Instance, Qt::CheckState State) const
virtual ~WidefieldMicroscope()
void OnAutoMeasureCellRangeToYChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType StartAutoMeasureCharacterization(Util::SynchronizedPointer< ModuleDataType > &ModuleData, Util::MarkerGraphicsView::MarkerType::IDType FirstEmitterID=-1) const
std::atomic< WidefieldImageProcessingStateType > AtomicWidefieldImageProcessingStateType
void OnMeasureHBT(DynExp::ModuleInstance *Instance, bool) const
void OnToggleAutoMeasureHBTEnabled(DynExp::ModuleInstance *Instance, bool State) const
void ResetImpl(dispatch_tag< QModuleBase >) override final
std::list< WidefieldMicroscopeData::PositionPoint > ConfocalScanPositions
void OnGeneralSetZeroFocus(DynExp::ModuleInstance *Instance, bool) const
void OnWidefieldPumpExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
size_t NumFailedUpdateAttempts
void OnGeneralWidefieldPowerChanged(DynExp::ModuleInstance *Instance, double Value) const
gsl_vector *const GSLConfocalOptimizationStepSize
void OnAutoMeasureCellRangeFromYChanged(DynExp::ModuleInstance *Instance, int Value) const
void PrepareImageRecording(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnToggleLEDLightSource(DynExp::ModuleInstance *Instance, bool State) const
void OnStopAction(DynExp::ModuleInstance *Instance, bool) const
void OnBringMarkerToConfocalSpot(DynExp::ModuleInstance *Instance, QPoint MarkerPos, QPointF SamplePos) const
std::chrono::milliseconds GetMainLoopDelay() const override final
Specifies in which time intervals the module's event queue runs to handle pending events.
void OnWidefieldImageClicked(DynExp::ModuleInstance *Instance, QPoint Position) const
void OnToggleAutoMeasureConfocalPLEEnabled(DynExp::ModuleInstance *Instance, bool State) const
void OnAutoMeasureNumOptimizationAttemptsChanged(DynExp::ModuleInstance *Instance, int Value) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationOptimizationContext
std::atomic_bool ConfocalOptimizationPromisesRenewed
void OnGeneralApplyZeroFocus(DynExp::ModuleInstance *Instance, bool) const
gsl_multimin_function GSLConfocalOptimizationFuncDesc
void BringMarkerToConfocalSpot(Util::SynchronizedPointer< const ParamsType > &ModuleParams, Util::SynchronizedPointer< ModuleDataType > &ModuleData, QPoint MarkerPos, QPointF SamplePos) const
void OnAutoMeasureCellSkipXChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnAutoMeasureRunSampleCharacterization(DynExp::ModuleInstance *Instance, bool) const
void OnGeneralFocusCurrentVoltageChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnWidefieldFindConfocalSpot(DynExp::ModuleInstance *Instance, bool) const
ConfocalOptimizationThreadReturnType
gsl_vector *const GSLConfocalOptimizationInitialPoint
void OnToggleAutoMeasureSpectrumEnabled(DynExp::ModuleInstance *Instance, bool State) const
void selectedPointChanged(QPoint)
Wrapper holding a pointer to an exception and providing functionality for accessing it....
void ClearError()
Removes the stored exception. If this method is called by a task's CallbackFunc in case of an excepti...
static void Register(const ModuleBase &Listener, CallableT EventFunc, ItemIDType CommunicatorID=ItemIDNotSet)
Registers/Subscribes module Listener to the event with the event function EventFunc....
static void Deregister(const ModuleBase &Listener)
Deregisters/unsubscribes module Listener from the event, regardless of the inter-module communicator ...
ModuleDataTypeSyncPtrType GetModuleData(const std::chrono::milliseconds Timeout=GetModuleDataTimeoutDefault)
Locks the mutex of the module data class instance ModuleData assigned to this ModuleBase instance and...
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Refer to ParamsBase::dispatch_tag.
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
void Exit() noexcept
Might be called from anywhere where this ModuleInstance instance is accessible to make the associated...
const ModuleBase::ModuleDataGetterType ModuleDataGetter
Getter for module's data. Refer to ModuleBase::ModuleDataGetterType.
Refer to ParamsBase::dispatch_tag.
QModuleWidget * Widget
User interface widget belonging to the module.
void Connect(SenderType *Sender, SignalType Signal, ReceiverType *Receiver, EventType Event)
Uses Qt's connect mechanism to connect a QObject's signal to a DynExp module's event....
void SetFocus() noexcept
Focuses/activates Widget and moves it on top of other windows if possible. Does nothing if any of Wid...
const Object::ParamsGetterType ParamsGetter
Invoke to obtain the parameters (derived from ParamsBase) of Owner.
void UnlockObject(LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer)
Unlocks an Object instance stored in the LinkedObjectWrapperContainer ObjectWrapperContainer....
void LockObject(const ParamsBase::Param< ObjectLink< ObjectT > > &LinkParam, LinkedObjectWrapperContainer< ObjectT > &ObjectWrapperContainer, std::chrono::milliseconds Timeout=ObjectLinkBase::LockObjectTimeoutDefault)
Locks an Object instance referenced by a parameter LinkParam of type ParamsBase::Param< ObjectLink< O...
const auto & GetOwner() const noexcept
Returns Owner.
std::function< void(const TaskBase *, ExceptionContainer &)> FuncType
Type of the owned callback function. The function receives a pointer to the task the CallbackType ins...
Base class for all tasks being processed by instruments. The class must not contain public virtual fu...
void Log(const std::string &Message, const ErrorType Type=ErrorType::Info, const size_t Line=0, const std::string &Function="", const std::string &File="", const int ErrorCode=0, const std::stacktrace &Trace={}) noexcept
Logs an event from information specified manually.
Data to operate on is invalid for a specific purpose. This indicates a corrupted data structure or fu...
void mouseClickEvent(QPoint Position)
Thrown when some operation or feature is temporarily or permanently not available.
Denotes that e.g. a remote gRPC service failed.
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
auto get() const noexcept
Returns the managed (locked) object.
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
@ WaitingForWidefieldCellID
WidefieldMicroscopeData::PositionPoint operator-(const WidefieldMicroscopeData::PositionPoint &lhs, const WidefieldMicroscopeData::PositionPoint &rhs)
WidefieldMicroscopeData::PositionPoint operator+(const WidefieldMicroscopeData::PositionPoint &lhs, const WidefieldMicroscopeData::PositionPoint &rhs)
const QColor blue(42, 130, 218)
std::unique_ptr< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
DynExpErrorCodes
DynExp's error codes
std::string ToStr(const T &Value, int Precision=-1)
Converts a (numeric) value of type T to a std::string using operator<< of std::stringstream.
bool SaveToFile(const QString &Filename, std::string_view Text)
Saves a std::string_view to a file (using QFile). Creates a new file or truncates an existing file's ...
EventLogger & EventLog()
This function holds a static EventLogger instance and returns a reference to it. DynExp uses only one...
std::chrono::duration< double, std::pico > picoseconds
Extends std::chrono by a duration data type for picoseconds.
Accumulates include statements to provide a precompiled header.
double DistTo(const PositionPoint &Other) const
std::string ToStr(std::string_view Prefix="") const
constexpr void Reset() noexcept
constexpr void Reset() noexcept