30 if (UsingX && Other.
UsingX)
31 dist += (x - Other.
x) * (x - Other.
x);
32 if (UsingY && Other.
UsingY)
33 dist += (y - Other.
y) * (y - Other.
y);
34 if (UsingZ && Other.
UsingZ)
35 dist += (z - Other.
z) * (z - Other.
z);
37 return std::sqrt(dist);
42 std::stringstream stream;
43 stream << std::setprecision(9);
45 stream << Prefix <<
"Valid = " << (!IsEmpty() ?
"yes" :
"no") <<
"\n";
48 stream << Prefix <<
"X = " << x <<
" nm\n";
49 stream << Prefix <<
"MeasuredX = " << MeasuredX <<
" nm\n";
53 stream << Prefix <<
"Y = " << y <<
" nm\n";
54 stream << Prefix <<
"MeasuredY = " << MeasuredY <<
" nm\n";
58 stream << Prefix <<
"Z = " << z <<
" nm\n";
59 stream << Prefix <<
"MeasuredZ = " << MeasuredZ <<
" nm\n";
83 default:
return QApplication::palette().text().color();
97 auto X = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
GetSampleStageX()->GetInstrumentData())->GetCurrentPosition();
98 auto Y = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
GetSampleStageY()->GetInstrumentData())->GetCurrentPosition();
100 return {
static_cast<decltype(
X)
>(
X * Ratio) ,
static_cast<decltype(
Y)
>(
Y * Ratio) };
105 std::stringstream CSVData;
106 CSVData << std::setprecision(9);
121 if (IncludeConfocalScan)
136 CSVData <<
"HBTBinWidth = " <<
HBTBinWidth.count() <<
" ps\n";
137 CSVData <<
"HBTBinCount = " <<
HBTBinCount <<
"\n";
144 if (IncludeAutoMeasure)
173 CSVData <<
"HEADER_END\n";
180 Stream <<
"X_measured(nm);Y_measured(nm);X_destiny(nm);Y_destiny(nm);C(Hz)\n";
183 for (
const auto& ResultItem : ResultItems)
184 Stream << ResultItem.first.MeasuredX <<
";" << ResultItem.first.MeasuredY <<
";"
185 << ResultItem.first.x <<
";" << ResultItem.first.y <<
";"
186 << ResultItem.second <<
"\n";
191 Stream <<
"t(ps);g2\n";
194 Stream << ResultItem.x() <<
";" << ResultItem.y() <<
"\n";
223 return Pos.second.State == LocalizedEmitterStateType::Finished;
230 return Pos.second.State == LocalizedEmitterStateType::Failed;
299 if (FirstEmitterID < 0)
407 Point.
x = lhs.
x + rhs.
x;
426 Point.
y = lhs.
y + rhs.
y;
445 Point.
z = lhs.
z + rhs.
z;
471 Point.
x = lhs.
x - rhs.
x;
490 Point.
y = lhs.
y - rhs.
y;
509 Point.
z = lhs.
z - rhs.
z;
530 : QModuleBase(OwnerThreadID, std::move(Params)),
531 StateMachine(InitializingState,
532 SetupTransitionBeginState, SetupTransitioningState, SetupTransitionEndState, SetupTransitionFinishedState,
534 AutofocusBeginState, AutofocusWaitingState, AutofocusFinishedState,
535 LEDImageAcquisitionBeginState, WidefieldImageAcquisitionBeginState,
536 WaitingForLEDImageReadyToCaptureState, WaitingForLEDImageState, WaitingForLEDImageFinishedState,
537 WaitingForWidefieldImageReadyToCaptureState, WaitingForWidefieldImageState, WaitingForWidefieldImageFinishedState,
538 WaitingForWidefieldCellIDState, WidefieldCellWaitUntilCenteredState, WidefieldCellIDReadFinishedState,
539 WaitingForWidefieldLocalizationState, WidefieldLocalizationFinishedState,
540 FindingConfocalSpotBeginState, FindingConfocalSpotAfterTransitioningToConfocalModeState, FindingConfocalSpotAfterRecordingWidefieldImageState,
541 ConfocalScanStepState, ConfocalScanWaitUntilMovedState, ConfocalScanCaptureState, ConfocalScanWaitUntilCapturedState,
542 ConfocalOptimizationInitState, ConfocalOptimizationInitSubStepState, ConfocalOptimizationWaitState, ConfocalOptimizationStepState, ConfocalOptimizationFinishedState,
543 HBTAcquiringState, HBTFinishedState,
544 WaitingState, WaitingFinishedState,
545 SpectrumAcquisitionWaitingState, SpectrumAcquisitionFinishedState,
546 AutoMeasureLocalizationStepState, AutoMeasureLocalizationSaveLEDImageState, AutoMeasureLocalizationSaveWidefieldImageState,
547 AutoMeasureLocalizationMovingState, AutoMeasureLocalizationFinishedState,
548 AutoMeasureCharacterizationStepState, AutoMeasureCharacterizationGotoEmitterState, AutoMeasureCharacterizationOptimizationFinishedState,
549 AutoMeasureCharacterizationSpectrumBeginState, AutoMeasureCharacterizationSpectrumFinishedState,
550 AutoMeasureCharacterizationHBTBeginState, AutoMeasureCharacterizationHBTWaitForInitState, AutoMeasureCharacterizationHBTFinishedState,
551 AutoMeasureCharacterizationFinishedState,
552 AutoMeasureSampleStepState, AutoMeasureSampleReadCellIDState, AutoMeasureSampleReadCellIDFinishedState,
553 AutoMeasureSampleLocalizeState, AutoMeasureSampleFindEmittersState,
554 AutoMeasureSampleCharacterizeState, AutoMeasureSampleAdvanceCellState, AutoMeasureSampleFinishedState),
560 GSLConfocalOptimizationState(gsl_multimin_fminimizer_alloc(GSLConfocalOptimizationMinimizer, GSLConfocalOptimizationNumDimensions)),
561 GSLConfocalOptimizationStepSize(gsl_vector_alloc(GSLConfocalOptimizationNumDimensions)),
562 GSLConfocalOptimizationInitialPoint(gsl_vector_alloc(GSLConfocalOptimizationNumDimensions))
580 auto CurrentState =
StateMachine.GetCurrentState()->GetState();
584 return std::chrono::milliseconds(30);
586 return std::chrono::milliseconds(2);
591 static constexpr
const char* SaveErrorMsg =
"Saving an image failed.";
599 if (!Image.save(Filename))
619 { Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()) },
626 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
649 if (
ModuleData->GetPumpPowerIndicator()->CanRead())
691 auto Widget = std::make_unique<WidefieldMicroscopeWidget>(*
this);
758 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(
Widget->GetUI().SBConfocalSPDExposureTime->value()));
765 auto Widget = GetWidget<WidefieldMicroscopeWidget>();
766 std::string UIMessage;
769 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(ModuleDataGetter());
787 if (!UIMessage.empty())
788 QMessageBox::warning(
Widget,
"Widefield Microscope", UIMessage.data());
801 ModuleData->ResetAutoMeasureCurrentImageSet();
836 ModuleData->GetSampleStageX()->MoveAbsolute(Point.x /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
838 *PositionerState = PositionerStateType::Moving;
846 ModuleData->GetSampleStageY()->MoveAbsolute(Point.y /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
848 *PositionerState = PositionerStateType::Moving;
856 ModuleData->GetSampleStageZ()->MoveAbsolute(Point.z /
ModuleData->GetSampleStageX()->GetStepNanoMeterRatio(),
858 *PositionerState = PositionerStateType::Moving;
877 auto SampleStageXData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageX()->GetInstrumentData());
878 auto SampleStageYData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::PositionerStage>(
ModuleData->GetSampleStageY()->GetInstrumentData());
879 bool IsMoving = !SampleStageXData->HasArrived() || !SampleStageYData->HasArrived();
896 std::min(
ModuleData->GetMaxFocusVoltage(), Voltage +
902 QPoint MarkerPos, QPointF SamplePos)
const
904 const auto DiffPosInPx =
ModuleData->GetConfocalSpotImagePosition() - MarkerPos;
905 const WidefieldMicroscopeData::PositionPoint SamplePosPoint(Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.x()), Util::NumToT<WidefieldMicroscopeData::PositionType>(SamplePos.y()));
911 QPoint MarkerPos, QPointF SamplePos)
const
922 for (
int i = 1; i <= Height; ++i)
924 auto y = CenterPosition.
y + (-
static_cast<double>(Height) / 2 + i) * DistPerPixel;
925 auto Row = std::make_unique<QSurfaceDataRow>(Width);
927 for (
auto j = Width; j > 0; --j)
933 x = CenterPosition.
x + (-
static_cast<double>(Width) / 2 + j) * DistPerPixel;
935 x = CenterPosition.
x + (
static_cast<double>(Width) / 2 - j + 1) * DistPerPixel;
937 auto ColIndex = i % 2 ? j - 1 : Width - j;
938 (*Row)[ColIndex].setPosition(QVector3D(std::round(x), 0, std::round(y)));
944 QSurfaceDataRows.push_back(std::move(Row));
947 return QSurfaceDataRows;
967 ModuleData->GetWidefieldCamera()->StopCapturingSync();
970 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(
ModuleData->GetWidefieldCamera()->GetInstrumentData());
971 CameraData->ClearImage();
977 ModuleData->GetWidefieldCamera()->CaptureSingle();
1014 if (ModuleData->GetCurrentImage().isNull())
1015 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Failed;
1025 *LocalizerState = WidefieldImageProcessingStateType::Failed;
1026 Exception.ClearError();
1034 *LocalizerState = WidefieldImageProcessingStateType::Finished;
1037 *WidefieldLocalizationState = WidefieldImageProcessingStateType::Waiting;
1039 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
1040 ModuleData->GetWidefieldLocalizer()->AnalyzeWidefield(ModuleData->GetCurrentImage(), CallbackFunc);
1042 ModuleData->GetWidefieldLocalizer()->RecallPositions(ModuleData->GetCurrentImage(),
1043 ModuleData->GetCellID(), ModuleData->GetAutoMeasureSavePath().string(), CallbackFunc);
1046 return StateType::WaitingForWidefieldLocalization;
1051 ModuleData->GetSPD1()->SetStreamSize(1);
1052 ModuleData->GetSPD1()->SetExposureTime(ModuleData->GetSPDExposureTime());
1053 ModuleData->GetSPD1()->SetCoincidenceWindow(ModuleData->GetSPD1()->GetResolution());
1055 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1057 ModuleData->GetSPD2()->SetStreamSize(1);
1058 ModuleData->GetSPD2()->SetExposureTime(ModuleData->GetSPDExposureTime());
1059 ModuleData->GetSPD2()->SetCoincidenceWindow(ModuleData->GetSPD2()->GetResolution());
1065 ConfocalOptimizationNumStepsPerformed = 0;
1067 PrepareAPDsForConfocalMode(ModuleData);
1068 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1069 auto SamplePosition = ModuleData->GetSamplePosition();
1071 gsl_vector_set(GSLConfocalOptimizationStepSize, 0,
1072 ModuleData->GetSampleStageX()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1073 gsl_vector_set(GSLConfocalOptimizationStepSize, 1,
1074 ModuleData->GetSampleStageY()->GetResolution() * ModuleData->GetConfocalOptimizationInitXYStepSize());
1075 gsl_vector_set(GSLConfocalOptimizationStepSize, 2,
1076 ModuleData->GetSampleFocusPiezoZ()->GetHardwareResolution() * ModuleData->GetConfocalOptimizationInitZStepSize());
1077 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 0, SamplePosition.x);
1078 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 1, SamplePosition.y);
1079 gsl_vector_set(GSLConfocalOptimizationInitialPoint, 2, ModuleData->GetFocusZeroVoltage());
1085 ModuleData->GetWidefieldHBTSwitch()->Clear();
1086 ModuleData->GetWidefieldHBTSwitch()->SetRectFunction({ 1, 1, 0, 0,
1087 IsHBTMode ? ModuleParams->WidefieldHBTSwitchHighDutyCycle : ModuleParams->WidefieldHBTSwitchLowDutyCycle },
1093 ModuleData->ClearHBTDataPoints();
1094 ModuleData->SetHBTSamplePosition(ModuleData->GetSamplePosition());
1096 auto TimeTagger = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1097 TimeTagger->SetHBTActive(
true);
1098 TimeTagger->ConfigureHBT(ModuleData->GetHBTBinWidth(), ModuleData->GetHBTBinCount());
1099 TimeTagger->ResetHBT();
1100 HBTIntegrationTimeBeforeReset = ModuleData->GetHBTTotalIntegrationTime();
1105 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1107 auto SPD1 = DynExp::dynamic_Object_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1().
get());
1108 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(SPD1->GetInstrumentData());
1109 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
1110 SPD1->SetHBTActive(
false);
1111 SPD1Data->ResetStreamMode();
1112 SPD2Data->ResetStreamMode();
1118 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1120 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1122 if (!IsCharacterizingSample())
1123 StateMachine.SetContext(&AutofocusSetupTransitioningContext);
1125 return StateType::SetupTransitionBegin;
1128 return StateType::AutofocusBegin;
1133 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator))
1136 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1137 ModuleData->ResetAutoMeasureCurrentImageSet();
1138 WaitingEndTimePoint = std::chrono::system_clock::now() + ModuleData->GetAutoMeasureInitialImageSetWaitTime();
1140 LogUIMessagesOnly =
true;
1142 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleLocalizationContext : &AutoMeasureLocalizationContext);
1143 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1145 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1147 return StateType::SetupTransitionBegin;
1150 return StateType::Waiting;
1155 if (FirstEmitterID < 0)
1156 ModuleData->ResetAutoMeasureCurrentEmitter();
1159 bool Success = ModuleData->SetAutoMeasureFirstEmitter(FirstEmitterID);
1161 return ResetState(ModuleData);
1164 std::ranges::for_each(ModuleData->GetLocalizedPositions(), [](
auto& Item) { Item.second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet; });
1165 ModuleData->SetLocalizedPositionsStateChanged();
1166 ModuleData->SetAutoMeasureRunning(
true);
1167 ModuleData->SetAutoMeasureCurrentCellPosition(ModuleData->GetSamplePosition());
1169 LogUIMessagesOnly =
true;
1171 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationContext : &AutoMeasureCharacterizationContext);
1172 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1174 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1176 return StateType::SetupTransitionBegin;
1179 return StateType::AutoMeasureCharacterizationStep;
1184 LogUIMessagesOnly =
true;
1186 StateMachine.SetContext(&AutoMeasureSampleContext);
1188 return StateType::AutoMeasureSampleStep;
1193 auto SavePath = ModuleData->GetAutoMeasureSavePath();
1194 SavePath.replace_filename(SavePath.filename().stem().concat(FilenameSuffix));
1195 std::filesystem::create_directories(SavePath.parent_path());
1200 WidefieldMicroscope::ModuleDataType::PositionPoint WidefieldMicroscope::RandomPointInCircle(ModuleDataType::PositionType Radius)
const
1202 static std::random_device random_devce;
1203 static std::mt19937 random_generator(random_devce());
1204 static std::uniform_real_distribution<double> angle_random_distribution(0., 2. * std::numbers::pi);
1205 std::uniform_real_distribution<double> radius_random_distribution(0., Radius);
1207 const auto angle = angle_random_distribution(random_generator);
1208 const auto r = radius_random_distribution(random_generator);
1209 const auto x = Util::NumToT<ModuleDataType::PositionType>(r * std::cos(angle));
1210 const auto y = Util::NumToT<ModuleDataType::PositionType>(r * std::sin(angle));
1215 void WidefieldMicroscope::ConfocalOptimizationInitPromises()
1217 ConfocalOptimizationStatePromise = decltype(ConfocalOptimizationStatePromise)();
1218 ConfocalOptimizationStateFuture = ConfocalOptimizationStatePromise.get_future();
1219 ConfocalOptimizationFeedbackPromise = decltype(ConfocalOptimizationFeedbackPromise)();
1220 ConfocalOptimizationFeedbackFuture = ConfocalOptimizationFeedbackPromise.get_future();
1222 ConfocalOptimizationPromisesRenewed =
true;
1236 return Status ? ConfocalOptimizationThreadReturnType::Failed : ConfocalOptimizationThreadReturnType::NextStep;
1242 return ConfocalOptimizationThreadReturnType::Failed;
1247 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Owner->
GetModuleData());
1249 Status = gsl_multimin_test_size(Size, ModuleData->GetConfocalOptimizationTolerance());
1252 return Status == GSL_SUCCESS ? ConfocalOptimizationThreadReturnType::Finished :
1253 (Status == GSL_CONTINUE ? ConfocalOptimizationThreadReturnType::NextStep : ConfocalOptimizationThreadReturnType::Failed);
1258 return ConfocalOptimizationThreadReturnType::Failed;
1263 double WidefieldMicroscope::ConfocalOptimizationFuncForwarder(
const gsl_vector* vector,
void* params)
1268 double WidefieldMicroscope::ConfocalOptimizationFunc(
const gsl_vector* vector) noexcept
1273 while (!ConfocalOptimizationPromisesRenewed)
1274 std::this_thread::yield();
1278 auto Z =
static_cast<decltype(ConfocalOptimizationStateType::Z)
>(gsl_vector_get(vector, 2));
1282 ConfocalOptimizationStatePromise.set_value({
X,
Y, Z });
1284 if (!ConfocalOptimizationFeedbackFuture.valid())
1288 return ConfocalOptimizationFeedbackFuture.get();
1302 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1303 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1305 if (ModuleParams->AcqCommunicator.ContainsID())
1307 Instance->
LockObject(ModuleParams->AcqCommunicator, ModuleData->GetAcqCommunicator());
1308 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator);
1311 if (ModuleParams->WidefieldCamera.ContainsID())
1313 Instance->
LockObject(ModuleParams->WidefieldCamera, ModuleData->GetWidefieldCamera());
1314 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Widefield);
1317 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
1318 ModuleData->SetMinCameraExposureTime(CameraData->GetMinExposureTime());
1319 ModuleData->SetMaxCameraExposureTime(CameraData->GetMaxExposureTime());
1322 if (ModuleParams->WidefieldLocalizer.ContainsID())
1324 Instance->
LockObject(ModuleParams->WidefieldLocalizer, ModuleData->GetWidefieldLocalizer());
1325 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization);
1329 if (ModuleParams->SampleStageX.ContainsID() && ModuleParams->SampleStageY.ContainsID())
1331 Instance->
LockObject(ModuleParams->SampleStageX, ModuleData->GetSampleStageX());
1332 Instance->
LockObject(ModuleParams->SampleStageY, ModuleData->GetSampleStageY());
1334 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning);
1336 if (ModuleParams->SPD1.ContainsID())
1338 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1339 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::Confocal);
1343 if (ModuleParams->SampleStageZ.ContainsID())
1345 Instance->
LockObject(ModuleParams->SampleStageZ, ModuleData->GetSampleStageZ());
1346 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SampleZPositioning);
1349 if (ModuleParams->FocusPiezoZ.ContainsID())
1351 Instance->
LockObject(ModuleParams->FocusPiezoZ, ModuleData->GetSampleFocusPiezoZ());
1353 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator))
1354 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment);
1355 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::SampleXYPositioning))
1356 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization);
1358 ModuleData->SetMinFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMinValue());
1359 ModuleData->SetMaxFocusVoltage(ModuleData->GetSampleFocusPiezoZ()->GetUserMaxValue());
1362 if (ModuleParams->SPD1.ContainsID() && ModuleParams->SPD2.ContainsID())
1364 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1365 Instance->
LockObject(ModuleParams->SPD1, ModuleData->GetSPD1());
1366 Instance->
LockObject(ModuleParams->SPD2, ModuleData->GetSPD2());
1368 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBT);
1371 if (ModuleParams->LEDSwitch.ContainsID())
1373 Instance->
LockObject(ModuleParams->LEDSwitch, ModuleData->GetLEDSwitch());
1374 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle);
1376 ModuleData->SetLEDLightTurnedOn(
false);
1379 if (ModuleParams->PumpSwitch.ContainsID())
1381 Instance->
LockObject(ModuleParams->PumpSwitch, ModuleData->GetPumpSwitch());
1382 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle);
1384 ModuleData->SetPumpLightTurnedOn(
false);
1387 if (ModuleParams->PumpPower.ContainsID())
1389 Instance->
LockObject(ModuleParams->PumpPower, ModuleData->GetPumpPower());
1390 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::SetPumpPower);
1392 ModuleData->SetMinPumpPower(ModuleData->GetPumpPower()->GetUserMinValue());
1393 ModuleData->SetMaxPumpPower(ModuleData->GetPumpPower()->GetUserMaxValue());
1394 ModuleData->SetWidefieldPumpPower(ModuleParams->DefaultPowerWidefieldMode);
1395 ModuleData->SetConfocalPumpPower(ModuleParams->DefaultPowerConfocalMode);
1398 if (ModuleParams->PumpPowerIndicator.ContainsID())
1400 Instance->
LockObject(ModuleParams->PumpPowerIndicator, ModuleData->GetPumpPowerIndicator());
1401 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::MeasurePumpPower);
1404 if (ModuleParams->WidefieldConfocalSwitch.ContainsID())
1406 Instance->
LockObject(ModuleParams->WidefieldConfocalSwitch, ModuleData->GetWidefieldConfocalSwitch());
1407 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch);
1409 if (ModuleParams->WidefieldConfocalIndicator.ContainsID())
1411 Instance->
LockObject(ModuleParams->WidefieldConfocalIndicator, ModuleData->GetWidefieldConfocalIndicator());
1412 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator);
1414 ModuleData->SetSetupMode(ModuleData->GetWidefieldConfocalIndicator()->GetSync() ? WidefieldMicroscopeData::SetupModeType::Confocal : WidefieldMicroscopeData::SetupModeType::Widefield);
1417 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1420 if (ModuleParams->WidefieldHBTSwitch.ContainsID())
1422 Instance->
LockObject(ModuleParams->WidefieldHBTSwitch, ModuleData->GetWidefieldHBTSwitch());
1423 ModuleData->SetFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch);
1425 MakeAndEnqueueEvent(
this, &WidefieldMicroscope::OnToggleHBTMirror,
false);
1431 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1433 OnStopAction(Instance,
false);
1435 Instance->
UnlockObject(ModuleData->GetAcqCommunicator());
1439 Instance->
UnlockObject(ModuleData->GetSampleFocusPiezoZ());
1442 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalSwitch());
1443 Instance->
UnlockObject(ModuleData->GetWidefieldConfocalIndicator());
1444 Instance->
UnlockObject(ModuleData->GetWidefieldHBTSwitch());
1446 Instance->
UnlockObject(ModuleData->GetPumpPowerIndicator());
1447 Instance->
UnlockObject(ModuleData->GetWidefieldCamera());
1448 Instance->
UnlockObject(ModuleData->GetWidefieldLocalizer());
1464 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1467 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1469 ModuleData->GetSampleStageX()->StopMotion();
1470 ModuleData->GetSampleStageY()->StopMotion();
1473 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1474 ModuleData->GetWidefieldCamera()->StopCapturing();
1476 StopHBT(ModuleData);
1478 if (ConfocalOptimizationThreadReturnFuture.valid())
1483 ConfocalOptimizationFeedbackPromise = decltype(ConfocalOptimizationFeedbackPromise)();
1484 ConfocalOptimizationPromisesRenewed =
true;
1489 ConfocalOptimizationThreadReturnFuture.wait();
1492 if (ModuleData->IsAutoMeasureRunning())
1494 if (ModuleData->GetAutoMeasureCurrentEmitter() != ModuleData->GetLocalizedPositions().cend())
1496 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::NotSet;
1497 ModuleData->SetLocalizedPositionsStateChanged();
1500 ModuleData->SetAutoMeasureRunning(
false);
1503 StateMachine.SetCurrentState(ResetState(ModuleData));
1508 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1510 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1513 ModuleData->SetSampleHomePosition(ModuleData->GetSamplePosition());
1518 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1520 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1523 MoveSampleTo(ModuleData->GetSampleHomePosition(), ModuleData);
1528 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1530 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1533 ModuleData->SetLEDLightTurnedOn(State);
1538 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1540 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
1543 ModuleData->SetPumpLightTurnedOn(State);
1548 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1550 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1553 if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI().action_Widefield_mode)
1554 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1555 else if (Action == GetWidget<WidefieldMicroscopeWidget>()->GetUI().action_Confocal_mode)
1556 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
1560 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1565 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1567 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
1570 StateMachine.SetCurrentState(StartAutofocus(ModuleData));
1575 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1577 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization)
1578 || ModuleData->GetSetupMode() != WidefieldMicroscopeData::SetupModeType::Confocal)
1581 InitializeConfocalOptimizer(ModuleData);
1584 StateMachine.SetContext(&ConfocalOptimizationContext);
1585 StateMachine.SetCurrentState(StateType::ConfocalOptimizationInit);
1590 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance->
ParamsGetter());
1591 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1593 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
1596 SetHBTSwitch(ModuleParams, ModuleData, Checked);
1601 if (!IsReadyState())
1604 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1605 ModuleData->ResetCellID();
1610 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1611 ModuleData->SetWidefieldPumpPower(Value);
1613 UpdatePumpPower(ModuleData);
1618 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1619 ModuleData->SetConfocalPumpPower(Value);
1621 UpdatePumpPower(ModuleData);
1626 if (!IsReadyState())
1629 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1630 SetFocus(ModuleData, Value);
1635 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1636 ModuleData->SetFocusZeroVoltage(Value);
1641 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1642 ModuleData->SetFocusConfocalOffsetVoltage(Value);
1644 if (IsReadyState() && ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
1645 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
1650 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1651 ModuleData->SetFocusZeroVoltage(ModuleData->GetFocusCurrentVoltage());
1656 if (!IsReadyState())
1659 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1660 SetFocus(ModuleData, ModuleData->GetFocusZeroVoltage());
1665 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1666 ModuleData->SetLEDCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1671 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1673 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1676 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1677 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetLEDCameraExposureTime());
1682 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1683 ModuleData->SetWidefieldCameraExposureTime(std::chrono::milliseconds(
static_cast<std::chrono::milliseconds::rep
>(Value)));
1688 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1690 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1693 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
1694 ModuleData->GetWidefieldCamera()->SetExposureTime(ModuleData->GetWidefieldCameraExposureTime());
1699 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1701 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield)
1702 || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1705 StateMachine.SetCurrentState(StateType::FindingConfocalSpotBegin);
1710 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1712 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1715 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1717 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1719 StateMachine.SetContext(&LEDImageAcquisitionSetupTransitioningContext);
1720 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1723 StateMachine.SetCurrentState(StateType::LEDImageAcquisitionBegin);
1728 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1730 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
1733 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
1735 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
1737 StateMachine.SetContext(&WidefieldImageAcquisitionSetupTransitioningContext);
1738 StateMachine.SetCurrentState(StateType::SetupTransitionBegin);
1741 StateMachine.SetCurrentState(StateType::WidefieldImageAcquisitionBegin);
1746 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1748 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1751 StateMachine.SetCurrentState(InitiateReadCellIDFromImage(ModuleData));
1756 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1758 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization) || ModuleData->GetCurrentImage().isNull())
1761 ModuleData->GetWidefieldLocalizer()->AnalyzeDistortion(ModuleData->GetCurrentImage());
1766 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1768 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
1771 StateMachine.SetCurrentState(InitiateLocalizationFromImage(ModuleData));
1776 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1779 if (ModuleData->GetWidefieldPosition().IsEmpty())
1782 OnBringMarkerToConfocalSpot(Instance, Position, {
static_cast<qreal
>(ModuleData->GetWidefieldPosition().x),
static_cast<qreal
>(ModuleData->GetWidefieldPosition().y) });
1787 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1788 ModuleData->SetConfocalScanWidth(Value);
1793 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1794 ModuleData->SetConfocalScanHeight(Value);
1799 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1800 ModuleData->SetConfocalScanDistPerPixel(Value);
1805 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1806 ModuleData->SetSPDExposureTime(std::chrono::milliseconds(Value));
1811 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1812 ModuleData->SetConfocalOptimizationInitXYStepSize(Value);
1817 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1818 ModuleData->SetConfocalOptimizationInitZStepSize(Value);
1823 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1824 ModuleData->SetConfocalOptimizationTolerance(Value);
1829 int Width{}, Height{}, DistPerPixel{};
1832 OnGoToHomePosition(Instance,
false);
1835 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1837 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1840 CenterPosition = ModuleData->GetSamplePosition();
1842 Width = ModuleData->GetConfocalScanWidth();
1843 Height = ModuleData->GetConfocalScanHeight();
1844 DistPerPixel = ModuleData->GetConfocalScanDistPerPixel();
1846 PrepareAPDsForConfocalMode(ModuleData);
1848 ModuleData->ClearConfocalScanResults();
1853 auto SurfaceDataRows = CalculateConfocalScanPositions(Width, Height, DistPerPixel, CenterPosition);
1855 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1856 ModuleData->SetConfocalScanSurfacePlotRows(std::move(SurfaceDataRows));
1858 StateMachine.SetCurrentState(StateType::ConfocalScanStep);
1863 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1865 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal))
1868 const auto& Results = ModuleData->GetConfocalScanResults();
1869 auto ResultItemIt = std::find_if(Results.cbegin(), Results.cend(), [&Position](
const std::pair<WidefieldMicroscopeData::PositionPoint, double>& ResultItem) {
1870 return ResultItem.first.RowIndex == Position.x() && ResultItem.first.ColumnIndex == Position.y();
1873 if (ResultItemIt != Results.cend())
1874 MoveSampleTo({ ResultItemIt->first.MeasuredX, ResultItemIt->first.MeasuredY }, ModuleData);
1879 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1880 ModuleData->SetHBTBinWidth(
Util::picoseconds(
static_cast<Util::picoseconds::rep
>(Value)));
1885 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1886 ModuleData->SetHBTBinCount(Value);
1891 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1892 ModuleData->SetHBTMaxIntegrationTime(std::chrono::microseconds(Util::NumToT<std::chrono::microseconds::rep>(Value * std::chrono::microseconds::period::den)));
1897 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1899 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
1902 InitializeHBT(ModuleData);
1904 StateMachine.SetCurrentState(StateType::HBTAcquiring);
1909 ImageCapturingPaused =
true;
1914 static constexpr
const char* AutofocusFailedErrorMsg =
"Autofocusing failed!";
1916 if (StateMachine.GetCurrentState()->GetState() != StateType::AutofocusWaiting)
1919 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1920 ModuleData->SetAutofocusFinished();
1924 Voltage -= ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? ModuleData->GetFocusConfocalOffsetVoltage() : .0;
1926 SetFocus(ModuleData, Voltage);
1927 ModuleData->SetFocusZeroVoltage(Voltage);
1931 if (LogUIMessagesOnly)
1935 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1936 ModuleData->SetUIMessage(AutofocusFailedErrorMsg);
1940 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
1941 ModuleData->SetLEDLightTurnedOn(
false);
1946 StateMachine.SetCurrentState(StateType::SpectrumAcquisitionFinished);
1951 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1952 ModuleData->SetAutoMeasureSavePath(Path.toStdString());
1957 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1958 ModuleData->SetAutoMeasureNumberImageSets(Value);
1963 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1964 ModuleData->SetAutoMeasureInitialImageSetWaitTime(
std::chrono::seconds(
static_cast<std::chrono::seconds::rep
>(Value)));
1969 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1970 ModuleData->SetAutoMeasureImagePositionScatterRadius(Value);
1975 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1981 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1982 ModuleData->SetAutoMeasureOptimizeEnabled(State);
1987 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1988 ModuleData->SetAutoMeasureSpectrumEnabled(State);
1993 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
1994 ModuleData->SetAutoMeasureHBTEnabled(State);
1999 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2000 ModuleData->SetAutoMeasureNumOptimizationAttempts(Value);
2005 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2006 ModuleData->SetAutoMeasureMaxOptimizationReruns(Value);
2011 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2012 ModuleData->SetAutoMeasureOptimizationMaxDistance(Value);
2017 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2018 ModuleData->SetAutoMeasureCountRateThreshold(Value);
2023 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2024 ModuleData->GetAutoMeasureCellRangeFrom().setX(Value);
2029 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2030 ModuleData->GetAutoMeasureCellRangeFrom().setY(Value);
2035 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2036 ModuleData->GetAutoMeasureCellRangeTo().setX(Value);
2041 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2042 ModuleData->GetAutoMeasureCellRangeTo().setY(Value);
2047 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2048 ModuleData->GetAutoMeasureCellSkip().setX(Value);
2053 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2054 ModuleData->GetAutoMeasureCellSkip().setY(Value);
2059 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2061 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield))
2064 StateMachine.SetCurrentState(StartAutoMeasureLocalization(ModuleData));
2069 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2071 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal) ||
2072 ModuleData->GetLocalizedPositions().empty() || ModuleData->GetWidefieldPosition().IsEmpty())
2075 StateMachine.SetCurrentState(StartAutoMeasureCharacterization(ModuleData));
2080 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance->
ModuleDataGetter());
2082 if (!IsReadyState() || !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Widefield) ||
2083 !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::Confocal) ||
2084 !ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldLocalization))
2087 if (!ModuleData->IsCellRangeValid())
2089 ModuleData->SetUIMessage(
"Please specify a valid cell range.");
2096 ModuleData->ResetCellID();
2098 StateMachine.SetCurrentState(StartAutoMeasureSampleCharacterization(ModuleData));
2103 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2107 return ResetState(ModuleData);
2112 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2114 ResetState(ModuleData);
2116 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalSwitch))
2117 return StateType::SetupTransitionBegin;
2125 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2126 SetupTransitionFinishedTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldConfocalTransitionTime);
2129 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2131 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Unknown)
2133 ModuleData->SetUIMessage(
"Transitioning failed due to unknown destiny setup mode!");
2135 return ResetState(ModuleData);
2138 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2140 TurnOnPumpSourceAfterTransitioning = ModuleData->GetPumpLightTurnedOn();
2141 ModuleData->SetPumpLightTurnedOn(
false);
2144 TurnOnPumpSourceAfterTransitioning =
false;
2146 if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Widefield)
2147 ModuleData->GetWidefieldConfocalSwitch()->Set(
false);
2148 else if (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2149 ModuleData->GetWidefieldConfocalSwitch()->Set(
true);
2151 return StateType::SetupTransitioning;
2156 return std::chrono::system_clock::now() >= SetupTransitionFinishedTimePoint ? StateType::SetupTransitionEnd : StateType::SetupTransitioning;
2161 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2163 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::WidefieldConfocalIndicator)
2164 && ModuleData->GetWidefieldConfocalIndicator()->GetSync() != (ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal))
2166 ModuleData->SetUIMessage(
"Transitioning into " + std::string(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ?
"confocal" :
"widefield") +
" mode failed!");
2167 ModuleData->SetSetupMode(ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal ? WidefieldMicroscopeData::SetupModeType::Widefield : WidefieldMicroscopeData::SetupModeType::Confocal);
2169 return ResetState(ModuleData);
2173 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2175 UpdatePumpPower(ModuleData);
2176 if (TurnOnPumpSourceAfterTransitioning)
2177 ModuleData->SetPumpLightTurnedOn(
true);
2179 return StateType::SetupTransitionFinished;
2189 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2193 if (!ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::FocusAdjustment))
2194 return StateType::AutofocusFinished;
2196 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2197 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2199 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2200 ModuleData->SetLEDLightTurnedOn(
true);
2201 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2202 ModuleData->SetPumpLightTurnedOn(
false);
2204 ModuleData->ResetAutofocusFinished();
2207 return StateType::AutofocusWaiting;
2212 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2216 if (StateMachine.GetContext() == &AutoMeasureSampleContext)
2219 return ModuleData->IsAutofocusFinished() ? StateType::AutofocusFinished : StateType::AutofocusWaiting;
2224 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2226 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2227 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetLEDCameraExposureTime());
2229 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2230 ModuleData->SetLEDLightTurnedOn(
true);
2231 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2232 ModuleData->SetPumpLightTurnedOn(
false);
2235 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage(),
true);
2237 PrepareImageRecording(ModuleData);
2239 return StateType::WaitingForLEDImageReadyToCapture;
2244 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2246 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2247 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2249 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2250 ModuleData->SetLEDLightTurnedOn(
false);
2251 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2252 ModuleData->SetPumpLightTurnedOn(
true);
2254 PrepareImageRecording(ModuleData);
2256 return StateType::WaitingForWidefieldImageReadyToCapture;
2261 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2263 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator) && !ImageCapturingPaused)
2264 return StateMachine.GetCurrentState()->GetState();
2266 RecordImage(ModuleData);
2268 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImageReadyToCapture ?
2269 StateType::WaitingForLEDImage : StateType::WaitingForWidefieldImage;
2274 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2275 auto CameraData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Camera>(ModuleData->GetWidefieldCamera()->GetInstrumentData());
2277 if (CameraData->IsImageAvailbale())
2279 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2280 ModuleData->SetLEDLightTurnedOn(
false);
2281 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2282 ModuleData->SetPumpLightTurnedOn(
false);
2285 SetFocus(ModuleData, ModuleData->GetFocusCurrentVoltage());
2287 ModuleData->SetCurrentImage(CameraData->GetImage());
2289 if (StateMachine.GetCurrentState()->GetState() == StateType::WaitingForWidefieldImage)
2290 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
2292 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator))
2295 return StateMachine.GetCurrentState()->GetState() == StateType::WaitingForLEDImage ?
2296 StateType::WaitingForLEDImageFinished : StateType::WaitingForWidefieldImageFinished;
2299 return StateMachine.GetCurrentState()->GetState();
2304 static constexpr
const char* ReadCellIDErrorMsg =
"Reading cell ID from current image failed. See log for further information.";
2306 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Waiting)
2307 return StateType::WaitingForWidefieldCellID;
2309 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2310 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2312 if (*WidefieldCellIDState == WidefieldImageProcessingStateType::Finished)
2314 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2315 ModuleData->SetCellID(WidefieldLocalizerData->GetCellID());
2317 if (WidefieldLocalizerData->GetCellID().HasCellShift())
2319 MoveSampleTo(ModuleData->GetSamplePosition() +
2320 PositionPointFromPixelDist(ModuleParams, ModuleData, WidefieldLocalizerData->GetCellID().CellShift_px_x, WidefieldLocalizerData->GetCellID().CellShift_px_y),
2323 return StateType::WidefieldCellWaitUntilCentered;
2328 ModuleData->ResetCellID();
2330 if (LogUIMessagesOnly)
2333 ModuleData->SetUIMessage(ReadCellIDErrorMsg);
2336 return StateType::WidefieldCellIDReadFinished;
2341 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2342 if (IsSampleMoving(ModuleData))
2343 return StateType::WidefieldCellWaitUntilCentered;
2345 if (IsCharacterizingSample())
2347 StateMachine.SetContext(&AutoMeasureSampleRecenterCellContext);
2350 return StateType::LEDImageAcquisitionBegin;
2353 return StateType::WidefieldCellIDReadFinished;
2358 static constexpr
const char* LocalizationFailedErrorMsg =
"Localization of emitters in widefield image failed. See log for further information.";
2360 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Waiting)
2361 return StateType::WaitingForWidefieldLocalization;
2363 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2365 if (*WidefieldLocalizationState == WidefieldImageProcessingStateType::Finished)
2367 auto WidefieldLocalizerData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::WidefieldLocalization>(ModuleData->GetWidefieldLocalizer()->GetInstrumentData());
2368 auto& LocalizedPositionsRaw = WidefieldLocalizerData->GetLocalizedPositions();
2371 for (
const auto& Position : LocalizedPositionsRaw)
2372 LocalizedPositions[Util::NumToT<WidefieldMicroscopeData::LocalizedPositionsMapType::key_type>(Position.first)] = { Position.second };
2374 ModuleData->SetLocalizedPositions(std::move(LocalizedPositions));
2378 ModuleData->ClearLocalizedPositions();
2380 if (LogUIMessagesOnly)
2383 ModuleData->SetUIMessage(LocalizationFailedErrorMsg);
2386 return StateType::WidefieldLocalizationFinished;
2391 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2395 ModuleData->GetWidefieldCamera()->StopCapturing();
2397 if (ModuleData->GetWidefieldCamera()->CanSetExposureTime())
2398 ModuleData->GetWidefieldCamera()->SetExposureTimeSync(ModuleData->GetWidefieldCameraExposureTime());
2400 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Confocal);
2402 StateMachine.SetContext(&FindingConfocalSpotBeginContext);
2403 return StateType::SetupTransitionBegin;
2408 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2410 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2411 ModuleData->SetLEDLightTurnedOn(
false);
2412 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2413 ModuleData->SetPumpLightTurnedOn(
true);
2415 PrepareImageRecording(ModuleData);
2417 StateMachine.SetContext(&FindingConfocalSpotRecordingWidefieldImageContext);
2418 return StateType::WaitingForWidefieldImageReadyToCapture;
2423 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2425 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2426 ModuleData->SetPumpLightTurnedOn(
false);
2428 auto IntensityImage = ModuleData->GetCurrentImage().convertToFormat(QImage::Format_Grayscale8);
2429 const unsigned char* DataPtr = IntensityImage.constBits();
2431 QPoint MaxCoord(0, 0);
2432 unsigned char MaxValue = 0;
2433 for (
int y = 0; y < IntensityImage.width(); ++y)
2434 for (
int x = 0; x < IntensityImage.height(); ++x)
2435 if (*DataPtr++ > MaxValue)
2437 MaxCoord = { x, y };
2438 MaxValue = *(DataPtr - 1);
2441 ModuleData->SetConfocalSpotImagePosition(MaxCoord);
2442 ModuleData->SetSetupMode(WidefieldMicroscopeData::SetupModeType::Widefield);
2444 return StateType::SetupTransitionBegin;
2449 if (ConfocalScanPositions.empty())
2452 const auto& Position = ConfocalScanPositions.front();
2455 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2456 ModuleData->GetSampleStageX()->UpdateData();
2457 ModuleData->GetSampleStageY()->UpdateData();
2458 MoveSampleTo(Position, ModuleData);
2461 return StateType::ConfocalScanWaitUntilMoved;
2466 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2467 if (IsSampleMoving(ModuleData))
2468 return StateType::ConfocalScanWaitUntilMoved;
2470 auto MeasuredPos = ModuleData->GetSamplePosition();
2471 ConfocalScanPositions.front().MeasuredX = MeasuredPos.x;
2472 ConfocalScanPositions.front().MeasuredY = MeasuredPos.y;
2474 return StateType::ConfocalScanCapture;
2479 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2481 ModuleData->ResetSPD1State();
2482 ModuleData->ResetSPD2State();
2485 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2488 ModuleData->GetSPD1()->ReadData();
2490 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
2493 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2496 ModuleData->GetSPD2()->ReadData();
2499 return StateType::ConfocalScanWaitUntilCaptured;
2505 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2506 bool UsingSPD2 = ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT);
2509 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2511 if (SPD1DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD1SamplesWritten() + 2)
2512 ModuleData->SetSPD1Ready(SPD1DataSampleStream->ReadSample().Value);
2514 ModuleData->GetSPD1()->ReadData();
2519 auto SPD2Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD2()->GetInstrumentData());
2521 if (SPD2DataSampleStream->GetNumSamplesWritten() >= ModuleData->GetSPD2SamplesWritten() + 2)
2522 ModuleData->SetSPD2Ready(SPD2DataSampleStream->ReadSample().Value);
2524 ModuleData->GetSPD2()->ReadData();
2527 if (ModuleData->GetSPD1Ready() && (!UsingSPD2 || ModuleData->GetSPD2Ready()))
2529 auto ExposureTime = ModuleData->GetSPDExposureTime().count();
2530 double CountRate = (ModuleData->GetSPD1Value() + ModuleData->GetSPD2Value())
2531 / ExposureTime * WidefieldMicroscope::ModuleDataType::SPDTimeType::period::den;
2533 if (StateMachine.GetContext() != &ConfocalOptimizationContext &&
2534 StateMachine.GetContext() != &AutoMeasureCharacterizationContext &&
2535 StateMachine.GetContext() != &AutoMeasureCharacterizationOptimizationContext &&
2536 StateMachine.GetContext() != &AutoMeasureCharacterizationSpectrumContext &&
2537 StateMachine.GetContext() != &AutoMeasureCharacterizationHBTContext &&
2538 !IsCharacterizingSample())
2539 ModuleData->GetConfocalScanResults().emplace_back(ConfocalScanPositions.front(), CountRate);
2540 ModuleData->SetLastCountRate(CountRate);
2542 ConfocalScanPositions.pop_front();
2544 return StateType::ConfocalScanStep;
2547 return StateType::ConfocalScanWaitUntilCaptured;
2552 ConfocalOptimizationInitPromises();
2554 ConfocalOptimizationThreadReturnFuture = std::async(std::launch::async, &WidefieldMicroscope::ConfocalOptimizationThread,
this);
2556 return StateType::ConfocalOptimizationWait;
2561 ConfocalOptimizationInitPromises();
2563 return StateType::ConfocalOptimizationWait;
2569 if (ConfocalOptimizationStateFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2571 const auto State = ConfocalOptimizationStateFuture.get();
2573 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2575 SetFocus(ModuleData, State.Z);
2576 ConfocalScanPositions.clear();
2577 ConfocalScanPositions.emplace_back(State.X, State.Y);
2580 return StateType::DummyState;
2584 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2585 return StateType::ConfocalOptimizationStep;
2587 return StateType::ConfocalOptimizationWait;
2592 static constexpr
const char* OptimizationMaxIterReachedErrorMsg =
"Optimizing confocal count rate failed - maximal number of iterations reached!";
2593 static constexpr
const char* OptimizationFailedErrorMsg =
"Optimizing confocal count rate failed!";
2596 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2598 ConfocalOptimizationPromisesRenewed =
false;
2601 ConfocalOptimizationFeedbackPromise.set_value(-ModuleData->GetLastCountRate());
2605 if (ConfocalOptimizationThreadReturnFuture.wait_for(std::chrono::microseconds(0)) == std::future_status::ready)
2607 auto Result = ConfocalOptimizationThreadReturnFuture.get();
2609 if (++ConfocalOptimizationNumStepsPerformed > 100)
2611 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2612 if (LogUIMessagesOnly)
2615 ModuleData->SetUIMessage(OptimizationMaxIterReachedErrorMsg);
2618 if (Result == ConfocalOptimizationThreadReturnType::NextStep)
2619 return StateType::ConfocalOptimizationInit;
2620 if (Result == ConfocalOptimizationThreadReturnType::Failed)
2622 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2623 if (LogUIMessagesOnly)
2626 ModuleData->SetUIMessage(OptimizationFailedErrorMsg);
2629 return StateType::ConfocalOptimizationFinished;
2633 return StateType::ConfocalOptimizationInitSubStep;
2638 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2639 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2643 if (SPD1Data->GetNumEnqueuedTasks() < 10)
2644 ModuleData->GetSPD1()->ReadData();
2646 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
2647 ModuleData->SetHBTNumEventCounts(SPD1Data->GetHBTResults().EventCounts);
2649 double XMin(std::numeric_limits<double>::max()), XMax(std::numeric_limits<double>::lowest());
2650 double YMin(std::numeric_limits<double>::max()), YMax(std::numeric_limits<double>::lowest());
2651 ModuleData->GetHBTDataPoints().clear();
2652 for (
const auto& ResultItem : SPD1Data->GetHBTResults().ResultVector)
2654 auto X = ResultItem.Time * std::pico::den;
2655 auto Y = ResultItem.Value;
2656 ModuleData->GetHBTDataPoints().append(QPointF(
X,
Y));
2658 XMin = std::min(XMin,
X);
2659 XMax = std::max(XMax,
X);
2660 YMin = std::min(YMin,
Y);
2661 YMax = std::max(YMax,
Y);
2662 ModuleData->SetHBTDataPointsMaxValues({ XMax, YMax });
2663 ModuleData->SetHBTDataPointsMinValues({ XMin, YMin });
2666 if (ModuleData->GetHBTMaxIntegrationTime() > std::chrono::microseconds(0) && ModuleData->GetHBTTotalIntegrationTime() >= ModuleData->GetHBTMaxIntegrationTime())
2668 StopHBT(ModuleData);
2670 return StateType::HBTFinished;
2673 return StateType::HBTAcquiring;
2678 return std::chrono::system_clock::now() >= WaitingEndTimePoint ? StateType::WaitingFinished : StateType::Waiting;
2684 return StateType::SpectrumAcquisitionWaiting;
2689 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2691 if (ModuleData->IncrementAutoMeasureCurrentImageSet() >= ModuleData->GetAutoMeasureNumberImageSets())
2692 return StateType::AutoMeasureLocalizationFinished;
2694 return StateType::LEDImageAcquisitionBegin;
2700 std::filesystem::path Filename;
2703 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2705 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2706 Filename = BuildFilename(ModuleData,
"_LED_" +
Util::ToStr(Index) +
".png");
2709 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2711 return StateType::WidefieldImageAcquisitionBegin;
2716 int Index, ImagePositionScatterRadius;
2717 std::filesystem::path Filename;
2720 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2722 Index = ModuleData->GetAutoMeasureCurrentImageSet();
2723 ImagePositionScatterRadius = ModuleData->GetAutoMeasureImagePositionScatterRadius();
2724 Filename = BuildFilename(ModuleData,
"_WF_" +
Util::ToStr(Index) +
".png");
2727 OnSaveCurrentImage(&Instance, QString::fromUtf16(Filename.u16string().c_str()));
2730 if (ImagePositionScatterRadius > 0)
2732 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2737 if (ModuleData->GetAutoMeasureNumberImageSets() > 2 &&
2738 ModuleData->GetAutoMeasureCurrentImageSet() != ModuleData->GetAutoMeasureNumberImageSets() - 2)
2739 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition() + RandomPointInCircle(ImagePositionScatterRadius), ModuleData);
2741 MoveSampleTo(ModuleData->GetAutoMeasureCurrentCellPosition(), ModuleData);
2743 return StateType::AutoMeasureLocalizationMoving;
2746 return StateType::AutoMeasureLocalizationStep;
2751 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2753 if (IsSampleMoving(ModuleData))
2754 return StateType::AutoMeasureLocalizationMoving;
2756 return StateType::AutoMeasureLocalizationStep;
2761 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2762 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2765 std::stringstream CSVData;
2766 CSVData = ModuleData->AssembleCSVHeader(
false,
false,
true);
2767 CSVData <<
"ID;X(px);Y(px);State\n";
2769 auto& Positions = ModuleData->GetLocalizedPositions();
2770 for (
const auto& Position : Positions)
2771 CSVData << Position.first <<
";" << Position.second.Position.x() <<
";" << Position.second.Position.y() <<
";"
2772 << WidefieldMicroscopeData::GetLocalizedEmitterStateString(Position.second.State) <<
"\n";
2774 if (!
Util::SaveToFile(QString::fromUtf16(BuildFilename(ModuleData,
"_Emitters.csv").u16string().c_str()), CSVData.str()))
2777 if (ModuleData->GetAutoMeasureCurrentEmitter() == ModuleData->GetLocalizedPositions().cend())
2779 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2780 ModuleData->SetPumpLightTurnedOn(
false);
2782 ModuleData->SetAutoMeasureRunning(
false);
2784 return StateType::AutoMeasureCharacterizationFinished;
2787 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::LEDLightToggle))
2788 ModuleData->SetLEDLightTurnedOn(
false);
2789 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::PumpLightToggle))
2790 ModuleData->SetPumpLightTurnedOn(
true);
2792 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Characterizing;
2793 ModuleData->SetLocalizedPositionsStateChanged();
2794 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2795 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2797 ModuleData->ResetAutoMeasureCurrentOptimizationAttempt();
2799 return StateType::AutoMeasureCharacterizationGotoEmitter;
2804 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2805 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2807 if (IsSampleMoving(ModuleData))
2808 return StateType::AutoMeasureCharacterizationGotoEmitter;
2810 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2811 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2813 ModuleData->ResetAutoMeasureCurrentOptimizationRerun();
2814 InitializeConfocalOptimizer(ModuleData);
2816 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2818 SetHBTSwitch(ModuleParams, ModuleData,
true);
2820 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2822 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationOptimizationContext : &AutoMeasureCharacterizationOptimizationContext);
2823 return StateType::Waiting;
2826 return StateType::ConfocalOptimizationInit;
2829 return StateType::AutoMeasureCharacterizationOptimizationFinished;
2834 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2835 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2837 const auto EmitterDestiny = CalcMarkerToConfocalSpotDestiny(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2838 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2840 if (ModuleData->GetLastCountRate() >= ModuleData->GetAutoMeasureCountRateThreshold() &&
2841 EmitterDestiny.DistTo(ModuleData->GetSamplePosition()) <= ModuleData->GetAutoMeasureOptimizationMaxDistance())
2844 if (ModuleData->GetAutoMeasureSpectrumEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator))
2846 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2848 SetHBTSwitch(ModuleParams, ModuleData,
false);
2850 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2852 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationSpectrumContext : &AutoMeasureCharacterizationSpectrumContext);
2853 return StateType::Waiting;
2856 return StateType::AutoMeasureCharacterizationSpectrumBegin;
2859 return StateType::AutoMeasureCharacterizationSpectrumFinished;
2862 if (ModuleData->GetAutoMeasureOptimizeEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::ConfocalOptimization) &&
2863 ModuleData->GetSetupMode() == WidefieldMicroscopeData::SetupModeType::Confocal)
2865 if (ModuleData->IncrementAutoMeasureCurrentOptimizationRerun() >= ModuleData->GetAutoMeasureMaxOptimizationReruns())
2867 if (ModuleData->IncrementAutoMeasureCurrentOptimizationAttempt() <= ModuleData->GetAutoMeasureNumOptimizationAttempts())
2869 BringMarkerToConfocalSpot(ModuleParams, ModuleData, ModuleData->GetAutoMeasureCurrentEmitter()->second.Position,
2870 { static_cast<qreal>(ModuleData->GetWidefieldPosition().x), static_cast<qreal>(ModuleData->GetWidefieldPosition().y) });
2872 return StateType::AutoMeasureCharacterizationGotoEmitter;
2877 InitializeConfocalOptimizer(ModuleData);
2879 return StateType::ConfocalOptimizationInit;
2883 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Failed;
2884 ModuleData->SetLocalizedPositionsStateChanged();
2886 ModuleData->IncrementAutoMeasureCurrentEmitter();
2887 return StateType::AutoMeasureCharacterizationStep;
2892 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2895 BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_Spectrum.csv").string() });
2897 return StateType::SpectrumAcquisitionWaiting;
2902 auto ModuleParams = DynExp::dynamic_Params_cast<WidefieldMicroscope>(Instance.
ParamsGetter());
2903 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2905 if (ModuleData->GetAutoMeasureHBTEnabled() && ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBT))
2907 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::HBTSwitch))
2909 SetHBTSwitch(ModuleParams, ModuleData,
true);
2911 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->WidefieldHBTTransitionTime);
2913 StateMachine.SetContext(IsCharacterizingSample() ? &AutoMeasureSampleCharacterizationHBTContext : &AutoMeasureCharacterizationHBTContext);
2914 return StateType::Waiting;
2917 return StateType::AutoMeasureCharacterizationHBTBegin;
2920 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Finished;
2921 ModuleData->SetLocalizedPositionsStateChanged();
2923 ModuleData->IncrementAutoMeasureCurrentEmitter();
2924 return StateType::AutoMeasureCharacterizationStep;
2929 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2931 InitializeHBT(ModuleData);
2933 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
2938 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2939 auto SPD1Data = DynExp::dynamic_InstrumentData_cast<DynExpInstr::TimeTagger>(ModuleData->GetSPD1()->GetInstrumentData());
2943 if (SPD1Data->GetNumEnqueuedTasks() < 10)
2944 ModuleData->GetSPD1()->ReadData();
2946 ModuleData->SetHBTTotalIntegrationTime(SPD1Data->GetHBTResults().IntegrationTime);
2948 if (HBTIntegrationTimeBeforeReset <= std::chrono::milliseconds(10) || ModuleData->GetHBTTotalIntegrationTime() < HBTIntegrationTimeBeforeReset)
2949 return StateType::HBTAcquiring;
2951 return StateType::AutoMeasureCharacterizationHBTWaitForInit;
2956 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2958 auto Filename = BuildFilename(ModuleData,
"_Emitter" +
Util::ToStr(ModuleData->GetAutoMeasureCurrentEmitter()->first) +
"_g2.csv");
2959 std::stringstream CSVData;
2961 CSVData = ModuleData->AssembleCSVHeader(
false,
true,
false);
2962 ModuleData->WriteHBTResults(CSVData);
2964 ModuleData->GetAutoMeasureCurrentEmitter()->second.State = WidefieldMicroscopeData::LocalizedEmitterStateType::Finished;
2965 ModuleData->SetLocalizedPositionsStateChanged();
2967 if (!
Util::SaveToFile(QString::fromUtf16(Filename.u16string().c_str()), CSVData.str()))
2970 ModuleData->IncrementAutoMeasureCurrentEmitter();
2971 return StateType::AutoMeasureCharacterizationStep;
2976 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2978 if (IsSampleMoving(ModuleData))
2979 return StateType::AutoMeasureSampleStep;
2982 return StartAutofocus(ModuleData);
2987 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2989 return InitiateReadCellIDFromImage(ModuleData);
2994 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
2998 if (!ModuleData->GetCellID().Valid)
3000 ModuleData->SetCellIDToLastCellID();
3001 ModuleData->IncrementCellID();
3010 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) < ModuleData->GetAutoMeasureCellRangeFrom().x() ||
3011 Util::NumToT<int>(ModuleData->GetCellID().Y_id) < ModuleData->GetAutoMeasureCellRangeFrom().y() ||
3012 Util::NumToT<int>(ModuleData->GetCellID().X_id) > ModuleData->GetAutoMeasureCellRangeTo().x() ||
3013 Util::NumToT<int>(ModuleData->GetCellID().Y_id) > ModuleData->GetAutoMeasureCellRangeTo().y())
3015 ModuleData->SetUIMessage(
"The current cell's ID is outside the specified cell range. Probably moved in wrong direction? Characterizing the sample cannot continue.");
3017 return ResetState(ModuleData);
3020 if (ModuleData->GetLastCellID().Valid && ModuleData->GetLastCellID() >= ModuleData->GetCellID())
3022 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.");
3024 return ResetState(ModuleData);
3027 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3028 return StartAutoMeasureLocalization(ModuleData);
3030 return InitiateLocalizationFromImage(ModuleData);
3035 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3038 if (ModuleData->GetLocalizedPositions().empty())
3043 ModuleData->SetWidefieldPosition(ModuleData->GetSamplePosition());
3045 return StateType::AutoMeasureSampleAdvanceCell;
3048 return StartAutoMeasureLocalization(ModuleData);
3053 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3055 if (ModuleData->TestFeature(WidefieldMicroscopeData::FeatureType::InterModuleCommunicator))
3058 if (ModuleData->GetAutoMeasureLocalizationType() == WidefieldMicroscopeWidget::LocalizationType::LocalizeEmittersFromImage)
3059 return InitiateLocalizationFromImage(ModuleData);
3061 return StateType::WidefieldLocalizationFinished;
3066 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3068 return StartAutoMeasureCharacterization(ModuleData);
3083 auto ModuleData = DynExp::dynamic_ModuleData_cast<WidefieldMicroscope>(Instance.
ModuleDataGetter());
3085 if (ModuleData->GetWidefieldPosition().IsEmpty())
3087 ModuleData->SetUIMessage(
"The current widefield image's position is invalid. Characterizing the sample cannot continue.");
3089 return ResetState(ModuleData);
3093 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x() &&
3094 Util::NumToT<int>(ModuleData->GetCellID().Y_id) == ModuleData->GetAutoMeasureCellRangeTo().y())
3095 return StateType::AutoMeasureSampleFinished;
3098 if (Util::NumToT<int>(ModuleData->GetCellID().X_id) == ModuleData->GetAutoMeasureCellRangeTo().x())
3100 ModuleData->GetWidefieldPosition().x - Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()) * (ModuleData->GetAutoMeasureCellLineLength() - 1),
3101 ModuleData->GetWidefieldPosition().y + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().y())
3105 ModuleData->GetWidefieldPosition().x + Util::NumToT<WidefieldMicroscopeData::PositionType>(ModuleData->GetAutoMeasureCellSkip().x()),
3106 ModuleData->GetWidefieldPosition().y
3109 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,...
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()
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
QPoint AutoMeasureCellRangeTo
Util::picoseconds HBTBinWidth
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.
auto & GetHBTDataPoints() noexcept
double ConfocalOptimizationInitZStepSize
@ InterModuleCommunicator
void ClearConfocalScanResults()
long long HBTNumEventCounts
LocalizedPositionsMapType::iterator AutoMeasureFirstEmitter
Iterator to the first emitter to be characterized.
double ConfocalOptimizationTolerance
auto & GetSampleStageY() noexcept
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
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > PumpSwitch
QPointF HBTDataPointsMaxValues
std::vector< std::unique_ptr< QSurfaceDataRow > > QSurfaceDataRowsType
int GetAutoMeasureCurrentCellIndex() const
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)
auto & GetConfocalScanResults() noexcept
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
auto & GetSampleStageX() 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 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
void OnToggleAutoMeasureSpectrumEnabled(DynExp::ModuleInstance *Instance, int State) 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
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 OnToggleAutoMeasureHBTEnabled(DynExp::ModuleInstance *Instance, int State) 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 OnToggleAutoMeasureOptimizeEnabled(DynExp::ModuleInstance *Instance, int State) const
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 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
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 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 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
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)
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. Indirectly calls ModuleBase::RemoveRegistere...
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.
Base class for all tasks being processed by instruments. The class must not contain public virtual fu...
Logs events like errors and writes them immediately to a HTML file in a human-readable format....
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...
@ Y
Y component of the signal in cartesian coordinates.
@ X
X component of the signal in cartesian coordinates.
@ 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.
std::chrono::duration< double > seconds
Extends std::chrono by a duration data type for seconds capable of storing fractions of seconds.
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