DynExp
Highly flexible laboratory automation for dynamically changing experiments.
WidefieldMicroscope.h
Go to the documentation of this file.
1 // This file is part of DynExp.
2 
8 #pragma once
9 
10 #include "stdafx.h"
11 #include "DynExpCore.h"
12 #include "../../MetaInstruments/Stage.h"
13 #include "../../MetaInstruments/DigitalOut.h"
14 #include "../../MetaInstruments/DigitalIn.h"
15 #include "../../MetaInstruments/AnalogOut.h"
16 #include "../../MetaInstruments/AnalogIn.h"
17 #include "../../MetaInstruments/Camera.h"
18 #include "../../MetaInstruments/TimeTagger.h"
19 #include "../../Instruments/InterModuleCommunicator.h"
20 #include "../../Instruments/WidefieldLocalization.h"
21 #include "../../Modules/ImageViewer/ImageViewerEvents.h"
22 #include "../../Modules/SpectrumViewer/SpectrumViewerEvents.h"
23 
25 
27 {
29  {
30  public:
39 
41  {
42  QPoint Position;
44  };
45 
48 
51  using LocalizedPositionsMapType = std::map<Util::MarkerGraphicsView::MarkerType::IDType, LocalizedEmitterType>;
52  using SPDTimeType = std::chrono::milliseconds;
53  using QSurfaceDataRowsType = std::vector<std::unique_ptr<QSurfaceDataRow>>;
54 
56  {
57  constexpr PositionPoint() noexcept
58  : x(0), y(0), z(0), MeasuredX(0), MeasuredY(0), MeasuredZ(0),
59  UsingX(false), UsingY(false), UsingZ(false), RowIndex(-1), ColumnIndex(-1) {}
60  constexpr PositionPoint(PositionType x) noexcept
61  : x(x), y(0), z(0), MeasuredX(0), MeasuredY(0), MeasuredZ(0),
62  UsingX(true), UsingY(false), UsingZ(false), RowIndex(-1), ColumnIndex(-1) {}
64  : x(x), y(y), z(0), MeasuredX(0), MeasuredY(0), MeasuredZ(0),
65  UsingX(true), UsingY(true), UsingZ(false), RowIndex(-1), ColumnIndex(-1) {}
67  : x(x), y(y), z(z), MeasuredX(0), MeasuredY(0), MeasuredZ(0),
68  UsingX(true), UsingY(true), UsingZ(true), RowIndex(-1), ColumnIndex(-1) {}
69 
70  constexpr void Reset() noexcept;
71  constexpr bool IsEmpty() const noexcept { return !UsingX && !UsingY && !UsingZ; }
72  double DistTo(const PositionPoint& Other) const;
73 
74  std::string ToStr(std::string_view Prefix = "") const;
75 
79 
83 
84  bool UsingX;
85  bool UsingY;
86  bool UsingZ;
87 
88  int RowIndex;
90  };
91 
92  struct SPDStateType
93  {
94  constexpr SPDStateType(double Value = 0, bool Ready = false, size_t StreamSamplesWritten = 0) noexcept
96 
97  constexpr void Reset() noexcept
98  {
99  Value = 0;
100  Ready = false;
102  }
103 
104  double Value;
105  bool Ready;
107  };
108 
110  virtual ~WidefieldMicroscopeData() = default;
111 
112  auto& GetSampleStageX() noexcept { return SampleStageX; }
113  auto& GetSampleStageX() const noexcept { return SampleStageX; }
114  auto& GetSampleStageY() noexcept { return SampleStageY; }
115  auto& GetSampleStageY() const noexcept { return SampleStageY; }
116  auto& GetSampleStageZ() noexcept { return SampleStageZ; }
117  auto& GetSampleStageZ() const noexcept { return SampleStageZ; }
118  auto& GetSampleFocusPiezoZ() noexcept { return FocusPiezoZ; }
119  auto& GetSampleFocusPiezoZ() const noexcept { return FocusPiezoZ; }
120  auto& GetLEDSwitch() noexcept { return LEDSwitch; }
121  auto& GetLEDSwitch() const noexcept { return LEDSwitch; }
122  auto& GetPumpSwitch() noexcept { return PumpSwitch; }
123  auto& GetPumpSwitch() const noexcept { return PumpSwitch; }
125  auto& GetWidefieldConfocalSwitch() const noexcept { return WidefieldConfocalSwitch; }
128  auto& GetWidefieldHBTSwitch() noexcept { return WidefieldHBTSwitch; }
129  auto& GetWidefieldHBTSwitch() const noexcept { return WidefieldHBTSwitch; }
130  auto& GetPumpPower() noexcept { return PumpPower; }
131  auto& GetPumpPower() const noexcept { return PumpPower; }
132  auto& GetPumpPowerIndicator() noexcept { return PumpPowerIndicator; }
133  auto& GetPumpPowerIndicator() const noexcept { return PumpPowerIndicator; }
134  auto& GetWidefieldCamera() noexcept { return WidefieldCamera; }
135  auto& GetWidefieldCamera() const noexcept { return WidefieldCamera; }
136  auto& GetWidefieldLocalizer() noexcept { return WidefieldLocalizer; }
137  auto& GetWidefieldLocalizer() const noexcept { return WidefieldLocalizer; }
138  auto& GetSPD1() noexcept { return SPD1; }
139  auto& GetSPD1() const noexcept { return SPD1; }
140  auto& GetSPD2() noexcept { return SPD2; }
141  auto& GetSPD2() const noexcept { return SPD2; }
142  auto& GetAcqCommunicator() noexcept { return AcqCommunicator; }
143  auto& GetAcqCommunicator() const noexcept { return AcqCommunicator; }
144 
145  template <size_t N>
146  bool TestFeature(const std::array<FeatureType, N>& Flags) const { return Features.Test(Flags); }
147 
148  bool TestFeature(FeatureType Flag) const { return Features.Test(Flag); }
149  void SetFeature(FeatureType Flag) { Features.Set(Flag); }
150 
151  std::string_view GetUIMessage() const noexcept { return UIMessage; }
152  void SetUIMessage(const std::string& Message) { UIMessage = Message; }
153  void ClearUIMessage() { UIMessage = ""; }
154 
155  PositionPoint GetSamplePosition() const;
156  std::stringstream AssembleCSVHeader(bool IncludeConfocalScan, bool IncludeHBT, bool IncludeAutoMeasure) const;
157  void WriteConfocalScanResults(std::stringstream& Stream) const;
158  void WriteHBTResults(std::stringstream& Stream) const;
159 
160  SetupModeType GetSetupMode() const noexcept { return SetupMode; }
161  void SetSetupMode(SetupModeType NewMode) noexcept { SetupMode = NewMode; }
162  bool GetLEDLightTurnedOn() const noexcept { return LEDLightTurnedOn; }
163  void SetLEDLightTurnedOn(bool State);
164  bool GetPumpLightTurnedOn() const noexcept { return PumpLightTurnedOn; }
165  void SetPumpLightTurnedOn(bool State);
166  double GetMinPumpPower() const noexcept { return MinPumpPower; }
167  void SetMinPumpPower(double MinPower) noexcept { MinPumpPower = MinPower; }
168  double GetMaxPumpPower() const noexcept { return MaxPumpPower; }
169  void SetMaxPumpPower(double MaxPower) noexcept { MaxPumpPower = MaxPower; }
170  double GetWidefieldPumpPower() const noexcept { return WidefieldPumpPower; }
171  void SetWidefieldPumpPower(double Power) noexcept { WidefieldPumpPower = Power; }
172  double GetConfocalPumpPower() const noexcept { return ConfocalPumpPower; }
173  void SetConfocalPumpPower(double Power) noexcept { ConfocalPumpPower = Power; }
174  double GetMeasuredPumpPower() const noexcept { return MeasuredPumpPower; }
175  void SetMeasuredPumpPower(double MeasuredPower) noexcept { MeasuredPumpPower = MeasuredPower; }
176  double GetMinFocusVoltage() const noexcept { return MinFocusVoltage; }
177  void SetMinFocusVoltage(double MinVoltage) noexcept { MinFocusVoltage = MinVoltage; }
178  double GetMaxFocusVoltage() const noexcept { return MaxFocusVoltage; }
179  void SetMaxFocusVoltage(double MaxVoltage) noexcept { MaxFocusVoltage = MaxVoltage; }
180  double GetFocusCurrentVoltage() const noexcept { return FocusCurrentVoltage; }
181  void SetFocusCurrentVoltage(double CurrentVoltage) noexcept { FocusCurrentVoltage = CurrentVoltage; }
182  double GetFocusZeroVoltage() const noexcept { return FocusZeroVoltage; }
183  void SetFocusZeroVoltage(double ZeroVoltage) noexcept { FocusZeroVoltage = ZeroVoltage; }
184  double GetFocusConfocalOffsetVoltage() const noexcept { return FocusConfocalOffsetVoltage; }
185  void SetFocusConfocalOffsetVoltage(double ConfocalOffsetVoltage) noexcept { FocusConfocalOffsetVoltage = ConfocalOffsetVoltage; }
186  bool IsAutofocusFinished() const noexcept { return AutofocusFinished; }
187  void SetAutofocusFinished() noexcept { AutofocusFinished = true; }
188  void ResetAutofocusFinished() noexcept { AutofocusFinished = false; }
189 
198  QPoint GetConfocalSpotImagePosition() const noexcept { return ConfocalSpotImagePosition; }
199  void SetConfocalSpotImagePosition(const QPoint& Position) noexcept { ConfocalSpotImagePosition = Position; }
200  const PositionPoint& GetWidefieldPosition() const noexcept { return WidefieldPosition; }
201  void SetWidefieldPosition(const PositionPoint& Position) noexcept { WidefieldPosition = Position; }
202 
203  const QImage& GetCurrentImage() const noexcept { return CurrentImage; }
204  void SetCurrentImage(QImage&& Image) { CurrentImage = std::move(Image); CurrentImageChanged = true; }
205  bool IsCurrentImageAvlbl() const { return !CurrentImage.isNull() && CurrentImageChanged; }
206  void ResetCurrentImageAvlbl() noexcept { CurrentImageChanged = false; }
207  const auto& GetCellID() const noexcept { return CurrentCellID; }
208  const auto& GetLastCellID() const noexcept { return LastCellID; }
211  void IncrementCellID();
212  void ResetCellID() { CurrentCellID = {}; LastCellID = {}; }
213  bool HasCellID() const noexcept { return CurrentCellID.Valid; }
214  auto& GetLocalizedPositions() noexcept { return LocalizedPositions; }
215  const auto& GetLocalizedPositions() const noexcept { return LocalizedPositions; }
216  size_t GetNumFinishedLocalizedPositions() const;
217  size_t GetNumFailedLocalizedPositions() const;
218  void AppendLocalizedPosition(LocalizedPositionsMapType::value_type&& Position);
226 
227  const PositionPoint& GetSampleHomePosition() const noexcept { return SampleHomePosition; }
228  void SetSampleHomePosition(const PositionPoint& Position) noexcept { SampleHomePosition = Position; }
229  int GetConfocalScanWidth() const noexcept { return ConfocalScanWidth; }
230  void SetConfocalScanWidth(int Width) noexcept { ConfocalScanWidth = Width; }
231  int GetConfocalScanHeight() const noexcept { return ConfocalScanHeight; }
232  void SetConfocalScanHeight(int Length) noexcept { ConfocalScanHeight = Length; }
233  int GetConfocalScanDistPerPixel() const noexcept { return ConfocalScanDistPerPixel; }
234  void SetConfocalScanDistPerPixel(int DistPerPixel) noexcept { ConfocalScanDistPerPixel = DistPerPixel; }
235  SPDTimeType GetSPDExposureTime() const noexcept { return SPDExposureTime; }
236  void SetSPDExposureTime(SPDTimeType Time) noexcept { SPDExposureTime = Time; }
237  auto GetSPD1SamplesWritten() const noexcept { return SPD1State.StreamSamplesWritten; }
238  bool GetSPD1Ready() const noexcept { return SPD1State.Ready; }
239  auto GetSPD1Value() const noexcept { return SPD1State.Value; }
240  void SetSPD1SamplesWritten(size_t SamplesWritten) noexcept { SPD1State.StreamSamplesWritten = SamplesWritten; }
241  void SetSPD1Ready(double Value) noexcept { SPD1State.Value = Value; SPD1State.Ready = true; }
242  void ResetSPD1State() noexcept { SPD1State.Reset(); }
243  auto GetSPD2SamplesWritten() const noexcept { return SPD2State.StreamSamplesWritten; }
244  bool GetSPD2Ready() const noexcept { return SPD2State.Ready; }
245  auto GetSPD2Value() const noexcept { return SPD2State.Value; }
246  void SetSPD2SamplesWritten(size_t SamplesWritten) noexcept { SPD2State.StreamSamplesWritten = SamplesWritten; }
247  void SetSPD2Ready(double Value) noexcept { SPD2State.Value = Value; SPD2State.Ready = true; }
248  void ResetSPD2State() noexcept { SPD2State.Reset(); }
249 
250  auto& GetConfocalScanResults() noexcept { return ConfocalScanResults; }
251  const auto& GetConfocalScanResults() const noexcept { return ConfocalScanResults; }
253  auto GetConfocalScanSurfacePlotRows() noexcept { return std::move(ConfocalScanSurfacePlotRows); }
254  void SetConfocalScanSurfacePlotRows(QSurfaceDataRowsType&& QSurfaceDataRows) noexcept { ConfocalScanSurfacePlotRows = std::move(QSurfaceDataRows); }
255  bool HasConfocalScanSurfacePlotRows() const noexcept { return !ConfocalScanSurfacePlotRows.empty(); }
257 
259  void SetConfocalOptimizationInitXYStepSize(double StepSize) noexcept { ConfocalOptimizationInitXYStepSize = StepSize; }
261  void SetConfocalOptimizationInitZStepSize(double StepSize) noexcept { ConfocalOptimizationInitZStepSize = StepSize; }
263  void SetConfocalOptimizationTolerance(double Tolerance) noexcept { ConfocalOptimizationTolerance = Tolerance; }
264  double GetLastCountRate() const noexcept { return LastCountRate; }
265  void SetLastCountRate(double CountRate) noexcept { LastCountRate = CountRate; }
266 
267  auto GetHBTBinWidth() const noexcept { return HBTBinWidth; }
268  void SetHBTBinWidth(Util::picoseconds BinWidth) noexcept { HBTBinWidth = BinWidth; }
269  auto GetHBTBinCount() const noexcept { return HBTBinCount; }
270  void SetHBTBinCount(size_t BinCount) noexcept { HBTBinCount = BinCount; }
271  auto GetHBTMaxIntegrationTime() const noexcept { return HBTMaxIntegrationTime; }
272  void SetHBTMaxIntegrationTime(std::chrono::microseconds MaxIntegrationTime) noexcept { HBTMaxIntegrationTime = MaxIntegrationTime; }
273  const PositionPoint& GetHBTSamplePosition() const noexcept { return HBTSamplePosition; }
274  void SetHBTSamplePosition(const PositionPoint& Position) noexcept { HBTSamplePosition = Position; }
275  auto GetHBTNumEventCounts() const noexcept { return HBTNumEventCounts; }
276  void SetHBTNumEventCounts(long long NumEventCounts) noexcept { HBTNumEventCounts = NumEventCounts; }
277  auto GetHBTTotalIntegrationTime() const noexcept { return HBTTotalIntegrationTime; }
278  void SetHBTTotalIntegrationTime(std::chrono::microseconds TotalIntegrationTime) noexcept { HBTTotalIntegrationTime = TotalIntegrationTime; }
279  auto& GetHBTDataPoints() noexcept { return HBTDataPoints; }
280  const auto& GetHBTDataPoints() const noexcept { return HBTDataPoints; }
281  void ClearHBTDataPoints() { HBTDataPoints.clear(); }
282  auto GetHBTDataPointsMinValues() const noexcept { return HBTDataPointsMinValues; }
283  void SetHBTDataPointsMinValues(const QPointF& DataPointsMinValues) noexcept { HBTDataPointsMinValues = DataPointsMinValues; }
284  auto GetHBTDataPointsMaxValues() const noexcept { return HBTDataPointsMaxValues; }
285  void SetHBTDataPointsMaxValues(const QPointF& DataPointsMaxValues) noexcept { HBTDataPointsMaxValues = DataPointsMaxValues; }
286 
287  bool IsAutoMeasureRunning() const noexcept { return AutoMeasureRunning; }
289  std::filesystem::path GetAutoMeasureSavePath() const;
290  void SetAutoMeasureSavePath(std::filesystem::path SavePath) noexcept { AutoMeasureSavePath = SavePath; }
294  void SetAutoMeasureNumberImageSets(int NumberImageSets) noexcept { AutoMeasureNumberImageSets = NumberImageSets; }
301  void SetAutoMeasureImagePositionScatterRadius(int ScatterRadius) noexcept { AutoMeasureImagePositionScatterRadius = ScatterRadius; }
305  void SetAutoMeasureOptimizeEnabled(bool Enabled) noexcept { AutoMeasureOptimizeEnabled = Enabled; }
307  void SetAutoMeasureSpectrumEnabled(bool Enabled) noexcept { AutoMeasureSpectrumEnabled = Enabled; }
308  auto GetAutoMeasureHBTEnabled() const noexcept { return AutoMeasureHBTEnabled; }
309  void SetAutoMeasureHBTEnabled(bool Enabled) noexcept { AutoMeasureHBTEnabled = Enabled; }
311  void SetAutoMeasureNumOptimizationAttempts(int NumOptimizationAttempts) noexcept { AutoMeasureNumOptimizationAttempts = NumOptimizationAttempts; }
316  void SetAutoMeasureMaxOptimizationReruns(int MaxOptimizationReruns) noexcept { AutoMeasureMaxOptimizationReruns = MaxOptimizationReruns; }
321  void SetAutoMeasureOptimizationMaxDistance(int OptimizationMaxDistance) noexcept { AutoMeasureOptimizationMaxDistance = OptimizationMaxDistance; }
323  void SetAutoMeasureCountRateThreshold(int CountRateThreshold) noexcept { AutoMeasureCountRateThreshold = CountRateThreshold; }
324  auto& GetAutoMeasureCellRangeFrom() const noexcept { return AutoMeasureCellRangeFrom; }
326  auto& GetAutoMeasureCellRangeTo() const noexcept { return AutoMeasureCellRangeTo; }
328  bool IsCellRangeValid() const noexcept;
329  int GetAutoMeasureCellLineLength() const noexcept;
330  int GetAutoMeasureCellColumnLength() const noexcept;
331  int GetAutoMeasureCellCount() const noexcept;
332  int GetAutoMeasureCurrentCellIndex() const;
333  auto& GetAutoMeasureCellSkip() const noexcept { return AutoMeasureCellSkip; }
334  auto& GetAutoMeasureCellSkip() noexcept { return AutoMeasureCellSkip; }
335  auto GetAutoMeasureFirstEmitter() const noexcept { return AutoMeasureFirstEmitter; }
337  auto GetAutoMeasureCurrentEmitter() const noexcept { return AutoMeasureCurrentEmitter; }
338  void ResetAutoMeasureCurrentEmitter() noexcept;
340 
341  private:
342  void ResetImpl(dispatch_tag<QModuleDataBase>) override final;
344 
345  void Init();
346 
363 
365  std::string UIMessage;
366 
367  // General
371  double MinPumpPower;
372  double MaxPumpPower;
382 
383  // Widefield imaging
390 
391  QImage CurrentImage;
398 
399  // Confocal scanning
407 
408  // Confocal optimization
413 
414  // vector of pairs <sample stage positions in nm, count rate in Hz>
415  std::vector<std::pair<PositionPoint, double>> ConfocalScanResults;
417 
418  // HBT
420  size_t HBTBinCount;
421  std::chrono::microseconds HBTMaxIntegrationTime;
423  long long HBTNumEventCounts;
424  std::chrono::microseconds HBTTotalIntegrationTime;
425 
426  // x is time in ps, y is g2.
427  QList<QPointF> HBTDataPoints;
430 
431  // Auto measure
433  std::filesystem::path AutoMeasureSavePath;
452  LocalizedPositionsMapType::iterator AutoMeasureFirstEmitter;
453  LocalizedPositionsMapType::iterator AutoMeasureCurrentEmitter;
454  };
455 
458 
460  {
461  public:
463  virtual ~WidefieldMicroscopeParams() = default;
464 
465  virtual const char* GetParamClassTag() const noexcept override { return "WidefieldMicroscopeParams"; }
466 
468  "SampleStageX", "Sample stage X", "Positioner to move sample along x coordinate", DynExpUI::Icons::Instrument, true };
470  "SampleStageY", "Sample stage Y", "Positioner to move sample along y coordinate", DynExpUI::Icons::Instrument, true };
472  "SampleStageZ", "Sample stage Z", "Positioner to move sample along z coordinate", DynExpUI::Icons::Instrument, true };
474  "FocusPiezoZ", "Focusing piezo (AO)", "Piezo to adjust the focus of the microscope", DynExpUI::Icons::Instrument, true };
476  "LEDSwitch", "LED switch (DO)", "Digital switch to turn the LED light source on and off", DynExpUI::Icons::Instrument, true };
478  "PumpSwitch", "Pump switch (DO)", "Digital switch to turn the pump light source on and off", DynExpUI::Icons::Instrument, true };
480  "WidefieldConfocalSwitch", "Widefield/confocal mode switch (DO)",
481  "Digital switch to change from widefield mode (LOW) to confocal mode (HIGH)", DynExpUI::Icons::Instrument, true };
483  "WidefieldConfocalIndicator", "Widefield/confocal mode indicator (DI)",
484  "Digital indicator which is LOW if in widefield mode and HIGH if in confocal mode", DynExpUI::Icons::Instrument, true };
485  Param<ParamsConfigDialog::NumberType> WidefieldConfocalTransitionTime = { *this, "WidefieldConfocalTransitionTime",
486  "Widefield/confocal transition time (ms)",
487  "Time it takes to transition from widefield into confocal mode or vice versa once the widefield/confocal mode switch has been triggered",
488  false, 500, 0, 10000, 10, 0 };
490  "WidefieldHBTSwitch", "HBT flip mirror servo actuator (DO)", "Servo actuator to switch to HBT measurement mode", DynExpUI::Icons::Instrument, true };
491  Param<ParamsConfigDialog::NumberType> WidefieldHBTSwitchLowDutyCycle = { *this, "WidefieldHBTSwitchLowDutyCycle",
492  "HBT flip mirror low duty cycle",
493  "Duty cycle of rectangular pulses applied to the HBT flip mirror servo actuator in order to make it flip the mirror into the low position",
494  false, .2, 0, 1, .1, 2 };
495  Param<ParamsConfigDialog::NumberType> WidefieldHBTSwitchHighDutyCycle = { *this, "WidefieldHBTSwitchHighDutyCycle",
496  "HBT flip mirror high duty cycle",
497  "Duty cycle of rectangular pulses applied to the HBT flip mirror servo actuator in order to make it flip the mirror into the high position",
498  false, .8, 0, 1, .1, 2 };
499  Param<ParamsConfigDialog::NumberType> WidefieldHBTTransitionTime = { *this, "WidefieldHBTTransitionTime",
500  "HBT flip mirror transition time (ms)",
501  "Time it takes to flip the HBT mirror once the duty cycle of the rectangular pulses applied to the flip mirror servo actuator has changed",
502  false, 500, 0, 10000, 10, 0 };
504  "PumpPower", "Pump power (AO)", "Analog output to adjust the power of the pump light source", DynExpUI::Icons::Instrument, true };
506  "PumpPowerIndicator", "Pump power indicator (AI)", "Analog input to measure the current power of the pump light source",
508  Param<ParamsConfigDialog::NumberType> DefaultPowerWidefieldMode = { *this, "DefaultPowerWidefieldMode", "Default pump power (widefield mode)",
509  "Defines the pump power in units of the pump power (AO) parameter which is initially used in the widefield mode",
510  true, 1, 0, std::numeric_limits<ParamsConfigDialog::NumberType>::max(), .1, 3 };
511  Param<ParamsConfigDialog::NumberType> DefaultPowerConfocalMode = { *this, "DefaultPowerConfocalMode", "Default pump power (confocal mode)",
512  "Defines the pump power in units of the pump power (AO) parameter which is initially used in the confocal mode",
513  true, .1, 0, std::numeric_limits<ParamsConfigDialog::NumberType>::max(), .1, 3 };
515  "WidefieldCamera", "Widefield camera", "Camera to record widefield images of the sample", DynExpUI::Icons::Instrument, true };
517  "WidefieldLocalizer", "Widefield localizer", "gRPC service to perform widefield localization of emitters within a recorded camera image",
519  Param<ParamsConfigDialog::NumberType> WidefieldCameraMagnification = { *this, "WidefieldCameraMagnification", "Widefield camera magnification factor",
520  "Magnification factor of the optical system between the sample and the widefield camera",
521  false, 100, .01, 10000, 1, 2 };
522  Param<DynExp::ObjectLink<DynExpInstr::TimeTagger>> SPD1 = { *this, GetCore().GetInstrumentManager(),
523  "SPD1", "SPD 1", "First single photon detector for confocal light collection", DynExpUI::Icons::Instrument, true };
524  Param<DynExp::ObjectLink<DynExpInstr::TimeTagger>> SPD2 = { *this, GetCore().GetInstrumentManager(),
525  "SPD2", "SPD 2", "Second single photon detector for confocal light collection", DynExpUI::Icons::Instrument, true };
527  "AcqInterModuleCommunicator", "Acq. inter-module communicator", "Inter-module communicator to control image and spectrum capturing modules with", DynExpUI::Icons::Instrument, true };
528 
529  private:
531  };
532 
534  {
535  public:
538 
540  virtual ~WidefieldMicroscopeConfigurator() = default;
541 
542  private:
543  virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore& Core) const override final { return DynExp::MakeParams<WidefieldMicroscopeConfigurator>(ID, Core); }
544  };
545 
547  {
550 
551  using AtomicPositionerStateType = std::atomic<PositionerStateType>;
552  using AtomicWidefieldImageProcessingStateType = std::atomic<WidefieldImageProcessingStateType>;
553 
554  public:
558 
559  constexpr static auto Name() noexcept { return "Widefield Microscope"; }
560  constexpr static auto Category() noexcept { return "Experiments"; }
561 
563  virtual ~WidefieldMicroscope();
564 
565  virtual std::string GetName() const override { return Name(); }
566  virtual std::string GetCategory() const override { return Category(); }
567 
568  std::chrono::milliseconds GetMainLoopDelay() const override final;
569 
570  // Events which the UI thread might enqueue.
571  void OnSaveCurrentImage(DynExp::ModuleInstance* Instance, QString Filename) const;
572  void OnGoToSamplePos(DynExp::ModuleInstance* Instance, QPointF SamplePos) const;
573  void OnBringMarkerToConfocalSpot(DynExp::ModuleInstance* Instance, QPoint MarkerPos, QPointF SamplePos) const;
574  void OnRunCharacterizationFromID(DynExp::ModuleInstance* Instance, Util::MarkerGraphicsView::MarkerType::IDType ID) const;
575 
576  private:
577  Util::DynExpErrorCodes::DynExpErrorCodes ModuleMainLoop(DynExp::ModuleInstance& Instance) override final;
578 
579  void ResetImpl(dispatch_tag<QModuleBase>) override final;
580 
581  std::unique_ptr<DynExp::QModuleWidget> MakeUIWidget() override final;
582  void UpdateUIChild(const ModuleBase::ModuleDataGetterType& ModuleDataGetter) override final;
583 
584  // Helper functions
585  // ->
586  template <typename PosT>
587  static ModuleDataType::PositionPoint PositionPointFromPixelDist(Util::SynchronizedPointer<const ParamsType>& ModuleParams, Util::SynchronizedPointer<ModuleDataType>& ModuleData,
588  const PosT x, const PosT y)
589  {
590  return {
591  Util::NumToT<WidefieldMicroscopeData::PositionType>(x * ModuleData->GetWidefieldCamera()->GetPixelSizeInMicrons() * 1000 / ModuleParams->WidefieldCameraMagnification),
592  Util::NumToT<WidefieldMicroscopeData::PositionType>(y * ModuleData->GetWidefieldCamera()->GetPixelSizeInMicrons() * 1000 / ModuleParams->WidefieldCameraMagnification)
593  };
594  }
595 
596  bool IsReadyState() const noexcept { return StateMachine.GetCurrentState()->GetState() == StateType::Ready; }
598  bool IsCharacterizingSample() const noexcept;
599  void MoveSampleTo(const ModuleDataType::PositionPoint& Point, Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
600  bool IsSampleMoving(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
601  void SetFocus(Util::SynchronizedPointer<ModuleDataType>& ModuleData, double Voltage, bool IgnoreOffset = false) const;
602  ModuleDataType::PositionPoint CalcMarkerToConfocalSpotDestiny(Util::SynchronizedPointer<const ParamsType>& ModuleParams, Util::SynchronizedPointer<ModuleDataType>& ModuleData,
603  QPoint MarkerPos, QPointF SamplePos) const;
604  void BringMarkerToConfocalSpot(Util::SynchronizedPointer<const ParamsType>& ModuleParams, Util::SynchronizedPointer<ModuleDataType>& ModuleData,
605  QPoint MarkerPos, QPointF SamplePos) const;
606  ModuleDataType::QSurfaceDataRowsType CalculateConfocalScanPositions(const int Width, const int Height,
607  const int DistPerPixel, const WidefieldMicroscopeData::PositionPoint CenterPosition) const;
608  void UpdatePumpPower(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
609  void PrepareImageRecording(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
610  void RecordImage(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
613  void PrepareAPDsForConfocalMode(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
614  void InitializeConfocalOptimizer(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
615  void SetHBTSwitch(Util::SynchronizedPointer<const ParamsType>& ModuleParams,
616  Util::SynchronizedPointer<ModuleDataType>& ModuleData, bool IsHBTMode) const;
617  void InitializeHBT(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
618  void StopHBT(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
619  StateType StartAutofocus(Util::SynchronizedPointer<ModuleDataType>& ModuleData) const;
621  StateType StartAutoMeasureCharacterization(Util::SynchronizedPointer<ModuleDataType>& ModuleData, Util::MarkerGraphicsView::MarkerType::IDType FirstEmitterID = -1) const;
623  std::filesystem::path BuildFilename(Util::SynchronizedPointer<ModuleDataType>& ModuleData, std::string_view FilenameSuffix) const;
624  ModuleDataType::PositionPoint RandomPointInCircle(ModuleDataType::PositionType Radius) const;
625  // <-
626 
627  // Function and types for automatical optimization of the sample's position to maximize the count rate
628  // ->
630  {
634  };
635 
637 
639 
642  static double ConfocalOptimizationFuncForwarder(const gsl_vector* vector, void* params);
643  double ConfocalOptimizationFunc(const gsl_vector* vector) noexcept;
644  // <-
645 
646  // Events, run in module thread
647  void OnInit(DynExp::ModuleInstance* Instance) const override final;
648  void OnExit(DynExp::ModuleInstance* Instance) const override final;
649  void OnTerminate(DynExp::ModuleInstance* Instance, bool) const;
650  void OnStopAction(DynExp::ModuleInstance* Instance, bool) const;
651  void OnSetHomePosition(DynExp::ModuleInstance* Instance, bool) const;
652  void OnGoToHomePosition(DynExp::ModuleInstance* Instance, bool) const;
653  void OnToggleLEDLightSource(DynExp::ModuleInstance* Instance, bool State) const;
654  void OnTogglePumpLightSource(DynExp::ModuleInstance* Instance, bool State) const;
655  void OnSetupModeChanged(DynExp::ModuleInstance* Instance, QAction* Action) const;
656  void OnAutofocus(DynExp::ModuleInstance* Instance, bool) const;
657  void OnOptimizePositions(DynExp::ModuleInstance* Instance, bool) const;
658  void OnToggleHBTMirror(DynExp::ModuleInstance* Instance, bool Checked) const;
659  void OnResetCellID(DynExp::ModuleInstance* Instance, bool) const;
660  void OnGeneralWidefieldPowerChanged(DynExp::ModuleInstance* Instance, double Value) const;
661  void OnGeneralConfocalPowerChanged(DynExp::ModuleInstance* Instance, double Value) const;
662  void OnGeneralFocusCurrentVoltageChanged(DynExp::ModuleInstance* Instance, double Value) const;
663  void OnGeneralFocusZeroVoltageChanged(DynExp::ModuleInstance* Instance, double Value) const;
664  void OnGeneralFocusConfocalOffsetVoltageChanged(DynExp::ModuleInstance* Instance, double Value) const;
665  void OnGeneralSetZeroFocus(DynExp::ModuleInstance* Instance, bool) const;
666  void OnGeneralApplyZeroFocus(DynExp::ModuleInstance* Instance, bool) const;
667  void OnWidefieldLEDExposureTimeChanged(DynExp::ModuleInstance* Instance, int Value) const;
668  void OnWidefieldApplyLEDExposureTime(DynExp::ModuleInstance* Instance, bool) const;
669  void OnWidefieldPumpExposureTimeChanged(DynExp::ModuleInstance* Instance, int Value) const;
670  void OnWidefieldApplyPumpExposureTime(DynExp::ModuleInstance* Instance, bool) const;
671  void OnWidefieldFindConfocalSpot(DynExp::ModuleInstance* Instance, bool) const;
672  void OnCaptureLEDImage(DynExp::ModuleInstance* Instance, bool) const;
673  void OnCaptureWidefieldImage(DynExp::ModuleInstance* Instance, bool) const;
674  void OnWidefieldReadCellID(DynExp::ModuleInstance* Instance, bool) const;
675  void OnWidefieldAnalyzeImageDistortion(DynExp::ModuleInstance* Instance, bool) const;
676  void OnWidefieldLocalizeEmitters(DynExp::ModuleInstance* Instance, bool) const;
677  void OnWidefieldImageClicked(DynExp::ModuleInstance* Instance, QPoint Position) const;
678  void OnConfocalConfocalWidthChanged(DynExp::ModuleInstance* Instance, int Value) const;
679  void OnConfocalConfocalHeightChanged(DynExp::ModuleInstance* Instance, int Value) const;
680  void OnConfocalConfocalDistPerPixelChanged(DynExp::ModuleInstance* Instance, int Value) const;
681  void OnConfocalSPDExposureTimeChanged(DynExp::ModuleInstance* Instance, int Value) const;
682  void OnConfocalOptimizationInitXYStepSizeChanged(DynExp::ModuleInstance* Instance, double Value) const;
683  void OnConfocalOptimizationInitZStepSizeChanged(DynExp::ModuleInstance* Instance, double Value) const;
684  void OnConfocalOptimizationToleranceChanged(DynExp::ModuleInstance* Instance, double Value) const;
685  void OnPerformConfocalScan(DynExp::ModuleInstance* Instance, bool) const;
686  void ConfocalSurfaceSelectedPointChanged(DynExp::ModuleInstance* Instance, QPoint Position) const;
687  void OnHBTBinWidthChanged(DynExp::ModuleInstance* Instance, int Value) const;
688  void OnHBTBinCountChanged(DynExp::ModuleInstance* Instance, int Value) const;
689  void OnHHBTMaxIntegrationTimeChanged(DynExp::ModuleInstance* Instance, double Value) const;
690  void OnMeasureHBT(DynExp::ModuleInstance* Instance, bool) const;
691  void OnImageCapturingPaused(DynExp::ModuleInstance* Instance) const;
692  void OnFinishedAutofocus(DynExp::ModuleInstance* Instance, bool Success, double Voltage) const;
694  void OnAutoMeasureSavePathChanged(DynExp::ModuleInstance* Instance, QString Path) const;
695  void OnAutoMeasureNumberImageSetsChanged(DynExp::ModuleInstance* Instance, int Value) const;
697  void OnAutoMeasureImagePositionScatterRadius(DynExp::ModuleInstance* Instance, int Value) const;
698  void OnAutoMeasureLocalizationTypeChanged(DynExp::ModuleInstance* Instance, int Value) const;
699  void OnToggleAutoMeasureOptimizeEnabled(DynExp::ModuleInstance* Instance, int State) const;
700  void OnToggleAutoMeasureSpectrumEnabled(DynExp::ModuleInstance* Instance, int State) const;
701  void OnToggleAutoMeasureHBTEnabled(DynExp::ModuleInstance* Instance, int State) const;
703  void OnAutoMeasureMaxOptimizationRerunsChanged(DynExp::ModuleInstance* Instance, int Value) const;
705  void OnAutoMeasureCountRateThresholdChanged(DynExp::ModuleInstance* Instance, int Value) const;
706  void OnAutoMeasureCellRangeFromXChanged(DynExp::ModuleInstance* Instance, int Value) const;
707  void OnAutoMeasureCellRangeFromYChanged(DynExp::ModuleInstance* Instance, int Value) const;
708  void OnAutoMeasureCellRangeToXChanged(DynExp::ModuleInstance* Instance, int Value) const;
709  void OnAutoMeasureCellRangeToYChanged(DynExp::ModuleInstance* Instance, int Value) const;
710  void OnAutoMeasureCellSkipXChanged(DynExp::ModuleInstance* Instance, int Value) const;
711  void OnAutoMeasureCellSkipYChanged(DynExp::ModuleInstance* Instance, int Value) const;
712  void OnAutoMeasureRunLocalization(DynExp::ModuleInstance* Instance, bool) const;
713  void OnAutoMeasureRunCharacterization(DynExp::ModuleInstance* Instance, bool) const;
715 
716  // State functions for state machine
765 
766  // States for state machine
768  &WidefieldMicroscope::InitializingStateFunc, "Initializing module...");
786  &WidefieldMicroscope::LEDImageAcquisitionBeginStateFunc, "Recording LED image...");
788  &WidefieldMicroscope::WidefieldImageAcquisitionBeginStateFunc, "Recording widefield image...");
792  &WidefieldMicroscope::WaitingForImageStateFunc, "Recording LED image...");
796  &WidefieldMicroscope::WaitingForImageReadyToCaptureStateFunc, "Recording widefield image...");
798  &WidefieldMicroscope::WaitingForImageStateFunc, "Recording widefield image...");
802  &WidefieldMicroscope::WaitingForWidefieldCellIDStateFunc, "Waiting for cell ID to be read from image...");
804  &WidefieldMicroscope::WidefieldCellWaitUntilCenteredStateFunc, "Waiting for cell to be centered in FOV...");
808  &WidefieldMicroscope::WaitingForWidefieldLocalizationStateFunc, "Waiting for localization of emitters from image...");
818  &WidefieldMicroscope::ConfocalScanStepStateFunc, "Performing confocal scan...");
820  &WidefieldMicroscope::ConfocalScanWaitUntilMovedStateFunc, "Performing confocal scan...");
822  &WidefieldMicroscope::ConfocalScanCaptureStateFunc, "Performing confocal scan...");
824  &WidefieldMicroscope::ConfocalScanWaitUntilCapturedStateFunc, "Performing confocal scan...");
836  &WidefieldMicroscope::HBTAcquiringStateFunc, "HBT acquiring...");
854  &WidefieldMicroscope::AutoMeasureLocalizationMovingStateFunc, "Moving to next image capturing position...");
891 
892  // Contexts for state machine
895  }, "Autofocusing..." };
898  }, "Locating confocal spot..." };
901  }, "Locating confocal spot..." };
905  }, "Optimizing count rate..." };
908  } };
911  } };
917  } };
923  }, "Characterizing emitters...", { &ConfocalOptimizationContext } };
926  }, "Characterizing emitters (optimizing count rate)...", { &AutoMeasureCharacterizationContext } };
929  }, "Characterizing emitters (recording spectrum)...", { &AutoMeasureCharacterizationContext } };
932  }, "Characterizing emitters (HBT acquiring)...", { &AutoMeasureCharacterizationContext } };
940  }, "Characterizing sample...", { &AutofocusSetupTransitioningContext } };
943  }, "Characterizing sample...", { &AutoMeasureSampleContext } };
947  }, "Characterizing sample (localizing)...", { &AutoMeasureLocalizationContext } };
950  }, "Characterizing sample...", { &AutoMeasureCharacterizationContext } };
952  }, "Characterizing sample (optimizing count rate)...", { &AutoMeasureSampleCharacterizationContext, &AutoMeasureCharacterizationOptimizationContext } };
954  }, "Characterizing sample (recording spectrum)...", { &AutoMeasureSampleCharacterizationContext, &AutoMeasureCharacterizationSpectrumContext } };
956  }, "Characterizing sample (HBT acquiring)...", { &AutoMeasureSampleCharacterizationContext, &AutoMeasureCharacterizationHBTContext } };
957 
958  // Logical const-ness: allow events to set the state machine's current state.
960 
961  // shared_ptr since in principle PositionerStages' tasks can outlive this module instance.
962  const std::shared_ptr<AtomicPositionerStateType> ConfocalScanPositionerStateX;
963  const std::shared_ptr<AtomicPositionerStateType> ConfocalScanPositionerStateY;
964  const std::shared_ptr<AtomicPositionerStateType> ConfocalScanPositionerStateZ;
965 
966  // shared_ptr since in principle WidefieldLocalizer's tasks can outlive this module instance.
967  const std::shared_ptr<AtomicWidefieldImageProcessingStateType> WidefieldCellIDState;
968  const std::shared_ptr<AtomicWidefieldImageProcessingStateType> WidefieldLocalizationState;
969 
970  mutable std::list<WidefieldMicroscopeData::PositionPoint> ConfocalScanPositions;
971 
972  // Variables for automatical optimization of the sample's position to maximize the count rate
973  static constexpr size_t GSLConfocalOptimizationNumDimensions = 3;
974  const gsl_multimin_fminimizer_type* const GSLConfocalOptimizationMinimizer = gsl_multimin_fminimizer_nmsimplex2;
976  gsl_multimin_fminimizer* const GSLConfocalOptimizationState;
979  mutable std::atomic<size_t> ConfocalOptimizationNumStepsPerformed = 0; // To be accessed by ConfocalOptimizationThread and WidefieldMicroscope thread.
980  mutable std::atomic_bool ConfocalOptimizationPromisesRenewed = false; // To be accessed by ConfocalOptimizationThread and WidefieldMicroscope thread.
981  std::promise<ConfocalOptimizationStateType> ConfocalOptimizationStatePromise; // To be solely accessed by ConfocalOptimizationThread.
982  std::future<ConfocalOptimizationStateType> ConfocalOptimizationStateFuture; // To be solely accessed by WidefieldMicroscope thread.
983  mutable std::promise<ConfocalOptimizationFeedbackType> ConfocalOptimizationFeedbackPromise; // To be solely accessed by WidefieldMicroscope thread.
984  std::future<ConfocalOptimizationFeedbackType> ConfocalOptimizationFeedbackFuture; // To be solely accessed by ConfocalOptimizationThread.
985  std::future<ConfocalOptimizationThreadReturnType> ConfocalOptimizationThreadReturnFuture; // To be solely accessed by WidefieldMicroscope thread.
986 
987  // Variables for switching from a confocal to a widefield setup.
988  std::chrono::system_clock::time_point SetupTransitionFinishedTimePoint;
990 
991  // Variables for widefield image capturing.
992  mutable bool ImageCapturingPaused = false;
993 
994  // Variables for managing wait times within measurements.
995  mutable std::chrono::system_clock::time_point WaitingEndTimePoint;
996  mutable std::chrono::microseconds HBTIntegrationTimeBeforeReset{ 0 };
997 
998  // General
1000  mutable bool LogUIMessagesOnly = false;
1001  };
1002 }
Defines DynExp's core module as an interface between the UI and DynExp objects.
User interface belonging to the DynExpModule::Widefield::WidefieldMicroscope module.
std::chrono::milliseconds TimeType
Time type describing the camera's times like its exposure time.
Definition: Camera.h:101
SampleT SampleType
Alias for SampleT.
signed long long PositionType
Numeric type to store the stage positions.
Definition: Stage.h:71
virtual DynExp::ParamsBasePtrType MakeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core) const override final
Override to make derived classes call DynExp::MakeParams with the correct configurator type derived f...
void SetCellID(const DynExpInstr::WidefieldLocalizationCellIDType &CellID)
const PositionPoint & GetSampleHomePosition() const noexcept
CameraTimeType GetMinCameraExposureTime() const noexcept
void SetAutoMeasureOptimizationMaxDistance(int OptimizationMaxDistance) noexcept
void SetSPD2SamplesWritten(size_t SamplesWritten) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::PositionerStage > SampleStageZ
void SetMaxFocusVoltage(double MaxVoltage) noexcept
PositionPoint SampleHomePosition
Location set by the user as a home position in nm.
void SetFocusZeroVoltage(double ZeroVoltage) noexcept
void SetAutoMeasureNumOptimizationAttempts(int NumOptimizationAttempts) noexcept
void SetWidefieldPosition(const PositionPoint &Position) noexcept
void SetMinCameraExposureTime(CameraTimeType Time) noexcept
void SetFocusConfocalOffsetVoltage(double ConfocalOffsetVoltage) noexcept
CameraTimeType GetMaxCameraExposureTime() const noexcept
DynExpInstr::WidefieldLocalizationCellIDType LastCellID
void SetAutoMeasureInitialImageSetWaitTime(std::chrono::seconds Time) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > LEDSwitch
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > WidefieldConfocalSwitch
static QColor GetLocalizedEmitterColor(LocalizedEmitterStateType State)
const PositionPoint & GetHBTSamplePosition() const noexcept
void SetHBTBinWidth(Util::picoseconds BinWidth) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::AnalogOut > FocusPiezoZ
void SetAutoMeasureImagePositionScatterRadius(int ScatterRadius) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::PositionerStage > SampleStageX
void WriteConfocalScanResults(std::stringstream &Stream) const
void SetConfocalOptimizationInitXYStepSize(double StepSize) noexcept
std::vector< std::pair< PositionPoint, double > > ConfocalScanResults
virtual void ResetImpl(dispatch_tag< WidefieldMicroscopeData >)
void SetHBTNumEventCounts(long long NumEventCounts) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::TimeTagger > SPD2
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.
DynExp::LinkedObjectWrapperContainer< DynExpInstr::PositionerStage > SampleStageY
DynExpInstr::WidefieldLocalizationCellIDType CurrentCellID
void SetMeasuredPumpPower(double MeasuredPower) noexcept
bool SetAutoMeasureFirstEmitter(Util::MarkerGraphicsView::MarkerType::IDType FirstEmitterID) noexcept
Returns true in case of success, false otherwise.
LocalizedPositionsMapType::iterator AutoMeasureFirstEmitter
Iterator to the first emitter to be characterized.
void SetMinFocusVoltage(double MinVoltage) noexcept
void SetAutoMeasureCurrentCellPosition(const PositionPoint &Position) noexcept
void SetSetupMode(SetupModeType NewMode) noexcept
void SetLEDCameraExposureTime(CameraTimeType Time) noexcept
void SetAutoMeasureMaxOptimizationReruns(int MaxOptimizationReruns) noexcept
void SetConfocalScanDistPerPixel(int DistPerPixel) noexcept
void SetConfocalOptimizationTolerance(double Tolerance) noexcept
void SetConfocalSpotImagePosition(const QPoint &Position) noexcept
PositionPoint GetSamplePosition() const
Returns current sample position.
std::chrono::seconds GetAutoMeasureInitialImageSetWaitTime() const noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::AnalogIn > PumpPowerIndicator
void SetHBTMaxIntegrationTime(std::chrono::microseconds MaxIntegrationTime) noexcept
void SetAutoMeasureCountRateThreshold(int CountRateThreshold) noexcept
void SetConfocalScanSurfacePlotRows(QSurfaceDataRowsType &&QSurfaceDataRows) noexcept
QPoint ConfocalSpotImagePosition
Location of confocal spot in units of px within widefield image.
DynExpInstr::CameraData::TimeType CameraTimeType
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalIn > WidefieldConfocalIndicator
void SetSPD1SamplesWritten(size_t SamplesWritten) noexcept
void SetMaxCameraExposureTime(CameraTimeType Time) noexcept
DynExpInstr::PositionerStageData::PositionType PositionType
DynExp::LinkedObjectWrapperContainer< DynExpInstr::DigitalOut > PumpSwitch
std::vector< std::unique_ptr< QSurfaceDataRow > > QSurfaceDataRowsType
void SetHBTDataPointsMinValues(const QPointF &DataPointsMinValues) noexcept
void SetHBTSamplePosition(const PositionPoint &Position) noexcept
void SetFocusCurrentVoltage(double CurrentVoltage) noexcept
void SetAutoMeasureNumberImageSets(int NumberImageSets) noexcept
void SetSampleHomePosition(const PositionPoint &Position) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::Camera > WidefieldCamera
PositionPoint AutoMeasureCurrentCellPosition
Center position of the current cell in nm where an automated measurement takes place.
void SetHBTTotalIntegrationTime(std::chrono::microseconds TotalIntegrationTime) noexcept
void SetAutoMeasureLocalizationType(WidefieldMicroscopeWidget::LocalizationType LocalizationType) noexcept
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
DynExp::LinkedObjectWrapperContainer< DynExpInstr::FunctionGenerator > WidefieldHBTSwitch
void WriteHBTResults(std::stringstream &Stream) const
void SetLocalizedPositions(LocalizedPositionsMapType &&Positions)
void SetAutoMeasureSavePath(std::filesystem::path SavePath) noexcept
static const char * GetLocalizedEmitterStateString(LocalizedEmitterStateType State)
std::map< Util::MarkerGraphicsView::MarkerType::IDType, LocalizedEmitterType > LocalizedPositionsMapType
void AppendLocalizedPosition(LocalizedPositionsMapType::value_type &&Position)
const PositionPoint & GetWidefieldPosition() const noexcept
CameraTimeType GetLEDCameraExposureTime() const noexcept
void SetConfocalOptimizationInitZStepSize(double StepSize) noexcept
PositionPoint HBTSamplePosition
Location in nm where the HBT measurement has been started.
int AutoMeasureCurrentImageSet
Index of the image set being recorded if auto-measure localization is running, -1 otherwise.
void SetHBTDataPointsMaxValues(const QPointF &DataPointsMaxValues) noexcept
bool TestFeature(const std::array< FeatureType, N > &Flags) const
void SetWidefieldCameraExposureTime(CameraTimeType Time) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::InterModuleCommunicator > AcqCommunicator
DynExp::LinkedObjectWrapperContainer< DynExpInstr::WidefieldLocalization > WidefieldLocalizer
std::stringstream AssembleCSVHeader(bool IncludeConfocalScan, bool IncludeHBT, bool IncludeAutoMeasure) const
DynExp::LinkedObjectWrapperContainer< DynExpInstr::AnalogOut > PumpPower
std::string_view GetUIMessage() const noexcept
CameraTimeType GetWidefieldCameraExposureTime() const noexcept
void SetSPDExposureTime(SPDTimeType Time) noexcept
DynExp::LinkedObjectWrapperContainer< DynExpInstr::TimeTagger > SPD1
const PositionPoint & GetAutoMeasureCurrentCellPosition() const noexcept
WidefieldMicroscopeParams(DynExp::ItemIDType ID, const DynExp::DynExpCore &Core)
Param< DynExp::ObjectLink< DynExpInstr::AnalogIn > > PumpPowerIndicator
Param< ParamsConfigDialog::NumberType > DefaultPowerConfocalMode
Param< DynExp::ObjectLink< DynExpInstr::Camera > > WidefieldCamera
Param< DynExp::ObjectLink< DynExpInstr::PositionerStage > > SampleStageX
Param< DynExp::ObjectLink< DynExpInstr::WidefieldLocalization > > WidefieldLocalizer
Param< ParamsConfigDialog::NumberType > WidefieldHBTSwitchLowDutyCycle
Param< DynExp::ObjectLink< DynExpInstr::FunctionGenerator > > WidefieldHBTSwitch
virtual const char * GetParamClassTag() const noexcept override
This function is intended to be overridden once in each derived class returning the name of the respe...
void ConfigureParamsImpl(dispatch_tag< QModuleParamsBase >) override final
Param< DynExp::ObjectLink< DynExpInstr::DigitalOut > > WidefieldConfocalSwitch
Param< DynExp::ObjectLink< DynExpInstr::AnalogOut > > PumpPower
Param< ParamsConfigDialog::NumberType > WidefieldHBTSwitchHighDutyCycle
Param< DynExp::ObjectLink< DynExpInstr::PositionerStage > > SampleStageY
Param< DynExp::ObjectLink< DynExpInstr::PositionerStage > > SampleStageZ
Param< ParamsConfigDialog::NumberType > WidefieldConfocalTransitionTime
Param< ParamsConfigDialog::NumberType > WidefieldHBTTransitionTime
Param< DynExp::ObjectLink< DynExpInstr::InterModuleCommunicator > > AcqCommunicator
Param< DynExp::ObjectLink< DynExpInstr::DigitalOut > > PumpSwitch
Param< DynExp::ObjectLink< DynExpInstr::DigitalOut > > LEDSwitch
Param< DynExp::ObjectLink< DynExpInstr::DigitalIn > > WidefieldConfocalIndicator
Param< ParamsConfigDialog::NumberType > DefaultPowerWidefieldMode
Param< DynExp::ObjectLink< DynExpInstr::TimeTagger > > SPD2
Param< ParamsConfigDialog::NumberType > WidefieldCameraMagnification
Param< DynExp::ObjectLink< DynExpInstr::AnalogOut > > FocusPiezoZ
Param< DynExp::ObjectLink< DynExpInstr::TimeTagger > > SPD1
void OnCaptureWidefieldImage(DynExp::ModuleInstance *Instance, bool) const
void OnConfocalSPDExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
const gsl_multimin_fminimizer_type *const GSLConfocalOptimizationMinimizer
static constexpr auto AutoMeasureCharacterizationHBTFinishedState
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationContext
void OnAutofocus(DynExp::ModuleInstance *Instance, bool) const
void OnOptimizePositions(DynExp::ModuleInstance *Instance, bool) const
static constexpr auto AutoMeasureLocalizationSaveLEDImageState
void OnAutoMeasureCellRangeFromXChanged(DynExp::ModuleInstance *Instance, int Value) const
std::chrono::microseconds HBTIntegrationTimeBeforeReset
StateType AutoMeasureCharacterizationHBTFinishedStateFunc(DynExp::ModuleInstance &Instance)
StateType HBTAcquiringStateFunc(DynExp::ModuleInstance &Instance)
ModuleDataType::PositionPoint RandomPointInCircle(ModuleDataType::PositionType Radius) const
Returns a uniformly-distributed random coordinate within a circle of radius Radius,...
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleContext
void OnRunCharacterizationFromID(DynExp::ModuleInstance *Instance, Util::MarkerGraphicsView::MarkerType::IDType ID) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleLocalizationContext
StateType AutoMeasureCharacterizationOptimizationFinishedStateFunc(DynExp::ModuleInstance &Instance)
void OnHBTBinWidthChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnGoToHomePosition(DynExp::ModuleInstance *Instance, bool) const
void PrepareAPDsForConfocalMode(Util::SynchronizedPointer< ModuleDataType > &ModuleData) 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)
StateType ConfocalOptimizationInitSubStepStateFunc(DynExp::ModuleInstance &Instance)
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...
StateType WaitingForImageStateFunc(DynExp::ModuleInstance &Instance)
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
StateType FindingConfocalSpotAfterTransitioningToConfocalModeStateFunc(DynExp::ModuleInstance &Instance)
StateType AutoMeasureSampleStepStateFunc(DynExp::ModuleInstance &Instance)
const Util::StateMachineContext< StateMachineStateType > WidefieldImageAcquisitionSetupTransitioningContext
void OnAutoMeasureNumberImageSetsChanged(DynExp::ModuleInstance *Instance, int Value) const
const std::shared_ptr< AtomicWidefieldImageProcessingStateType > WidefieldCellIDState
const Util::StateMachineContext< StateMachineStateType > ConfocalOptimizationContext
void OnAutoMeasureCountRateThresholdChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType StartAutoMeasureLocalization(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnWidefieldLEDExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType AutoMeasureLocalizationSaveLEDImageStateFunc(DynExp::ModuleInstance &Instance)
static constexpr auto AutoMeasureCharacterizationSpectrumBeginState
StateType AutoMeasureCharacterizationStepStateFunc(DynExp::ModuleInstance &Instance)
void OnInit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread starts. Override it to lock instruments this m...
StateType AutoMeasureCharacterizationSpectrumBeginStateFunc(DynExp::ModuleInstance &Instance)
StateType WidefieldCellWaitUntilCenteredStateFunc(DynExp::ModuleInstance &Instance)
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)
StateType ReadyStateFunc(DynExp::ModuleInstance &Instance)
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateY
StateType AutoMeasureCharacterizationGotoEmitterStateFunc(DynExp::ModuleInstance &Instance)
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
StateType ConfocalOptimizationInitStateFunc(DynExp::ModuleInstance &Instance)
StateType FindingConfocalSpotBeginStateFunc(DynExp::ModuleInstance &Instance)
StateType AutofocusBeginStateFunc(DynExp::ModuleInstance &Instance)
void OnConfocalOptimizationInitXYStepSizeChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnGeneralFocusConfocalOffsetVoltageChanged(DynExp::ModuleInstance *Instance, double Value) const
static constexpr auto AutoMeasureCharacterizationFinishedState
void OnGoToSamplePos(DynExp::ModuleInstance *Instance, QPointF SamplePos) const
void OnAutoMeasureCellRangeToXChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnResetCellID(DynExp::ModuleInstance *Instance, bool) const
static double ConfocalOptimizationFuncForwarder(const gsl_vector *vector, void *params)
const Util::StateMachineContext< StateMachineStateType > AutofocusSetupTransitioningContext
StateType SetupTransitionEndStateFunc(DynExp::ModuleInstance &Instance)
StateType WaitingForImageReadyToCaptureStateFunc(DynExp::ModuleInstance &Instance)
std::future< ConfocalOptimizationThreadReturnType > ConfocalOptimizationThreadReturnFuture
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
static constexpr auto WaitingForWidefieldImageReadyToCaptureState
StateType InitiateLocalizationFromImage(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureCharacterizationOptimizationContext
StateType AutofocusWaitingStateFunc(DynExp::ModuleInstance &Instance)
void OnConfocalOptimizationToleranceChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnToggleAutoMeasureOptimizeEnabled(DynExp::ModuleInstance *Instance, int State) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureCharacterizationContext
void OnHHBTMaxIntegrationTimeChanged(DynExp::ModuleInstance *Instance, double Value) const
std::future< ConfocalOptimizationFeedbackType > ConfocalOptimizationFeedbackFuture
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 SetHBTSwitch(Util::SynchronizedPointer< const ParamsType > &ModuleParams, Util::SynchronizedPointer< ModuleDataType > &ModuleData, bool IsHBTMode) const
static constexpr auto FindingConfocalSpotAfterRecordingWidefieldImageState
void OnPerformConfocalScan(DynExp::ModuleInstance *Instance, bool) const
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateX
void OnSpectrumFinishedRecording(DynExp::ModuleInstance *Instance) const
void OnTogglePumpLightSource(DynExp::ModuleInstance *Instance, bool State) const
static constexpr auto AutoMeasureCharacterizationGotoEmitterState
StateType ConfocalScanWaitUntilMovedStateFunc(DynExp::ModuleInstance &Instance)
StateType WaitingForWidefieldLocalizationStateFunc(DynExp::ModuleInstance &Instance)
StateType StartAutofocus(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
StateType ReturnToReadyStateFunc(DynExp::ModuleInstance &Instance)
void OnWidefieldApplyPumpExposureTime(DynExp::ModuleInstance *Instance, bool) const
std::promise< ConfocalOptimizationFeedbackType > ConfocalOptimizationFeedbackPromise
StateType InitializingStateFunc(DynExp::ModuleInstance &Instance)
void RecordImage(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
StateType FindingConfocalSpotAfterRecordingWidefieldImageStateFunc(DynExp::ModuleInstance &Instance)
void OnFinishedAutofocus(DynExp::ModuleInstance *Instance, bool Success, double Voltage) const
StateType ConfocalOptimizationWaitStateFunc(DynExp::ModuleInstance &Instance)
void ConfocalSurfaceSelectedPointChanged(DynExp::ModuleInstance *Instance, QPoint Position) const
const std::shared_ptr< AtomicPositionerStateType > ConfocalScanPositionerStateZ
void OnWidefieldApplyLEDExposureTime(DynExp::ModuleInstance *Instance, bool) const
virtual std::string GetName() const override
Returns the name of this Object type.
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 ...
virtual std::string GetCategory() const override
Returns the category of this Object type.
const Util::StateMachineContext< StateMachineStateType > AutoMeasureLocalizationContext
StateType AutoMeasureCharacterizationHBTBeginStateFunc(DynExp::ModuleInstance &Instance)
StateType WidefieldImageAcquisitionBeginStateFunc(DynExp::ModuleInstance &Instance)
StateType StartAutoMeasureSampleCharacterization(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnAutoMeasureInitialImageSetWaitTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
static constexpr auto AutoMeasureCharacterizationSpectrumFinishedState
void OnToggleHBTMirror(DynExp::ModuleInstance *Instance, bool Checked) const
const Util::StateMachineContext< StateMachineStateType > LEDImageAcquisitionSetupTransitioningContext
StateType AutoMeasureSampleAdvanceCellStateFunc(DynExp::ModuleInstance &Instance)
Checks whether the last cell within the sample characterization range (specified as a square region b...
void OnAutoMeasureRunLocalization(DynExp::ModuleInstance *Instance, bool) const
StateType AutoMeasureCharacterizationSpectrumFinishedStateFunc(DynExp::ModuleInstance &Instance)
void InitializeHBT(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
std::atomic< PositionerStateType > AtomicPositionerStateType
std::chrono::system_clock::time_point WaitingEndTimePoint
static constexpr auto AutoMeasureCharacterizationOptimizationFinishedState
void OnHBTBinCountChanged(DynExp::ModuleInstance *Instance, int Value) const
void OnGeneralFocusZeroVoltageChanged(DynExp::ModuleInstance *Instance, double Value) const
StateType SetupTransitionBeginStateFunc(DynExp::ModuleInstance &Instance)
StateType SetupTransitioningStateFunc(DynExp::ModuleInstance &Instance)
Util::StateMachine< StateMachineStateType > StateMachine
void OnAutoMeasureLocalizationTypeChanged(DynExp::ModuleInstance *Instance, int Value) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureCharacterizationHBTContext
void OnWidefieldReadCellID(DynExp::ModuleInstance *Instance, bool) const
StateType WaitingStateFunc(DynExp::ModuleInstance &Instance)
StateType AutoMeasureLocalizationMovingStateFunc(DynExp::ModuleInstance &Instance)
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
std::future< ConfocalOptimizationStateType > ConfocalOptimizationStateFuture
void OnAutoMeasureCellSkipYChanged(DynExp::ModuleInstance *Instance, int Value) const
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationSpectrumContext
StateType WaitingForWidefieldCellIDStateFunc(DynExp::ModuleInstance &Instance)
void StopHBT(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
static constexpr auto AutoMeasureCharacterizationHBTWaitForInitState
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
double ConfocalOptimizationFunc(const gsl_vector *vector) noexcept
void OnTerminate(DynExp::ModuleInstance *Instance, bool) const
void OnImageCapturingPaused(DynExp::ModuleInstance *Instance) const
void OnAutoMeasureRunCharacterization(DynExp::ModuleInstance *Instance, bool) const
static ConfocalOptimizationThreadReturnType ConfocalOptimizationThread(WidefieldMicroscope *Owner)
void OnWidefieldAnalyzeImageDistortion(DynExp::ModuleInstance *Instance, bool) const
void OnSetHomePosition(DynExp::ModuleInstance *Instance, bool) const
void UpdatePumpPower(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
static constexpr auto FindingConfocalSpotAfterTransitioningToConfocalModeState
StateType AutoMeasureLocalizationStepStateFunc(DynExp::ModuleInstance &Instance)
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
std::chrono::system_clock::time_point SetupTransitionFinishedTimePoint
const Util::StateMachineContext< StateMachineStateType > FindingConfocalSpotRecordingWidefieldImageContext
static constexpr auto AutoMeasureCharacterizationHBTBeginState
void ResetImpl(dispatch_tag< QModuleBase >) override final
StateType AutoMeasureSampleLocalizeStateFunc(DynExp::ModuleInstance &Instance)
StateType AutoMeasureSampleCharacterizeStateFunc(DynExp::ModuleInstance &Instance)
std::list< WidefieldMicroscopeData::PositionPoint > ConfocalScanPositions
void OnGeneralSetZeroFocus(DynExp::ModuleInstance *Instance, bool) const
void OnWidefieldPumpExposureTimeChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType ConfocalScanWaitUntilCapturedStateFunc(DynExp::ModuleInstance &Instance)
void InitializeConfocalOptimizer(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
StateType AutoMeasureLocalizationSaveWidefieldImageStateFunc(DynExp::ModuleInstance &Instance)
const Util::StateMachineContext< StateMachineStateType > AutoMeasureCharacterizationSpectrumContext
void OnGeneralWidefieldPowerChanged(DynExp::ModuleInstance *Instance, double Value) const
static constexpr auto AutoMeasureSampleReadCellIDFinishedState
void OnAutoMeasureCellRangeFromYChanged(DynExp::ModuleInstance *Instance, int Value) const
void PrepareImageRecording(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
StateType ConfocalOptimizationStepStateFunc(DynExp::ModuleInstance &Instance)
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::promise< ConfocalOptimizationStateType > ConfocalOptimizationStatePromise
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
StateType AutoMeasureSampleReadCellIDStateFunc(DynExp::ModuleInstance &Instance)
void OnAutoMeasureNumOptimizationAttemptsChanged(DynExp::ModuleInstance *Instance, int Value) const
StateType ConfocalScanCaptureStateFunc(DynExp::ModuleInstance &Instance)
const Util::StateMachineContext< StateMachineStateType > AutoMeasureSampleCharacterizationOptimizationContext
StateType ConfocalScanStepStateFunc(DynExp::ModuleInstance &Instance)
constexpr static auto Category() noexcept
void OnGeneralApplyZeroFocus(DynExp::ModuleInstance *Instance, bool) const
StateType AutoMeasureSampleFindEmittersStateFunc(DynExp::ModuleInstance &Instance)
std::filesystem::path BuildFilename(Util::SynchronizedPointer< ModuleDataType > &ModuleData, std::string_view FilenameSuffix) const
StateType LEDImageAcquisitionBeginStateFunc(DynExp::ModuleInstance &Instance)
void BringMarkerToConfocalSpot(Util::SynchronizedPointer< const ParamsType > &ModuleParams, Util::SynchronizedPointer< ModuleDataType > &ModuleData, QPoint MarkerPos, QPointF SamplePos) const
static constexpr size_t GSLConfocalOptimizationNumDimensions
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
StateType AutoMeasureSampleReadCellIDFinishedStateFunc(DynExp::ModuleInstance &Instance)
StateType AutoMeasureCharacterizationHBTWaitForInitStateFunc(DynExp::ModuleInstance &Instance)
StateType SpectrumAcquisitionWaitingStateFunc(DynExp::ModuleInstance &Instance)
static constexpr auto AutoMeasureLocalizationSaveWidefieldImageState
const Util::StateMachineContext< StateMachineStateType > FindingConfocalSpotBeginContext
DynExp's core class acts as the interface between the user interface and DynExp's internal data like ...
Definition: DynExpCore.h:127
Base class for modules. Modules implement programs on their own (e.g. measurement protocols or server...
Definition: Module.h:392
Util::CallableMemberWrapper< ModuleBase, ModuleDataTypeSyncPtrType(ModuleBase::*)(const std::chrono::milliseconds)> ModuleDataGetterType
Invoking an instance of this alias is supposed to call ModuleBase::GetModuleData() of the instance th...
Definition: Module.h:587
const std::unique_ptr< ModuleDataType > ModuleData
Module data belonging to this ModuleBase instance.
Definition: Module.h:743
ModuleBase(const std::thread::id OwnerThreadID, ParamsBasePtrType &&Params)
Constructs a ModuleBase instance.
Definition: Module.cpp:189
Configurator class for ModuleBase.
Definition: Module.h:374
Data structure to contain data which is synchronized in between different threads....
Definition: Module.h:171
Refer to ParamsBase::dispatch_tag.
Definition: Module.h:189
Defines data for a thread belonging to a ModuleBase instance. Refer to RunnableInstance.
Definition: Module.h:793
Parameter class for ModuleBase.
Definition: Module.h:337
const std::thread::id OwnerThreadID
Thread id of the thread which has constructed (and owns) this Object instance.
Definition: Object.h:2302
const ParamsBasePtrType Params
Pointer to the parameter class instance belonging to this Object instance.
Definition: Object.h:2303
const ItemIDType ID
ID of the Object this parameter class instance belongs to.
Definition: Object.h:1779
const auto & GetCore() const noexcept
Returns a reference to DynExp's core.
Definition: Object.h:1677
const DynExpCore & Core
Reference to DynExp's core.
Definition: Object.h:1780
Tag for function dispatching mechanism within this class used when derived classes are not intended t...
Definition: Object.h:349
Base class for modules with a Qt-based user interface. Derive from this class to implement modules wi...
Definition: Module.h:1344
void SetFocus() noexcept
Focuses/activates Widget and moves it on top of other windows if possible. Does nothing if any of Wid...
Definition: Module.cpp:678
QModuleBase(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
Constructs a QModuleBase instance.
Definition: Module.cpp:557
Configurator class for QModuleBase.
Definition: Module.h:1330
Data class for QModuleBase.
Definition: Module.h:1220
Parameter class for QModuleBase.
Definition: Module.h:1306
QModuleParamsBase(ItemIDType ID, const DynExpCore &Core)
Constructs the parameters for a QModuleBase instance.
Definition: Module.h:1312
void Set(EnumType Flag)
Sets a flag.
Definition: Util.h:1281
bool Test(const std::array< EnumType, N > &Flags) const
Tests whether all of the flags passed as an array are set.
Definition: Util.h:1257
State machine context as used by class StateMachine. A state machine context holds a map with keys an...
Definition: Util.h:1362
State machine state as used by class StateMachine. A state mainly wraps a state function of the membe...
Definition: Util.h:1305
This class models a state machine. It keeps track of the current state and allows to invoke its assoc...
Definition: Util.h:1435
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
Definition: Util.h:170
@ Y
Y component of the signal in cartesian coordinates.
@ X
X component of the signal in cartesian coordinates.
WidefieldMicroscopeData::PositionPoint operator-(const WidefieldMicroscopeData::PositionPoint &lhs, const WidefieldMicroscopeData::PositionPoint &rhs)
WidefieldMicroscopeData::PositionPoint operator+(const WidefieldMicroscopeData::PositionPoint &lhs, const WidefieldMicroscopeData::PositionPoint &rhs)
constexpr auto Instrument
constexpr auto Running
DynExp's main namespace contains the implementation of DynExp including classes to manage resources (...
std::unique_ptr< ParamsBase > ParamsBasePtrType
Alias for a pointer to the parameter system base class ParamsBase.
Definition: Object.h:1807
size_t ItemIDType
ID type of objects/items managed by DynExp.
DynExpErrorCodes
DynExp's error codes
Definition: Exception.h:22
DynExp's Util namespace contains commonly used functions and templates as well as extensions to Qt an...
Definition: circularbuf.cpp:7
std::chrono::duration< double, std::pico > picoseconds
Extends std::chrono by a duration data type for picoseconds.
Definition: Util.h:762
std::chrono::duration< double > seconds
Extends std::chrono by a duration data type for seconds capable of storing fractions of seconds.
Definition: Util.h:761
Accumulates include statements to provide a precompiled header.
constexpr PositionPoint(PositionType x, PositionType y, PositionType z)
constexpr SPDStateType(double Value=0, bool Ready=false, size_t StreamSamplesWritten=0) noexcept