24 std::stringstream CSVData;
26 CSVData << std::setprecision(6);
29 CSVData <<
"RFFreqSpan = " <<
RFFreqSpan <<
" Hz\n";
31 CSVData <<
"RFDwellTime = " <<
RFDwellTime <<
" s\n";
33 CSVData <<
"RFModulation = ";
39 default: CSVData <<
"\n";
47 CSVData <<
"IsRFOffResonance = " << (IsRFOffResonance ?
"yes" :
"no") <<
"\n";
61 CSVData <<
"SweepSeries = ";
67 default: CSVData <<
"\n";
75 CSVData <<
"AuxAnalogOutValue = " << AuxAnalogOutValue <<
"\n";
80 auto LockinData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::LockinAmplifier>(
GetSignalDetector()->GetInstrumentData());
82 auto Sensitivity = LockinData->GetSensitivity();
83 auto TimeConstant = LockinData->GetTimeConstant();
84 unsigned int FilterOrder = LockinData->GetFilterOrder();
86 CSVData <<
"LockinSensitivity = " << Sensitivity <<
" " << LockinInstr.GetSensitivityUnitString() <<
"\n";
87 CSVData <<
"LockinTimeConstant = " << TimeConstant <<
" s\n";
88 CSVData <<
"LockinFilterOrder = " << FilterOrder <<
"\n";
91 CSVData <<
"HEADER_END\n";
154 : QModuleBase(OwnerThreadID, std::move(Params)),
155 StateMachine(InitializingState, ReadyState,
156 MeasurementSeriesStepState, MeasurementSeriesInitState,
157 ODMRTraceInitState, ODMRTraceWaitState, ODMRTraceFinishState,
158 SensitivityInitState, SensitivityWaitState, SensitivityFinishState)
164 auto CurrentState = StateMachine.GetCurrentState()->GetState();
168 return std::chrono::milliseconds(30);
170 return std::chrono::milliseconds(2);
181 auto LockinData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::LockinAmplifier>(
ModuleData->GetSignalDetector()->GetInstrumentData());
183 ModuleData->AcquisitionTime = LockinData->GetAcquisitionTime();
212 auto Widget = std::make_unique<ODMRWidget>(*
this);
264 auto Widget = GetWidget<ODMRWidget>();
269 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(ModuleDataGetter());
285 SensitivityPlot =
ModuleData->SensitivityPlot;
292 Widget->UpdateODMRPlot(ODMRPlot);
296 Widget->UpdateSensitivityPlot(SensitivityPlot);
309 if (
ModuleData->SweepSeriesAdvanceLastValue && SweepIndex == 1)
310 SweepIndex =
ModuleData->GetSweepNumberSteps() - 1;
311 else if (
ModuleData->SweepSeriesAdvanceLastValue && SweepIndex > 1)
355 std::this_thread::sleep_for(std::chrono::milliseconds(200));
380 auto ModuleParams = DynExp::dynamic_Params_cast<ODMR>(Instance->
ParamsGetter());
397 if (ModuleParams->AuxAnalogOut.ContainsID())
427 ModuleData->RFAutoEnabled = Checked == Qt::CheckState::Checked;
499 ModuleData->SaveDataPath = Path.toStdString();
511 ModuleData->AutosaveEnabled = Checked == Qt::CheckState::Checked;
517 ModuleData->SensitivityEnabled = Checked == Qt::CheckState::Checked;
523 ModuleData->SensitivityOncePerSweep = Checked == Qt::CheckState::Checked;
529 ModuleData->SensitivityOffResonanceEnabled = Checked == Qt::CheckState::Checked;
535 ModuleData->SensitivityResonanceFreq = Value * 1e6;
541 ModuleData->SensitivityOffResonanceFreq = Value * 1e6;
547 ModuleData->SensitivityResonanceSpan = Value * 1e6;
565 ModuleData->SensitivityAnalysisEnabled = Checked;
577 ModuleData->SweepSeriesEnabled = Checked == Qt::CheckState::Checked;
616 ModuleData->SweepSeriesRetrace = Checked == Qt::CheckState::Checked;
622 ModuleData->SweepSeriesAdvanceLastValue = Checked == Qt::CheckState::Checked;
674 ModuleData->ODMRPlot.SelectedPoint = State ? Point : QPointF();
705 auto LockinAmplifier =
ModuleData->GetLockinAmplifier();
708 LockinAmplifier->SetEnable(
true);
762 auto LockinAmplifier =
ModuleData->GetLockinAmplifier();
764 LockinAmplifier->SetSamplingRate(
ModuleData->ODMRSamplingRate);
781 std::vector<std::tuple<double, double, double>> SaveSamples;
783 bool PerformSensitivityMeasurement =
false;
784 double RFStartFreq{};
787 bool IsBasicSampleTimeUsed{};
788 double SamplingRate{ .0 };
797 std::vector<double> FitXData;
798 std::vector<double> FitYData;
799 std::string Filename;
800 std::string ValueUnitStr;
801 std::stringstream CSVData;
806 if (!
ModuleData->GetSignalDetector()->CanRead())
814 SensitivityResonanceFreq =
ModuleData->SensitivityResonanceFreq;
815 SensitivityResonanceSpan =
ModuleData->SensitivityResonanceSpan;
817 auto SignalDetectorData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::DataStreamInstrument>(
ModuleData->GetSignalDetector()->GetInstrumentData());
818 SignalDetectorData->GetSampleStream()->SeekBeg(std::ios_base::in);
819 ODMRSamples = SignalDetectorData->GetSampleStream()->ReadBasicSamples(SignalDetectorData->GetSampleStream()->GetStreamSizeRead());
821 IsBasicSampleTimeUsed = SignalDetectorData->GetSampleStream()->IsBasicSampleTimeUsed();
824 SamplingRate =
ModuleData->GetAnalogIn()->GetNumericSampleStreamParams().SamplingRate;
826 if (SamplingRate == .0)
832 for (
size_t i = 0; i < ODMRSamples.size(); ++i)
834 const auto& Sample = ODMRSamples[i];
836 auto Frequency = RFStartFreq + (IsBasicSampleTimeUsed ? Sample.Time : (
static_cast<double>(i) / SamplingRate)) / RFDwellTime * RFFreqSpacing;
837 ODMRDataPoints.push_back({ Frequency / 1e9, Sample.Value });
838 ODMRDataPointsMinValues = { std::min(ODMRDataPointsMinValues.x(), Frequency / 1e9), std::min(ODMRDataPointsMinValues.y(), Sample.Value) };
839 ODMRDataPointsMaxValues = { std::max(ODMRDataPointsMaxValues.x(), Frequency / 1e9), std::max(ODMRDataPointsMaxValues.y(), Sample.Value) };
841 SaveSamples.emplace_back(std::make_tuple(Frequency, Sample.Time, Sample.Value));
843 if (PerformSensitivityMeasurement &&
844 Frequency >= SensitivityResonanceFreq - SensitivityResonanceSpan / 2 &&
845 Frequency <= SensitivityResonanceFreq + SensitivityResonanceSpan / 2)
847 FitXData.push_back(Frequency - SensitivityResonanceFreq);
848 FitYData.push_back(Sample.Value);
852 if (PerformSensitivityMeasurement)
854 double c0{0}, c1{0}, cov00{0}, cov01{0}, cov11{0}, chisq{0};
855 gsl_fit_linear(FitXData.data(), 1, FitYData.data(), 1, FitXData.size(), &c0, &c1, &cov00, &cov01, &cov11, &chisq);
856 ODMRFitParams = { c0, c1 };
858 for (
const auto& f : FitXData)
859 ODMRFitPoints.push_back({ (f + SensitivityResonanceFreq) / 1e9, c0 + c1 * f });
863 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(Instance.ModuleDataGetter());
865 ModuleData->ODMRPlot.DataPoints = std::move(ODMRDataPoints);
866 ModuleData->ODMRPlot.DataPointsMinValues = ODMRDataPointsMinValues;
867 ModuleData->ODMRPlot.DataPointsMaxValues = ODMRDataPointsMaxValues;
868 ModuleData->ODMRPlot.FitParams = ODMRFitParams;
869 ModuleData->ODMRPlot.FitPoints = ODMRFitPoints;
870 ModuleData->ODMRPlot.HasChanged =
true;
873 ValueUnitStr = ModuleData->GetSignalDetector()->GetValueUnitStr();
876 CSVData = ModuleData->AssembleCSVHeader(NextRFPower, NextRFModulationDepth, NextAuxAnalogOutValue,
false);
881 CSVData <<
"f(Hz);t(s);Value(" << ValueUnitStr <<
")\n";
882 for (
const auto& Sample : SaveSamples)
883 CSVData << std::get<0>(Sample) <<
";" << std::get<1>(Sample) <<
";" << std::get<2>(Sample) <<
"\n";
893 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(Instance.
ModuleDataGetter());
897 if (!ModuleData->TestFeature(ODMRData::FeatureType::LockinDetection))
899 StateMachine.ResetContext();
900 return StateType::MeasurementSeriesStep;
903 SetAuxAnalogOutValue(ModuleData);
904 ModuleData->GetRFGenerator()->SetSweep({});
905 ModuleData->GetRFGenerator()->SetTrigger({});
906 auto RFFreq = StateMachine.GetContext() == &SensitivityOffResonanceContext ? ModuleData->SensitivityOffResonanceFreq : ModuleData->SensitivityResonanceFreq;
907 InitRFGenerator(RFFreq, ModuleData->RFAutoEnabled, ModuleData);
909 auto LockinAmplifier = ModuleData->GetLockinAmplifier();
910 LockinAmplifier->SetStreamSize(ModuleData->SensitivityDuration * ModuleData->SensitivitySamplingRate);
911 LockinAmplifier->SetSamplingRate(ModuleData->SensitivitySamplingRate);
913 WaitUntilReadyAndTrigger(ModuleData);
915 return StateType::SensitivityWait;
920 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(Instance.
ModuleDataGetter());
922 return ModuleData->GetSignalDetector()->HasFinished() ? StateType::SensitivityFinish : StateType::SensitivityWait;
927 std::vector<std::tuple<double, double>> SaveSamples;
930 bool SensitivityOffResonanceEnabled =
false;
931 bool SensitivityAnalysisEnabled =
false;
932 decltype(ODMRPlotType::FitParams) ODMRFitParams{};
933 decltype(ODMRData::GyromagneticRatio) GyromagneticRatio{};
935 std::vector<std::complex<double>> SensitivityASD;
936 decltype(SensitivityPlotType::DataPoints) SensitivityDataPoints;
937 decltype(SensitivityPlotType::DataPointsMinValues) SensitivityDataPointsMinValues = { std::numeric_limits<double>::max(), std::numeric_limits<double>::max() };
938 decltype(SensitivityPlotType::DataPointsMaxValues) SensitivityDataPointsMaxValues = { std::numeric_limits<double>::lowest(), std::numeric_limits<double>::lowest() };
939 std::string Filename;
940 std::string FilenamePrefix;
941 std::string ValueUnitStr;
942 std::stringstream CSVData;
945 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(Instance.
ModuleDataGetter());
947 if (!ModuleData->GetSignalDetector()->CanRead())
948 return StateType::SensitivityFinish;
950 MeasurementMode = ModuleData->MeasurementMode;
951 Save = ModuleData->AutosaveEnabled;
952 SensitivityOffResonanceEnabled = ModuleData->SensitivityOffResonanceEnabled;
953 SensitivityAnalysisEnabled = ModuleData->SensitivityAnalysisEnabled;
954 ODMRFitParams = ModuleData->ODMRPlot.FitParams;
955 GyromagneticRatio = ModuleData->GyromagneticRatio;
957 auto SignalDetectorData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::DataStreamInstrument>(ModuleData->GetSignalDetector()->GetInstrumentData());
958 SignalDetectorData->GetSampleStream()->SeekBeg(std::ios_base::in);
959 SensitivitySamples = SignalDetectorData->GetSampleStream()->ReadBasicSamples(SignalDetectorData->GetSampleStream()->GetStreamSizeRead());
962 for (
const auto& Sample : SensitivitySamples)
964 SaveSamples.emplace_back(std::make_tuple(Sample.Time, Sample.Value));
966 if (MeasurementMode == ODMRData::MeasurementModeType::All && StateMachine.GetContext() != &SensitivityOffResonanceContext)
967 SensitivityASD.emplace_back(Sample.Value / std::get<1>(ODMRFitParams) / GyromagneticRatio, 0);
970 if (SensitivityASD.size() > 2 && SensitivityAnalysisEnabled && StateMachine.GetContext() != &SensitivityOffResonanceContext)
972 const auto Length =
static_cast<double>(SensitivityASD.size());
974 SensitivityASD =
Util::FFT(SensitivityASD);
975 std::transform(SensitivityASD.cbegin(), SensitivityASD.cend(), SensitivityASD.begin(), [Length](
auto x) { return std::abs(x / Length); });
978 SensitivityASD.erase(SensitivityASD.cbegin() + SensitivityASD.size() / 2 + 1, SensitivityASD.cend());
979 std::transform(SensitivityASD.cbegin() + 1, SensitivityASD.cend(), SensitivityASD.begin() + 1, [Length](
auto x) { return 2.0 * x; });
982 double TimeSamplingRate = 1 / (std::abs(SensitivitySamples.back().Time - SensitivitySamples.front().Time) / (SensitivitySamples.size() - 1));
983 std::vector<double> Frequencies(Length / 2 + 1, 0);
984 std::iota(Frequencies.begin(), Frequencies.end(), 0);
985 std::transform(Frequencies.cbegin(), Frequencies.cend(), Frequencies.begin(), [TimeSamplingRate, Length](
auto x) { return TimeSamplingRate * x / Length; });
987 double FrequencySamplingRate = std::abs(Frequencies.back() - Frequencies.front()) / (Frequencies.size() - 1);
988 std::transform(SensitivityASD.cbegin(), SensitivityASD.cend(), SensitivityASD.begin(), [FrequencySamplingRate](
auto x) { return x / std::sqrt(FrequencySamplingRate); });
990 if (SensitivityASD.size() == Frequencies.size())
991 for (
size_t i = 1; i < SensitivityASD.size(); ++i)
993 SensitivityDataPoints.push_back({ Frequencies[i], SensitivityASD[i].real() });
994 SensitivityDataPointsMinValues = { std::min(SensitivityDataPointsMinValues.x(), SensitivityDataPoints.back().x()),
995 std::min(SensitivityDataPointsMinValues.y(), SensitivityDataPoints.back().y()) };
996 SensitivityDataPointsMaxValues = { std::max(SensitivityDataPointsMaxValues.x(), SensitivityDataPoints.back().x()),
997 std::max(SensitivityDataPointsMaxValues.y(), SensitivityDataPoints.back().y()) };
1002 auto ModuleData = DynExp::dynamic_ModuleData_cast<ODMR>(Instance.
ModuleDataGetter());
1004 if (StateMachine.GetContext() != &SensitivityOffResonanceContext)
1006 ModuleData->SensitivityPlot.DataPoints = std::move(SensitivityDataPoints);
1007 ModuleData->SensitivityPlot.DataPointsMinValues = SensitivityDataPointsMinValues;
1008 ModuleData->SensitivityPlot.DataPointsMaxValues = SensitivityDataPointsMaxValues;
1009 ModuleData->SensitivityPlot.HasChanged =
true;
1011 FilenamePrefix =
"Sensitivity";
1014 FilenamePrefix =
"OffResSensitivity";
1017 ValueUnitStr = ModuleData->GetSignalDetector()->GetValueUnitStr();
1020 CSVData = ModuleData->AssembleCSVHeader(NextRFPower, NextRFModulationDepth, NextAuxAnalogOutValue, StateMachine.GetContext() == &SensitivityOffResonanceContext);
1025 CSVData <<
"t(s);Value(" << ValueUnitStr <<
")\n";
1026 CSVData << std::setprecision(12);
1027 for (
const auto& Sample : SaveSamples)
1028 CSVData << std::get<0>(Sample) <<
";" << std::get<1>(Sample) <<
"\n";
1033 if (SensitivityOffResonanceEnabled)
1035 if (StateMachine.GetContext() == &SensitivityOffResonanceContext)
1036 StateMachine.ResetContext();
1039 StateMachine.SetContext(&SensitivityOffResonanceContext);
1040 return StateType::SensitivityInit;
1044 return StateType::MeasurementSeriesStep;
Implementation of a module to perform optically detected magnetic resonance (ODMR) measurements.
Meta instrument for a single analog input port based on the data stream and generic input port meta i...
std::vector< BasicSample > BasicSampleListType
Type of a list containing data stream samples of type BasicSample.
@ Arbitrary
Arbitrary units (a.u.)
Meta instrument for a lock-in amplifier based on the data stream meta instrument.
bool SweepSeriesAdvanceLastValue
DynExpInstr::DataStreamInstrumentData::ValueType AuxAnalogOutMinValue
double SensitivityResonanceFreq
std::stringstream AssembleCSVHeader(double RFPower, double RFModulationDepth, double AuxAnalogOutValue, bool IsRFOffResonance)
bool TestFeature(const std::array< FeatureType, N > &Flags) const
DynExpInstr::DataStreamInstrumentData::UnitType AuxAnalogOutValueUnit
SweepSeriesType SweepSeries
auto & GetRFGenerator() noexcept
double SensitivitySamplingRate
unsigned long long CurrentSweepIndex
SensitivityPlotType SensitivityPlot
DynExpInstr::FunctionGeneratorDefs::FunctionDescType RFGeneratorMaxFuncDesc
double SensitivityResonanceSpan
Util::FeatureTester< FeatureType > Features
double SensitivityOffResonanceFreq
unsigned long long GetSweepNumberSteps() const noexcept
bool SensitivityOncePerSweep
bool SensitivityAnalysisEnabled
unsigned int CurrentSaveIndex
MeasurementModeType MeasurementMode
DynExpInstr::FunctionGeneratorDefs::FunctionDescType RFGeneratorDefaultFuncDesc
RFModulationType RFModulation
double SensitivityDuration
DynExpInstr::FunctionGeneratorDefs::FunctionDescType RFGeneratorMinFuncDesc
bool SensitivityOffResonanceEnabled
DynExpInstr::DataStreamInstrumentData::ValueType AuxAnalogOutMaxValue
auto & GetSignalDetector() noexcept
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
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...
size_t NumFailedUpdateAttempts
void InitRFGenerator(double Frequency, bool EnableRF, Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnEnableSweepSeriesClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnSweepSeriesStopChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnRFModDepthChanged(DynExp::ModuleInstance *Instance, double Value) const
void ConnectChartWidgets(QLineSeries *ODMRLineSeries)
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
Util::StateMachine< StateMachineStateType > StateMachine
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 WaitUntilReadyAndTrigger(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
StateType MeasurementSeriesInitFunc(DynExp::ModuleInstance &Instance)
void OnSweepSeriesAdvanceLastValueClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnStopClicked(DynExp::ModuleInstance *Instance, bool) const
void OnSweepSeriesRetraceClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
StateType ODMRTraceWaitFunc(DynExp::ModuleInstance &Instance)
void OnRFModNoneClicked(DynExp::ModuleInstance *Instance, bool Checked) const
void OnAutosaveClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnRFFreqSpanChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnGyromagneticRatioChanged(DynExp::ModuleInstance *Instance, double Value) const
std::chrono::milliseconds GetMainLoopDelay() const override final
Specifies in which time intervals the module's event queue runs to handle pending events.
bool IsReadyState() const noexcept
void OnODMRSamplingRateChanged(DynExp::ModuleInstance *Instance, double Value) const
void ResetImpl(dispatch_tag< QModuleBase >) override final
void OnRFOnClicked(DynExp::ModuleInstance *Instance, bool) const
double NextAuxAnalogOutValue
void OnRFModPulseClicked(DynExp::ModuleInstance *Instance, bool Checked) const
StateType ReadyStateFunc(DynExp::ModuleInstance &Instance)
void OnRecordSensitivityOffResonanceClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
ODMR(const std::thread::id OwnerThreadID, DynExp::ParamsBasePtrType &&Params)
void OnSavePathChanged(DynExp::ModuleInstance *Instance, QString Path) const
void OnSweepSeriesStepChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnSensitivityResonanceSpanChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnSensitivityOffResonanceFreqChanged(DynExp::ModuleInstance *Instance, double Value) const
StateType ODMRTraceInitFunc(DynExp::ModuleInstance &Instance)
StateType InitializingStateFunc(DynExp::ModuleInstance &Instance)
double NextRFModulationDepth
void SetAuxAnalogOutValue(Util::SynchronizedPointer< ModuleDataType > &ModuleData) const
void OnSaveIndexChanged(DynExp::ModuleInstance *Instance, int Index) const
void OnODMRChartHovered(DynExp::ModuleInstance *Instance, QPointF Point, bool State) const
StateType MeasurementSeriesStepFunc(DynExp::ModuleInstance &Instance)
void OnODMRChartClicked(DynExp::ModuleInstance *Instance, QPointF Point) const
void OnRFFreqSpacingChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnRFModFreqChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnRFDwellTimeChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnStartClicked(DynExp::ModuleInstance *Instance, bool) const
void InitSweepValues(Util::SynchronizedPointer< ModuleDataType > &ModuleData)
void OnSensitivitySamplingRateChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnSensitivityResonanceFreqChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnRFModSineClicked(DynExp::ModuleInstance *Instance, bool Checked) const
void OnStartSensitivityClicked(DynExp::ModuleInstance *Instance, bool) const
void OnRFAutoEnableClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnRFOffClicked(DynExp::ModuleInstance *Instance, bool) const
void OnRecordSensitivityClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnSweepSeriesParamChanged(DynExp::ModuleInstance *Instance, int Index) const
void OnEnableSensitivityAnalysisClicked(DynExp::ModuleInstance *Instance, bool Checked) const
void OnRecordSensitivityOncePerSweepClicked(DynExp::ModuleInstance *Instance, Qt::CheckState Checked) const
void OnRFPowerChanged(DynExp::ModuleInstance *Instance, double Value) const
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...
void OnSweepSeriesStartChanged(DynExp::ModuleInstance *Instance, double Value) const
StateType ODMRTraceFinishFunc(DynExp::ModuleInstance &Instance)
void OnRFCenterFreqChanged(DynExp::ModuleInstance *Instance, double Value) const
void OnSensitivityDurationChanged(DynExp::ModuleInstance *Instance, double Value) const
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.
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....
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.
Data to operate on is invalid for a specific purpose. This indicates a corrupted data structure or fu...
Pointer to lock a class derived from ISynchronizedPointerLockable for synchronizing between threads....
Thrown when an operation timed out before it could be completed, especially used for locking shared d...
@ Rise
Trigger on rising edge.
@ ExternSingle
Run once after an external trigger signal has been detected.
QList< QPointF > DataPoints
QPointF DataPointsMaxValues
std::tuple< double, double > FitParams
QPointF DataPointsMinValues
QList< QPointF > FitPoints
void WaitForInstruments(InstrTs &... Instruments)
Blocks until every instrument passed to the function as a reference parameter has arrived at a synchr...
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 ...
auto RemoveExtFromPath(std::string Path)
Removes the filename's extension from a path.
std::vector< std::complex< double > > FFT(const std::vector< std::complex< double > > &Data, bool InverseTransform)
Computes the Fast Fourier Transform (FFT) a vector of complex values.
Accumulates include statements to provide a precompiled header.
@ Sine
Sinusoidally modulate the affected quantity.
@ Pulse
Pulse (binary) modulation switching the affected quantity between two values.
@ Frequency
Modulation affecting the waveform's frequency.
@ Frequency
Sweep the waveform's frequency.
@ Rise
Trigger on rising edge.
@ ExternSingle
Run once after an external trigger signal has been detected.