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);
606 static constexpr const char* SaveErrorMsg =
"[WidefieldMicroscope] Saving an image failed.";
614 if (!Image.save(Filename))
634 { Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()) },
641 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
664 if (
ModuleData->GetPumpPowerIndicator()->CanRead())
706 auto Widget = std::make_unique<WidefieldMicroscopeWidget>(*
this);
776 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(
Widget->GetUI()->SBConfocalSPDExposureTime->value()));
783 auto Widget = GetWidget<WidefieldMicroscopeWidget>();
784 std::string UIMessage;
787 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(ModuleDataGetter());
805 if (!UIMessage.empty())
806 QMessageBox::warning(
Widget,
"Widefield Microscope", UIMessage.data());
819 ModuleData->ResetAutoMeasureCurrentImageSet();
855 ModuleData->GetSampleStageX()->MoveAbsolute(Point.
x /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
857 *PositionerState = PositionerStateType::Moving;
865 ModuleData->GetSampleStageY()->MoveAbsolute(Point.
y /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
867 *PositionerState = PositionerStateType::Moving;
875 ModuleData->GetSampleStageZ()->MoveAbsolute(Point.
z /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
877 *PositionerState = PositionerStateType::Moving;
896 auto SampleStageXData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageX()->GetInstrumentData());
897 auto SampleStageYData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageY()->GetInstrumentData());
898 bool IsMoving = !SampleStageXData->HasArrived() || !SampleStageYData->HasArrived();
915 std::min(
ModuleData->GetMaxFocusVoltage(), Voltage +
921 QPoint MarkerPos, QPointF SamplePos)
const
923 const auto DiffPosInPx =
ModuleData->GetConfocalSpotImagePosition() - MarkerPos;
924 const WidefieldMicroscopeData::PositionPoint SamplePosPoint(Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()));
930 QPoint MarkerPos, QPointF SamplePos)
const
941 for (
int i = 1; i <= Height; ++i)
943 auto y = CenterPosition.
y + (-
static_cast<double>(Height) / 2 + i) * DistPerPixel;
944 auto Row = std::make_unique<QSurfaceDataRow>(Width);
946 for (
auto j = Width; j > 0; --j)
952 x = CenterPosition.
x + (-
static_cast<double>(Width) / 2 + j) * DistPerPixel;
954 x = CenterPosition.
x + (
static_cast<double>(Width) / 2 - j + 1) * DistPerPixel;
956 auto ColIndex = i % 2 ? j - 1 : Width - j;
957 (*Row)[ColIndex].setPosition(QVector3D(std::round(x), 0, std::round(y)));
963 QSurfaceDataRows.push_back(std::move(Row));
966 return QSurfaceDataRows;
986 ModuleData->GetWidefieldCamera()->StopCapturingSync();
989 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(
ModuleData->GetWidefieldCamera()->GetInstrumentData());
990 CameraData->ClearImage();
996 ModuleData->GetWidefieldCamera()->CaptureSingle();
1033 if (ModuleData->GetCurrentImage().isNull())
1034 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Failed;
1044 *LocalizerState = WidefieldImageProcessingStateType::Failed;
1045 Exception.ClearError();
1053 *LocalizerState = WidefieldImageProcessingStateType::Finished;
1056 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Waiting;
1058 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
1061 ModuleData->GetWidefieldLocalizer()->RecallPositions(ModuleData->GetCurrentImage(),
1065 return StateType::WaitingForWidefieldLocalization;
1070 ModuleData->GetSPD1()->SetStreamSize(1);
1071 ModuleData->GetSPD1()->SetExposureTime(ModuleData->GetSPDExposureTime());
1072 ModuleData->GetSPD1()->SetCoincidenceWindow(ModuleData->GetSPD1()->GetResolution());
1074 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1076 ModuleData->GetSPD2()->SetStreamSize(1);
1077 ModuleData->GetSPD2()->SetExposureTime(ModuleData->GetSPDExposureTime());
1078 ModuleData->GetSPD2()->SetCoincidenceWindow(ModuleData->GetSPD2()->GetResolution());
1084 ConfocalOptimizationNumStepsPerformed = 0;
1086 PrepareAPDsForConfocalMode(ModuleData);
1087 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1088 auto SamplePosition = ModuleData->GetSamplePosition();
1090 gsl_vector_set(GSLConfocalOptimizationStepSize, 0,
1091 ModuleData->GetSampleStageX()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1092 gsl_vector_set(GSLConfocalOptimizationStepSize, 1,
1093 ModuleData->GetSampleStageY()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1094 gsl_vector_set(GSLConfocalOptimizationStepSize, 2,
1095 ModuleData->GetSampleFocusPiezoZ()->GetHardwareResolution() * ModuleData->GetConfocalOptimizationInitZStepSize());
1096 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 0, SamplePosition.x);
1097 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 1, SamplePosition.y);
1098 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 2, ModuleData->GetFocusZeroVoltage());
1104 ModuleData->GetWidefieldHBTSwitch()->Set(IsHBTMode);
1109 ModuleData->ClearHBTDataPoints();
1110 ModuleData->SetHBTSamplePosition(ModuleData->GetSamplePosition());
1112 auto TimeTagger = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1113 TimeTagger->SetHBTActive(
true);
1114 TimeTagger->ConfigureHBT(ModuleData->GetHBTBinWidth(), ModuleData->GetHBTBinCount());
1115 TimeTagger->ResetHBT();
1116 HBTIntegrationTimeBeforeReset = ModuleData->GetHBTTotalIntegrationTime();
1121 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1123 auto SPD1 = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1124 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(SPD1->GetInstrumentData());
1125 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
1126 SPD1->SetHBTActive(
false);
1127 SPD1Data->ResetStreamMode();
1128 SPD2Data->ResetStreamMode();
1134 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1136 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1138 if (!IsCharacterizingSample())
1139 StateMachine.SetContext(&AutofocusSetupTransitioningContext);
1141 return StateType::SetupTransitionBegin;
1144 return StateType::AutofocusBegin;
1149 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
1152 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1153 ModuleData->ResetAutoMeasureCurrentImageSet();
1154 WaitingEndTimePoint = std::chrono::system_clock::now() + ModuleData->GetAutoMeasureInitialImageSetWaitTime();
1156 LogUIMessagesOnly =
true;
1158 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleLocalizationContext : &AutoMeasureLocalizationContext);
1159 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1161 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1163 return StateType::SetupTransitionBegin;
1166 return StateType::Waiting;
1171 if (FirstEmitterID < 0)
1172 ModuleData->ResetAutoMeasureCurrentEmitter();
1175 bool Success = ModuleData->SetAutoMeasureFirstEmitter(FirstEmitterID);
1177 return ResetState(ModuleData);
1180 std::ranges::for_each(ModuleData->GetLocalizedPositions(), [](
auto& Item) { Item.second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet; });
1181 ModuleData->SetLocalizedPositionsStateChanged();
1182 ModuleData->SetAutoMeasureRunning(
true);
1183 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1185 LogUIMessagesOnly =
true;
1187 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationContext : &AutoMeasureCharacterizationContext);
1188 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1190 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1192 return StateType::SetupTransitionBegin;
1195 return StateType::AutoMeasureCharacterizationStep;
1200 LogUIMessagesOnly =
true;
1202 StateMachine.SetContext(&AutoMeasureSampleContext);
1204 return StateType::AutoMeasureSampleStep;
1209 auto SavePath = ModuleData->GetAutoMeasureSavePath();
1210 SavePath.replace_filename(SavePath.filename().stem().concat(FilenameSuffix));
1211 std::filesystem::create_directories(SavePath.parent_path());
1218 static std::random_device random_devce;
1219 static std::mt19937 random_generator(random_devce());
1220 static std::uniform_real_distribution<double> angle_random_distribution(0., 2. * std::numbers::pi);
1221 std::uniform_real_distribution<double> radius_random_distribution(0., Radius);
1223 const auto angle = angle_random_distribution(random_generator);
1224 const auto r = radius_random_distribution(random_generator);
1225 const auto x = Util::NumToT<ModuleDataType::PositionType>(r * std::cos(angle));
1226 const auto y = Util::NumToT<ModuleDataType::PositionType>(r * std::sin(angle));
1231 void WidefieldMicroscope::ConfocalOptimizationInitPromises()
1233 ConfocalOptimizationStatePromise =
decltype(ConfocalOptimizationStatePromise)();
1234 ConfocalOptimizationStateFuture = ConfocalOptimizationStatePromise.get_future();
1235 ConfocalOptimizationFeedbackPromise =
decltype(ConfocalOptimizationFeedbackPromise)();
1236 ConfocalOptimizationFeedbackFuture = ConfocalOptimizationFeedbackPromise.get_future();
1238 ConfocalOptimizationPromisesRenewed =
true;
1252 return Status ? ConfocalOptimizationThreadReturnType::Failed : ConfocalOptimizationThreadReturnType::NextStep;
1258 return ConfocalOptimizationThreadReturnType::Failed;
1263 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Owner->
GetModuleData());
1265 Status = gsl_multimin_test_size(Size, ModuleData->GetConfocalOptimizationTolerance());
1268 return Status == GSL_SUCCESS ? ConfocalOptimizationThreadReturnType::Finished :
1269 (Status == GSL_CONTINUE ? ConfocalOptimizationThreadReturnType::NextStep : ConfocalOptimizationThreadReturnType::Failed);
1274 return ConfocalOptimizationThreadReturnType::Failed;
1279 double WidefieldMicroscope::ConfocalOptimizationFuncForwarder(
const gsl_vector* vector,
void* params)
1284 double WidefieldMicroscope::ConfocalOptimizationFunc(
const gsl_vector* vector)
noexcept
1289 while (!ConfocalOptimizationPromisesRenewed)
1290 std::this_thread::yield();
1292 auto X =
static_cast<decltype(ConfocalOptimizationStateType::X)
>(gsl_vector_get(vector, 0));
1293 auto Y =
static_cast<decltype(ConfocalOptimizationStateType::Y)
>(gsl_vector_get(vector, 1));
1294 auto Z =
static_cast<decltype(ConfocalOptimizationStateType::Z)
>(gsl_vector_get(vector, 2));
1298 ConfocalOptimizationStatePromise.set_value({ X, Y, Z });
1300 if (!ConfocalOptimizationFeedbackFuture.valid())
1304 return ConfocalOptimizationFeedbackFuture.get();
1314 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1315 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1317 if (ModuleParams->ImageAcqCommunicator.ContainsID())
1319 Instance->
LockObject(ModuleParams->ImageAcqCommunicator, ModuleData->GetImageAcqCommunicator());
1320 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator);
1326 if (ModuleParams->SpectrumAcqCommunicator.ContainsID())
1328 Instance->
LockObject(ModuleParams->SpectrumAcqCommunicator, ModuleData->GetSpectrumAcqCommunicator());
1329 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator);
1331 FinishedEvent::Register(*
this, &WidefieldMicroscope::OnSpectrumFinishedRecording, ModuleData->GetSpectrumAcqCommunicator()->GetID());
1334 if (ModuleParams->PLEAcqCommunicator.ContainsID())
1336 Instance->
LockObject(ModuleParams->PLEAcqCommunicator, ModuleData->GetPLEAcqCommunicator());
1337 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator);
1339 FinishedEvent::Register(*
this, &WidefieldMicroscope::OnPLEAcquisitionFinished, ModuleData->GetPLEAcqCommunicator()->GetID());
1342 if (ModuleParams->WidefieldCamera.ContainsID())
1344 Instance->
LockObject(ModuleParams->WidefieldCamera, ModuleData->GetWidefieldCamera());
1345 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Widefield);
1348 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
1349 ModuleData->SetMinCameraExposureTime(CameraData->GetMinExposureTime());
1350 ModuleData->SetMaxCameraExposureTime(CameraData->GetMaxExposureTime());
1353 if (ModuleParams->WidefieldLocalizer.ContainsID())
1355 Instance->
LockObject(ModuleParams->WidefieldLocalizer, ModuleData->GetWidefieldLocalizer());
1356 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization);
1360 if (ModuleParams->SampleStageX.ContainsID() && ModuleParams->SampleStageY.ContainsID())
1362 Instance->
LockObject(ModuleParams->SampleStageX, ModuleData->GetSampleStageX());
1363 Instance->
LockObject(ModuleParams->SampleStageY, ModuleData->GetSampleStageY());
1365 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning);
1367 if (ModuleParams->SPD1.ContainsID())
1369 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1370 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Confocal);
1374 if (ModuleParams->SampleStageZ.ContainsID())
1376 Instance->
LockObject(ModuleParams->SampleStageZ, ModuleData->GetSampleStageZ());
1377 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleZPositioning);
1380 if (ModuleParams->FocusPiezoZ.ContainsID())
1382 Instance->
LockObject(ModuleParams->FocusPiezoZ, ModuleData->GetSampleFocusPiezoZ());
1384 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator))
1385 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment);
1386 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning))
1387 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization);
1389 ModuleData->SetMinFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMinValue());
1390 ModuleData->SetMaxFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMaxValue());
1393 if (ModuleParams->SPD1.ContainsID() && ModuleParams->SPD2.ContainsID())
1395 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1396 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1397 Instance->
LockObject(ModuleParams->SPD2, ModuleData->GetSPD2());
1399 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBT);
1402 if (ModuleParams->LEDSwitch.ContainsID())
1404 Instance->
LockObject(ModuleParams->LEDSwitch, ModuleData->GetLEDSwitch());
1405 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle);
1407 ModuleData->SetLEDLightTurnedOn(
false);
1410 if (ModuleParams->PumpSwitch.ContainsID())
1412 Instance->
LockObject(ModuleParams->PumpSwitch, ModuleData->GetPumpSwitch());
1413 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle);
1415 ModuleData->SetPumpLightTurnedOn(
false);
1418 if (ModuleParams->PumpPower.ContainsID())
1420 Instance->
LockObject(ModuleParams->PumpPower, ModuleData->GetPumpPower());
1421 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower);
1423 ModuleData->SetMinPumpPower(ModuleData->GetPumpPower()->GetUserMinValue());
1424 ModuleData->SetMaxPumpPower(ModuleData->GetPumpPower()->GetUserMaxValue());
1425 ModuleData->SetWidefieldPumpPower(ModuleParams->DefaultPowerWidefieldMode);
1426 ModuleData->SetConfocalPumpPower(ModuleParams->DefaultPowerConfocalMode);
1429 if (ModuleParams->PumpPowerIndicator.ContainsID())
1431 Instance->
LockObject(ModuleParams->PumpPowerIndicator, ModuleData->GetPumpPowerIndicator());
1432 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::MeasurePumpPower);
1435 if (ModuleParams->WidefieldConfocalSwitch.ContainsID())
1437 Instance->
LockObject(ModuleParams->WidefieldConfocalSwitch, ModuleData->GetWidefieldConfocalSwitch());
1438 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch);
1440 if (ModuleParams->WidefieldConfocalIndicator.ContainsID())
1442 Instance->
LockObject(ModuleParams->WidefieldConfocalIndicator, ModuleData->GetWidefieldConfocalIndicator());
1443 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator);
1445 ModuleData->SetSetupMode(ModuleData->GetWidefieldConfocalIndicator()->GetSync() ? WidefieldMicroscopeData::SetupModeType::Confocal : WidefieldMicroscopeData::SetupModeType::Widefield);
1448 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1451 if (ModuleParams->WidefieldHBTSwitch.ContainsID())
1453 Instance->
LockObject(ModuleParams->WidefieldHBTSwitch, ModuleData->GetWidefieldHBTSwitch());
1454 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch);
1456 MakeAndEnqueueEvent(
this, &WidefieldMicroscope::OnToggleHBTMirror,
false);
1462 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1464 OnStopAction(Instance,
false);
1466 Instance->
UnlockObject(ModuleData->GetImageAcqCommunicator());
1467 Instance->
UnlockObject(ModuleData->GetSpectrumAcqCommunicator());
1468 Instance->
UnlockObject(ModuleData->GetPLEAcqCommunicator());
1472 Instance->
UnlockObject(ModuleData->GetSampleFocusPiezoZ());
1475 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalSwitch());
1476 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalIndicator());
1477 Instance->
UnlockObject(ModuleData->GetWidefieldHBTSwitch());
1479 Instance->
UnlockObject(ModuleData->GetPumpPowerIndicator());
1480 Instance->
UnlockObject(ModuleData->GetWidefieldCamera());
1481 Instance->
UnlockObject(ModuleData->GetWidefieldLocalizer());
1497 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1500 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1502 ModuleData->GetSampleStageX()->StopMotion();
1503 ModuleData->GetSampleStageY()->StopMotion();
1506 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1507 ModuleData->GetWidefieldCamera()->StopCapturing();
1509 StopHBT(ModuleData);
1511 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator) &&
1512 StateMachine.GetCurrentState()->GetState() == StateType::SpectrumAcquisitionWaiting)
1513 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
StopEvent{});
1514 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator) &&
1515 StateMachine.GetCurrentState()->GetState() == StateType::PLEAcquisitionWaiting)
1516 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StopEvent{});
1518 if (ConfocalOptimizationThreadReturnFuture.valid())
1523 ConfocalOptimizationFeedbackPromise =
decltype(ConfocalOptimizationFeedbackPromise)();
1524 ConfocalOptimizationPromisesRenewed =
true;
1529 ConfocalOptimizationThreadReturnFuture.wait();
1532 if (ModuleData->IsAutoMeasureRunning())
1534 if (ModuleData->GetAutoMeasureCurrentEmitter() != ModuleData->GetLocalizedPositions().cend())
1536 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet;
1537 ModuleData->SetLocalizedPositionsStateChanged();
1540 ModuleData->SetAutoMeasureRunning(
false);
1543 StateMachine.SetCurrentState(ResetState(ModuleData));
1548 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1550 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1553 ModuleData->SetSampleHomePosition(ModuleData->GetSamplePosition());
1558 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1560 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1563 MoveSampleTo(ModuleData->GetSampleHomePosition(), ModuleData);
1568 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1570 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1573 ModuleData->SetLEDLightTurnedOn(State);
1578 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1580 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
1583 ModuleData->SetPumpLightTurnedOn(State);
1588 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1590 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1593 if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI()->action_Widefield_mode)
1594 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1595 else if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI()->action_Confocal_mode)
1596 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1600 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1605 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1607 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
1610 StateMachine.SetCurrentState(StartAutofocus(ModuleData));
1615 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1617 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
1618 || ModuleData->GetSetupMode() != WidefieldMicroscopeData::SetupModeType::Confocal)
1621 InitializeConfocalOptimizer(ModuleData);
1624 StateMachine.SetContext(&ConfocalOptimizationContext);
1625 StateMachine.SetCurrentState(StateType::ConfocalOptimizationInit);
1630 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1631 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1633 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
1636 SetHBTSwitch(ModuleParams, ModuleData, Checked);
1641 if (!IsReadyState())
1644 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1645 ModuleData->ResetCellID();
1650 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1651 ModuleData->SetWidefieldPumpPower(Value);
1653 UpdatePumpPower(ModuleData);
1658 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1659 ModuleData->SetConfocalPumpPower(Value);
1661 UpdatePumpPower(ModuleData);
1666 if (!IsReadyState())
1669 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1670 SetFocus(ModuleData, Value);
1675 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1676 ModuleData->SetFocusZeroVoltage(Value);
1681 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1682 ModuleData->SetFocusConfocalOffsetVoltage(Value);
1684 if (IsReadyState() && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
1685 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
1690 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1691 ModuleData->SetFocusZeroVoltage(ModuleData->GetFocusCurrentVoltage());
1696 if (!IsReadyState())
1699 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1700 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1705 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1706 ModuleData->SetLEDCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1711 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1713 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1716 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1717 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetLEDCameraExposureTime());
1722 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1723 ModuleData->SetWidefieldCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1728 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1730 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1733 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1734 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetWidefieldCameraExposureTime());
1739 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1741 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield)
1742 || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1745 StateMachine.SetCurrentState(StateType::FindingConfocalSpotBegin);
1750 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1752 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1755 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1757 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1759 StateMachine.SetContext(&LEDImageAcquisitionSetupTransitioningContext);
1760 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1763 StateMachine.SetCurrentState(StateType::LEDImageAcquisitionBegin);
1768 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1770 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1773 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1775 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1777 StateMachine.SetContext(&WidefieldImageAcquisitionSetupTransitioningContext);
1778 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1781 StateMachine.SetCurrentState(StateType::WidefieldImageAcquisitionBegin);
1786 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1788 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1791 StateMachine.SetCurrentState(InitiateReadCellIDFromImage(ModuleData));
1796 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1798 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization) || ModuleData->GetCurrentImage().isNull())
1801 ModuleData->GetWidefieldLocalizer()->AnalyzeDistortion(ModuleData->GetCurrentImage());
1806 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1808 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1811 StateMachine.SetCurrentState(InitiateLocalizationFromImage(ModuleData));
1816 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1819 if (ModuleData->GetWidefieldPosition().IsEmpty())
1822 OnBringMarkerToConfocalSpot(Instance, Position, {
static_cast<qreal
>(ModuleData->GetWidefieldPosition().x),
static_cast<qreal
>(ModuleData->GetWidefieldPosition().y) });
1827 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1828 ModuleData->SetConfocalScanWidth(Value);
1833 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1834 ModuleData->SetConfocalScanHeight(Value);
1839 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1840 ModuleData->SetConfocalScanDistPerPixel(Value);
1845 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1846 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(Value));
1851 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1852 ModuleData->SetConfocalOptimizationInitXYStepSize(Value);
1857 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1858 ModuleData->SetConfocalOptimizationInitZStepSize(Value);
1863 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1864 ModuleData->SetConfocalOptimizationTolerance(Value);
1869 int Width{}, Height{}, DistPerPixel{};
1872 OnGoToHomePosition(Instance,
false);
1875 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1877 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1880 CenterPosition = ModuleData->GetSamplePosition();
1882 Width = ModuleData->GetConfocalScanWidth();
1883 Height = ModuleData->GetConfocalScanHeight();
1884 DistPerPixel = ModuleData->GetConfocalScanDistPerPixel();
1886 PrepareAPDsForConfocalMode(ModuleData);
1888 ModuleData->ClearConfocalScanResults();
1893 auto SurfaceDataRows = CalculateConfocalScanPositions(Width, Height, DistPerPixel, CenterPosition);
1895 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1896 ModuleData->SetConfocalScanSurfacePlotRows(std::move(SurfaceDataRows));
1898 StateMachine.SetCurrentState(StateType::ConfocalScanStep);
1903 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1905 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1908 const auto& Results = ModuleData->GetConfocalScanResults();
1909 auto ResultItemIt = std::find_if(Results.cbegin(), Results.cend(), [&Position](
const std::pair<WidefieldMicroscopeData::PositionPoint, double>& ResultItem) {
1910 return ResultItem.first.RowIndex == Position.x() && ResultItem.first.ColumnIndex == Position.y();
1913 if (ResultItemIt != Results.cend())
1914 MoveSampleTo({ ResultItemIt->first.MeasuredX, ResultItemIt->first.MeasuredY }, ModuleData);
1919 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1920 ModuleData->SetHBTBinWidth(
Util::picoseconds(
static_cast<Util::picoseconds::rep
>(Value)));
1925 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1926 ModuleData->SetHBTBinCount(Value);
1931 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1932 ModuleData->SetHBTMaxIntegrationTime(std::chrono::microseconds(Util::NumToT<std::chrono::microseconds::rep>(Value * std::chrono::microseconds::period::den)));
1937 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1939 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1942 InitializeHBT(ModuleData);
1944 StateMachine.SetCurrentState(StateType::HBTAcquiring);
1949 ImageCapturingPaused =
true;
1954 static constexpr const char* AutofocusFailedErrorMsg =
"[WidefieldMicroscope] Autofocusing failed!";
1956 if (StateMachine.GetCurrentState()->GetState() != StateType::AutofocusWaiting)
1959 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1960 ModuleData->SetAutofocusFinished();
1964 Voltage -= ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? ModuleData->GetFocusConfocalOffsetVoltage() : .0;
1966 SetFocus(ModuleData, Voltage);
1967 ModuleData->SetFocusZeroVoltage(Voltage);
1971 if (LogUIMessagesOnly)
1975 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1976 ModuleData->SetUIMessage(AutofocusFailedErrorMsg);
1980 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1981 ModuleData->SetLEDLightTurnedOn(
false);
1986 StateMachine.SetCurrentState(StateType::SpectrumAcquisitionFinished);
1991 StateMachine.SetCurrentState(StateType::PLEAcquisitionFinished);
1996 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1997 ModuleData->SetAutoMeasureSavePath(Path.toStdString());
2002 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2003 ModuleData->SetAutoMeasureNumberImageSets(Value);
2008 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2009 ModuleData->SetAutoMeasureInitialImageSetWaitTime(std::chrono::seconds(
static_cast<std::chrono::seconds::rep
>(Value)));
2014 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2015 ModuleData->SetAutoMeasureImagePositionScatterRadius(Value);
2020 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2026 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2027 ModuleData->SetAutoMeasureWidefieldPLEEnabled(State);
2032 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2033 ModuleData->SetAutoMeasureOptimizeEnabled(State);
2038 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2039 ModuleData->SetAutoMeasureSpectrumEnabled(State);
2044 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2045 ModuleData->SetAutoMeasureConfocalPLEEnabled(State);
2050 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2051 ModuleData->SetAutoMeasureHBTEnabled(State);
2056 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2057 ModuleData->SetAutoMeasureNumOptimizationAttempts(Value);
2062 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2063 ModuleData->SetAutoMeasureMaxOptimizationReruns(Value);
2068 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2069 ModuleData->SetAutoMeasureOptimizationMaxDistance(Value);
2074 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2075 ModuleData->SetAutoMeasureCountRateThreshold(Value);
2080 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2081 ModuleData->GetAutoMeasureCellRangeFrom().setX(Value);
2086 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2087 ModuleData->GetAutoMeasureCellRangeFrom().setY(Value);
2092 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2093 ModuleData->GetAutoMeasureCellRangeTo().setX(Value);
2098 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2099 ModuleData->GetAutoMeasureCellRangeTo().setY(Value);
2104 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2105 ModuleData->GetAutoMeasureCellSkip().setX(Value);
2110 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2111 ModuleData->GetAutoMeasureCellSkip().setY(Value);
2116 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2117 ModuleData->SetAutoMeasureSampleRotated(State == Qt::CheckState::Checked);
2122 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2124 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
2127 StateMachine.SetCurrentState(StartAutoMeasureLocalization(ModuleData));
2132 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2134 if (!IsReadyState() || ModuleData->GetLocalizedPositions().empty() || ModuleData->GetWidefieldPosition().IsEmpty())
2137 StateMachine.SetCurrentState(StartAutoMeasureCharacterization(ModuleData));
2142 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2144 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) ||
2145 !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
2148 if (!ModuleData->IsCellRangeValid())
2150 ModuleData->SetUIMessage(
"Please specify a valid cell range.");
2157 ModuleData->ResetCellID();
2159 StateMachine.SetCurrentState(StartAutoMeasureSampleCharacterization(ModuleData));
2164 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2168 return ResetState(ModuleData);
2173 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2175 ResetState(ModuleData);
2177 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
2178 return StateType::SetupTransitionBegin;
2180 return StateType::Ready;
2186 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2187 SetupTransitionFinishedTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldConfocalTransitionTime);
2190 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2192 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Unknown)
2194 ModuleData->SetUIMessage(
"Transitioning failed due to unknown destiny setup mode!");
2196 return ResetState(ModuleData);
2199 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2201 TurnOnPumpSourceAfterTransitioning = ModuleData->GetPumpLightTurnedOn();
2202 ModuleData->SetPumpLightTurnedOn(
false);
2205 TurnOnPumpSourceAfterTransitioning =
false;
2207 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield)
2208 ModuleData->GetWidefieldConfocalSwitch()->Set(
false);
2209 else if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2210 ModuleData->GetWidefieldConfocalSwitch()->Set(
true);
2212 return StateType::SetupTransitioning;
2217 return std::chrono::system_clock::now() >= SetupTransitionFinishedTimePoint ? StateType::SetupTransitionEnd : StateType::SetupTransitioning;
2222 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2224 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator)
2225 && ModuleData->GetWidefieldConfocalIndicator()->GetSync() != (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal))
2227 ModuleData->SetUIMessage(
"Transitioning into " + std::string(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ?
"confocal" :
"widefield") +
" mode failed!");
2228 ModuleData->SetSetupMode(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? WidefieldMicroscopeData::SetupModeType::Widefield : WidefieldMicroscopeData::SetupModeType::Confocal);
2230 return ResetState(ModuleData);
2234 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2236 UpdatePumpPower(ModuleData);
2237 if (TurnOnPumpSourceAfterTransitioning)
2238 ModuleData->SetPumpLightTurnedOn(
true);
2240 return StateType::SetupTransitionFinished;
2245 return StateType::Ready;
2250 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2254 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
2255 return StateType::AutofocusFinished;
2257 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2258 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2260 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2261 ModuleData->SetLEDLightTurnedOn(
true);
2262 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2263 ModuleData->SetPumpLightTurnedOn(
false);
2265 ModuleData->ResetAutofocusFinished();
2268 return StateType::AutofocusWaiting;
2273 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2277 if (StateMachine.GetContext() == &AutoMeasureSampleContext)
2278 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::seconds(2);
2280 return ModuleData->IsAutofocusFinished() ? StateType::AutofocusFinished : StateType::AutofocusWaiting;
2285 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2287 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2288 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2290 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2291 ModuleData->SetLEDLightTurnedOn(
true);
2292 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2293 ModuleData->SetPumpLightTurnedOn(
false);
2296 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage(),
true);
2298 PrepareImageRecording(ModuleData);
2300 return StateType::WaitingForLEDImageReadyToCapture;
2305 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2307 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2308 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2310 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2311 ModuleData->SetLEDLightTurnedOn(
false);
2312 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2313 ModuleData->SetPumpLightTurnedOn(
true);
2315 PrepareImageRecording(ModuleData);
2317 return StateType::WaitingForWidefieldImageReadyToCapture;
2322 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2324 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator) && !ImageCapturingPaused)
2325 return StateMachine.GetCurrentState()->GetState();
2327 RecordImage(ModuleData);
2329 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImageReadyToCapture ?
2330 StateType::WaitingForLEDImage : StateType::WaitingForWidefieldImage;
2335 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2336 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
2338 if (CameraData->IsImageAvailbale())
2340 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2341 ModuleData->SetLEDLightTurnedOn(
false);
2342 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2343 ModuleData->SetPumpLightTurnedOn(
false);
2346 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2348 ModuleData->SetCurrentImage(CameraData->GetImage());
2350 if (StateMachine.GetCurrentState()->GetState() == StateType::WaitingForWidefieldImage)
2351 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
2353 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ImageInterModuleCommunicator))
2356 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImage ?
2357 StateType::WaitingForLEDImageFinished : StateType::WaitingForWidefieldImageFinished;
2360 return StateMachine.GetCurrentState()->GetState();
2365 static constexpr const char* ReadCellIDErrorMsg =
"[WidefieldMicroscope] Reading cell ID from current image failed. See log for further information.";
2367 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Waiting)
2368 return StateType::WaitingForWidefieldCellID;
2370 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2371 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2373 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Finished)
2375 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2376 ModuleData->SetCellID(WidefieldLocalizerData->GetCellID());
2378 if (WidefieldLocalizerData->GetCellID().HasCellShift())
2380 MoveSampleTo(ModuleData->GetSamplePosition() +
2381 PositionPointFromPixelDist(ModuleParams, ModuleData, WidefieldLocalizerData->GetCellID().CellShift_px_x, WidefieldLocalizerData->GetCellID().CellShift_px_y),
2384 return StateType::WidefieldCellWaitUntilCentered;
2389 ModuleData->ResetCellID();
2391 if (LogUIMessagesOnly)
2394 ModuleData->SetUIMessage(ReadCellIDErrorMsg);
2397 return StateType::WidefieldCellIDReadFinished;
2402 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2403 if (IsSampleMoving(ModuleData))
2404 return StateType::WidefieldCellWaitUntilCentered;
2406 if (IsCharacterizingSample())
2408 StateMachine.SetContext(&AutoMeasureSampleRecenterCellContext);
2411 return StateType::LEDImageAcquisitionBegin;
2414 return StateType::WidefieldCellIDReadFinished;
2419 static constexpr const char* LocalizationFailedErrorMsg =
"[WidefieldMicroscope] Localization of emitters in widefield image failed. See log for further information.";
2421 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Waiting)
2422 return StateType::WaitingForWidefieldLocalization;
2424 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2426 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Finished)
2428 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2429 auto& LocalizedPositionsRaw = WidefieldLocalizerData->GetLocalizedPositions();
2432 for (
const auto& Position : LocalizedPositionsRaw)
2433 LocalizedPositions[Util::NumToT<WidefieldMicroscopeData::LocalizedPositionsMapType::key_type>(Position.first)] = { Position.second };
2435 ModuleData->SetLocalizedPositions(std::move(LocalizedPositions));
2439 ModuleData->ClearLocalizedPositions();
2441 if (LogUIMessagesOnly)
2444 ModuleData->SetUIMessage(LocalizationFailedErrorMsg);
2447 return StateType::WidefieldLocalizationFinished;
2452 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2456 ModuleData->GetWidefieldCamera()->StopCapturing();
2458 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2459 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2461 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
2463 StateMachine.SetContext(&FindingConfocalSpotBeginContext);
2464 return StateType::SetupTransitionBegin;
2469 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2471 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2472 ModuleData->SetLEDLightTurnedOn(
false);
2473 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2474 ModuleData->SetPumpLightTurnedOn(
true);
2476 PrepareImageRecording(ModuleData);
2478 StateMachine.SetContext(&FindingConfocalSpotRecordingWidefieldImageContext);
2479 return StateType::WaitingForWidefieldImageReadyToCapture;
2484 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2486 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2487 ModuleData->SetPumpLightTurnedOn(
false);
2489 auto IntensityImage = ModuleData->GetCurrentImage().convertToFormat(QImage::Format_Grayscale8);
2490 const unsigned char* DataPtr = IntensityImage.constBits();
2492 QPoint MaxCoord(0, 0);
2493 unsigned char MaxValue = 0;
2494 for (
int y = 0; y < IntensityImage.width(); ++y)
2495 for (
int x = 0; x < IntensityImage.height(); ++x)
2496 if (*DataPtr++ > MaxValue)
2498 MaxCoord = { x, y };
2499 MaxValue = *(DataPtr - 1);
2502 ModuleData->SetConfocalSpotImagePosition(MaxCoord);
2503 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
2505 return StateType::SetupTransitionBegin;
2510 if (ConfocalScanPositions.empty())
2511 return StateType::Ready;
2513 const auto& Position = ConfocalScanPositions.front();
2516 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2517 ModuleData->GetSampleStageX()->UpdateData();
2518 ModuleData->GetSampleStageY()->UpdateData();
2519 MoveSampleTo(Position, ModuleData);
2522 return StateType::ConfocalScanWaitUntilMoved;
2527 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2528 if (IsSampleMoving(ModuleData))
2529 return StateType::ConfocalScanWaitUntilMoved;
2531 auto MeasuredPos = ModuleData->GetSamplePosition();
2532 ConfocalScanPositions.front().MeasuredX = MeasuredPos.x;
2533 ConfocalScanPositions.front().MeasuredY = MeasuredPos.y;
2535 return StateType::ConfocalScanCapture;
2540 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2542 ModuleData->ResetSPD1State();
2543 ModuleData->ResetSPD2State();
2546 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2549 ModuleData->GetSPD1()->ReadData();
2551 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
2554 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2557 ModuleData->GetSPD2()->ReadData();
2560 return StateType::ConfocalScanWaitUntilCaptured;
2566 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2567 bool UsingSPD2 = ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT);
2570 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2572 if (SPD1DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD1SamplesWritten() + 2)
2573 ModuleData->SetSPD1Ready(SPD1DataSampleStream->ReadSample().Value);
2575 ModuleData->GetSPD1()->ReadData();
2580 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2582 if (SPD2DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD2SamplesWritten() + 2)
2583 ModuleData->SetSPD2Ready(SPD2DataSampleStream->ReadSample().Value);
2585 ModuleData->GetSPD2()->ReadData();
2588 if (ModuleData->GetSPD1Ready() && (!UsingSPD2 || ModuleData->GetSPD2Ready()))
2590 auto ExposureTime = ModuleData->GetSPDExposureTime().count();
2591 double CountRate = (ModuleData->GetSPD1Value() + ModuleData->GetSPD2Value())
2592 / ExposureTime * WidefieldMicroscope::ModuleDataType::SPDTimeType::period::den;
2594 if (StateMachine.GetContext() != &ConfocalOptimizationContext &&
2595 StateMachine.GetContext() != &AutoMeasureCharacterizationContext &&
2596 StateMachine.GetContext() != &AutoMeasureCharacterizationOptimizationContext &&
2597 StateMachine.GetContext() != &AutoMeasureCharacterizationSpectrumContext &&
2598 StateMachine.GetContext() != &AutoMeasureCharacterizationHBTContext &&
2599 !IsCharacterizingSample())
2600 ModuleData->GetConfocalScanResults().emplace_back(ConfocalScanPositions.front(), CountRate);
2601 ModuleData->SetLastCountRate(CountRate);
2603 ConfocalScanPositions.pop_front();
2605 return StateType::ConfocalScanStep;
2608 return StateType::ConfocalScanWaitUntilCaptured;
2613 ConfocalOptimizationInitPromises();
2615 ConfocalOptimizationThreadReturnFuture = std::async(std::launch::async, &WidefieldMicroscope::ConfocalOptimizationThread,
this);
2617 return StateType::ConfocalOptimizationWait;
2622 ConfocalOptimizationInitPromises();
2624 return StateType::ConfocalOptimizationWait;
2630 if (ConfocalOptimizationStateFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2632 const auto State = ConfocalOptimizationStateFuture.get();
2634 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2636 SetFocus(ModuleData, State.Z);
2637 ConfocalScanPositions.clear();
2638 ConfocalScanPositions.emplace_back(State.X, State.Y);
2641 return StateType::DummyState;
2645 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2646 return StateType::ConfocalOptimizationStep;
2648 return StateType::ConfocalOptimizationWait;
2653 static constexpr const char* OptimizationMaxIterReachedErrorMsg =
"[WidefieldMicroscope] Optimizing confocal count rate failed - maximal number of iterations reached!";
2654 static constexpr const char* OptimizationFailedErrorMsg =
"[WidefieldMicroscope] Optimizing confocal count rate failed!";
2657 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2659 ConfocalOptimizationPromisesRenewed =
false;
2662 ConfocalOptimizationFeedbackPromise.set_value(-ModuleData->GetLastCountRate());
2666 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2668 auto Result = ConfocalOptimizationThreadReturnFuture.get();
2670 if (++ConfocalOptimizationNumStepsPerformed > 100)
2672 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2673 if (LogUIMessagesOnly)
2676 ModuleData->SetUIMessage(OptimizationMaxIterReachedErrorMsg);
2679 if (Result == ConfocalOptimizationThreadReturnType::NextStep)
2680 return StateType::ConfocalOptimizationInit;
2681 if (Result == ConfocalOptimizationThreadReturnType::Failed)
2683 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2684 if (LogUIMessagesOnly)
2687 ModuleData->SetUIMessage(OptimizationFailedErrorMsg);
2690 return StateType::ConfocalOptimizationFinished;
2694 return StateType::ConfocalOptimizationInitSubStep;
2699 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2700 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2704 if (SPD1Data->GetNumEnqueuedTasks() < 10)
2705 ModuleData->GetSPD1()->ReadData();
2707 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
2708 ModuleData->SetHBTNumEventCounts(SPD1Data->GetHBTResults().EventCounts);
2710 double XMin(std::numeric_limits<double>::max()), XMax(std::numeric_limits<double>::lowest());
2711 double YMin(std::numeric_limits<double>::max()), YMax(std::numeric_limits<double>::lowest());
2712 ModuleData->GetHBTDataPoints().clear();
2713 for (
const auto& ResultItem : SPD1Data->GetHBTResults().ResultVector)
2715 auto X = ResultItem.Time * std::pico::den;
2716 auto Y = ResultItem.Value;
2717 ModuleData->GetHBTDataPoints().append(QPointF(X, Y));
2719 XMin = std::min(XMin, X);
2720 XMax = std::max(XMax, X);
2721 YMin = std::min(YMin, Y);
2722 YMax = std::max(YMax, Y);
2723 ModuleData->SetHBTDataPointsMaxValues({ XMax, YMax });
2724 ModuleData->SetHBTDataPointsMinValues({ XMin, YMin });
2727 if (ModuleData->GetHBTMaxIntegrationTime() > std::chrono::microseconds(0) && ModuleData->GetHBTTotalIntegrationTime() >= ModuleData->GetHBTMaxIntegrationTime())
2729 StopHBT(ModuleData);
2731 return StateType::HBTFinished;
2734 return StateType::HBTAcquiring;
2739 return std::chrono::system_clock::now() >= WaitingEndTimePoint ? StateType::WaitingFinished : StateType::Waiting;
2745 return StateType::PLEAcquisitionWaiting;
2751 return StateType::SpectrumAcquisitionWaiting;
2756 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2758 if (ModuleData->IncrementAutoMeasureCurrentImageSet() >= ModuleData->GetAutoMeasureNumberImageSets())
2760 if (ModuleData->GetAutoMeasureWidefieldPLEEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator))
2761 return StateType::AutoMeasureLocalizationPLEBegin;
2763 return StateType::AutoMeasureLocalizationFinished;
2766 return StateType::LEDImageAcquisitionBegin;
2772 std::filesystem::path Filename;
2775 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2777 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2778 Filename = BuildFilename(ModuleData,
"_LED_" +
Util::ToStr(Index) +
".png");
2781 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2783 return StateType::WidefieldImageAcquisitionBegin;
2788 int Index, ImagePositionScatterRadius;
2789 std::filesystem::path Filename;
2792 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2794 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2795 ImagePositionScatterRadius = ModuleData->GetAutoMeasureImagePositionScatterRadius();
2796 Filename = BuildFilename(ModuleData,
"_WF_" +
Util::ToStr(Index) +
".png");
2799 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2802 if (ImagePositionScatterRadius > 0)
2804 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2809 if (ModuleData->GetAutoMeasureNumberImageSets() > 2 &&
2810 ModuleData->GetAutoMeasureCurrentImageSet() != ModuleData->GetAutoMeasureNumberImageSets() - 2)
2811 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition() + RandomPointInCircle(ImagePositionScatterRadius), ModuleData);
2813 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition(), ModuleData);
2815 return StateType::AutoMeasureLocalizationMoving;
2818 return StateType::AutoMeasureLocalizationStep;
2823 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2825 if (IsSampleMoving(ModuleData))
2826 return StateType::AutoMeasureLocalizationMoving;
2828 return StateType::AutoMeasureLocalizationStep;
2833 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2835 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
SetFilenameEvent{ BuildFilename(ModuleData,
"_WFPLE").string() });
2836 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StartEvent{});
2838 return StateType::PLEAcquisitionWaiting;
2843 return StateType::AutoMeasureLocalizationFinished;
2848 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2849 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2852 std::stringstream CSVData;
2853 CSVData = ModuleData->AssembleCSVHeader(
false,
false,
true);
2854 CSVData <<
"ID;X(px);Y(px);State\n";
2856 auto& Positions = ModuleData->GetLocalizedPositions();
2857 for (
const auto& Position : Positions)
2858 CSVData << Position.first <<
";" << Position.second.Position.x() <<
";" << Position.second.Position.y() <<
";"
2859 << WidefieldMicroscopeData::GetLocalizedEmitterStateString(Position.second.State) <<
"\n";
2861 if (!
Util::SaveToFile(QString::fromUtf16(BuildFilename(ModuleData,
"_Emitters.csv").u16string().c_str()), CSVData.str()))
2864 if (ModuleData->GetAutoMeasureCurrentEmitter() == ModuleData->GetLocalizedPositions().cend())
2866 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2867 ModuleData->SetPumpLightTurnedOn(
false);
2869 ModuleData->SetAutoMeasureRunning(
false);
2871 return StateType::AutoMeasureCharacterizationFinished;
2874 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2875 ModuleData->SetLEDLightTurnedOn(
false);
2876 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2877 ModuleData->SetPumpLightTurnedOn(
true);
2879 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Characterizing;
2880 ModuleData->SetLocalizedPositionsStateChanged();
2881 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2882 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2884 ModuleData->ResetAutoMeasureCurrentOptimizationAttempt();
2886 return StateType::AutoMeasureCharacterizationGotoEmitter;
2891 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2892 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2894 if (IsSampleMoving(ModuleData))
2895 return StateType::AutoMeasureCharacterizationGotoEmitter;
2897 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2898 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2900 ModuleData->ResetAutoMeasureCurrentOptimizationRerun();
2901 InitializeConfocalOptimizer(ModuleData);
2903 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationOptimizationContext : &AutoMeasureCharacterizationOptimizationContext);
2904 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2906 SetHBTSwitch(ModuleParams, ModuleData,
true);
2908 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2910 return StateType::Waiting;
2913 return StateType::ConfocalOptimizationInit;
2916 return StateType::AutoMeasureCharacterizationOptimizationFinished;
2921 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2922 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2924 const auto EmitterDestiny = CalcMarkerToConfocalSpotDestiny(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2925 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2927 if (ModuleData->GetLastCountRate() >= ModuleData->GetAutoMeasureCountRateThreshold() &&
2928 EmitterDestiny.DistTo(ModuleData->GetSamplePosition()) <= ModuleData->GetAutoMeasureOptimizationMaxDistance())
2931 if (ModuleData->GetAutoMeasureSpectrumEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
2933 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationSpectrumContext : &AutoMeasureCharacterizationSpectrumContext);
2934 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2936 SetHBTSwitch(ModuleParams, ModuleData,
false);
2938 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2940 return StateType::Waiting;
2943 return StateType::AutoMeasureCharacterizationSpectrumBegin;
2946 return StateType::AutoMeasureCharacterizationSpectrumFinished;
2949 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2950 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2952 if (ModuleData->IncrementAutoMeasureCurrentOptimizationRerun() >= ModuleData->GetAutoMeasureMaxOptimizationReruns())
2954 if (ModuleData->IncrementAutoMeasureCurrentOptimizationAttempt() <= ModuleData->GetAutoMeasureNumOptimizationAttempts())
2956 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2957 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2959 return StateType::AutoMeasureCharacterizationGotoEmitter;
2964 InitializeConfocalOptimizer(ModuleData);
2966 return StateType::ConfocalOptimizationInit;
2970 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Failed;
2971 ModuleData->SetLocalizedPositionsStateChanged();
2973 ModuleData->IncrementAutoMeasureCurrentEmitter();
2974 return StateType::AutoMeasureCharacterizationStep;
2979 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2981 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
SetFilenameEvent{
2982 BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_Spectrum").string() });
2983 ModuleData->GetSpectrumAcqCommunicator()->PostEvent(*
this,
TriggerEvent{});
2985 return StateType::SpectrumAcquisitionWaiting;
2990 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2991 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2993 if (ModuleData->GetAutoMeasureConfocalPLEEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PLEInterModuleCommunicator))
2995 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationPLEContext : &AutoMeasureCharacterizationPLEContext);
2996 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2998 SetHBTSwitch(ModuleParams, ModuleData,
true);
3000 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
3002 return StateType::Waiting;
3005 return StateType::AutoMeasureCharacterizationPLEBegin;
3008 return StateType::AutoMeasureCharacterizationPLEFinished;
3013 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3016 BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_PLE").string() });
3017 ModuleData->GetPLEAcqCommunicator()->PostEvent(*
this,
StartEvent{});
3019 return StateType::PLEAcquisitionWaiting;
3024 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
3025 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3027 if (ModuleData->GetAutoMeasureHBTEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
3029 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationHBTContext : &AutoMeasureCharacterizationHBTContext);
3030 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
3032 SetHBTSwitch(ModuleParams, ModuleData,
true);
3034 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
3036 return StateType::Waiting;
3039 return StateType::AutoMeasureCharacterizationHBTBegin;
3042 return StateType::AutoMeasureCharacterizationHBTFinished;
3047 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3049 InitializeHBT(ModuleData);
3051 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
3056 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3057 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
3061 if (SPD1Data->GetNumEnqueuedTasks() < 10)
3062 ModuleData->GetSPD1()->ReadData();
3064 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
3066 if (HBTIntegrationTimeBeforeReset <= std::chrono::milliseconds(10) || ModuleData->GetHBTTotalIntegrationTime() < HBTIntegrationTimeBeforeReset)
3067 return StateType::HBTAcquiring;
3069 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
3074 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3076 if (ModuleData->GetAutoMeasureHBTEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
3078 auto Filename = BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_g2.csv");
3079 std::stringstream CSVData;
3081 CSVData = ModuleData->AssembleCSVHeader(
false,
true,
false);
3082 ModuleData->WriteHBTResults(CSVData);
3084 if (!
Util::SaveToFile(QString::fromUtf16(Filename.u16string().c_str()), CSVData.str()))
3088 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Finished;
3089 ModuleData->SetLocalizedPositionsStateChanged();
3091 ModuleData->IncrementAutoMeasureCurrentEmitter();
3092 return StateType::AutoMeasureCharacterizationStep;
3097 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3099 if (IsSampleMoving(ModuleData))
3100 return StateType::AutoMeasureSampleStep;
3103 return StartAutofocus(ModuleData);
3108 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3110 return InitiateReadCellIDFromImage(ModuleData);
3115 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3119 if (!ModuleData->GetCellID().Valid)
3121 ModuleData->SetCellIDToLastCellID();
3122 ModuleData->IncrementCellID();
3124 Util::EventLog().
Log(
"[WidefieldMicroscope] Reading a cell ID failed. Estimating it to " +
3131 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) < ModuleData->GetAutoMeasureCellRangeFrom().x() ||
3132 Util::NumToT<int>(ModuleData->GetCellID().Y_id) < ModuleData->GetAutoMeasureCellRangeFrom().y() ||
3133 Util::NumToT<int>(ModuleData->GetCellID().X_id) > ModuleData->GetAutoMeasureCellRangeTo().x() ||
3134 Util::NumToT<int>(ModuleData->GetCellID().Y_id) > ModuleData->GetAutoMeasureCellRangeTo().y())
3136 ModuleData->SetUIMessage(
"The current cell's ID is outside the specified cell range. Probably moved in wrong direction? Characterizing the sample cannot continue.");
3138 return ResetState(ModuleData);
3141 if (ModuleData->GetLastCellID().Valid &&
3142 ((!ModuleData->GetAutoMeasureSampleRotated() && ModuleData->GetLastCellID() >= ModuleData->GetCellID()) ||
3143 (ModuleData->GetAutoMeasureSampleRotated() && ModuleData->GetLastCellID().SwapCoords() >= ModuleData->GetCellID().SwapCoords())))
3145 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.");
3147 return ResetState(ModuleData);
3150 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3151 return StartAutoMeasureLocalization(ModuleData);
3153 return InitiateLocalizationFromImage(ModuleData);
3158 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3161 if (ModuleData->GetLocalizedPositions().empty())
3166 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
3168 return StateType::AutoMeasureSampleAdvanceCell;
3171 return StartAutoMeasureLocalization(ModuleData);
3176 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3178 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SpectrumInterModuleCommunicator))
3181 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3182 return InitiateLocalizationFromImage(ModuleData);
3184 return StateType::WidefieldLocalizationFinished;
3189 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3191 return StartAutoMeasureCharacterization(ModuleData);
3206 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3208 if (ModuleData->GetWidefieldPosition().IsEmpty())
3210 ModuleData->SetUIMessage(
"The current widefield image's position is invalid. Characterizing the sample cannot continue.");
3212 return ResetState(ModuleData);
3216 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x() &&
3217 Util::NumToT<int>(ModuleData->GetCellID().Y_id) == ModuleData->GetAutoMeasureCellRangeTo().y())
3218 return StateType::AutoMeasureSampleFinished;
3221 if ((!ModuleData->GetAutoMeasureSampleRotated() && Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x()) ||
3222 (ModuleData->GetAutoMeasureSampleRotated() && Util::NumToT<int>(ModuleData->GetCellID().Y_id) == ModuleData->GetAutoMeasureCellRangeTo().y()))
3224 ModuleData->GetWidefieldPosition().x - Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()) *
3225 ((ModuleData->GetAutoMeasureSampleRotated() ? ModuleData->GetAutoMeasureCellColumnLength() : ModuleData->GetAutoMeasureCellLineLength()) - 1),
3226 ModuleData->GetWidefieldPosition().y + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().y())
3230 ModuleData->GetWidefieldPosition().x + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()),
3231 ModuleData->GetWidefieldPosition().y
3234 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
std::vector< std::unique_ptr< QSurfaceDataRow > > QSurfaceDataRowsType
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
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 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
ModuleDataType::QSurfaceDataRowsType CalculateConfocalScanPositions(const int Width, const int Height, const int DistPerPixel, const WidefieldMicroscopeData::PositionPoint CenterPosition) 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
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