4#include "moc_LaserScanningSpectroscopy.cpp"
5#include "ui_LaserScanningSpectroscopy.h"
11 : QModuleWidget(Owner, parent),
17 this->addAction(
ui->action_Stop);
24 const QSignalBlocker SBLowerFrequencyLimitBlocker(
ui->SBLowerFrequencyLimit);
25 ui->SBLowerFrequencyLimit->setRange(ModuleData->GetLaser()->GetMinFrequency() * 1e-9, ModuleData->GetLaser()->GetMaxFrequency() * 1e-9);
26 ui->SBLowerFrequencyLimit->setValue(ModuleData->GetLaser()->GetMinFrequency() * 1e-9);
28 const QSignalBlocker SBUpperFrequencyLimitBlocker(
ui->SBUpperFrequencyLimit);
29 ui->SBUpperFrequencyLimit->setRange(ModuleData->GetLaser()->GetMinFrequency() * 1e-9, ModuleData->GetLaser()->GetMaxFrequency() * 1e-9);
30 ui->SBUpperFrequencyLimit->setValue((ModuleData->GetLaser()->GetMinFrequency() + ModuleData->GetLaser()->GetModeHopFreeTuningRange()) * 1e-9);
32 const QSignalBlocker SBFrequencyRangeBlocker(
ui->SBFrequencyRange);
33 ui->SBFrequencyRange->setRange(0.0, ModuleData->GetLaser()->GetModeHopFreeTuningRange() * 1e-9);
34 ui->SBFrequencyRange->setValue(ModuleData->GetLaser()->GetModeHopFreeTuningRange() * 1e-9);
36 const QSignalBlocker SBCenterFrequencyBlocker(
ui->SBCenterFrequency);
37 ui->SBCenterFrequency->setRange(ModuleData->GetLaser()->GetMinFrequency() * 1e-9 + 0.5 * ModuleData->GetLaser()->GetModeHopFreeTuningRange() * 1e-9, ModuleData->GetLaser()->GetMaxFrequency() * 1e-9 - 0.5 * ModuleData->GetLaser()->GetModeHopFreeTuningRange() * 1e-9);
38 ui->SBCenterFrequency->setValue(ModuleData->GetLaser()->GetMinFrequency() * 1e-9 + 0.5 * ModuleData->GetLaser()->GetModeHopFreeTuningRange() * 1e-9);
40 const QSignalBlocker SBStepSizeBlocker(
ui->SBStepSize);
41 ui->SBStepSize->setRange(1, 10000);
42 ui->SBStepSize->setValue(100);
44 const QSignalBlocker SBNumberOfStepsBlocker(
ui->SBNumberOfSteps);
45 ui->SBNumberOfSteps->setRange(1, 10000);
46 ui->SBNumberOfSteps->setValue(
ui->SBFrequencyRange->value() * 1e3 /
ui->SBStepSize->value());
48 const QSignalBlocker SBNumberOfRepetitionsBlocker(
ui->SBNumberOfRepetitions);
49 ui->SBNumberOfRepetitions->setRange(1, 10000);
50 ui->SBNumberOfRepetitions->setValue(1);
52 ModuleData->LowerFrequencyLimit =
ui->SBLowerFrequencyLimit->value() * 1e9;
53 ModuleData->UpperFrequencyLimit =
ui->SBUpperFrequencyLimit->value() * 1e9;
54 ModuleData->FrequencyRange =
ui->SBFrequencyRange->value() * 1e9;
55 ModuleData->CenterFrequency =
ui->SBCenterFrequency->value() * 1e9;
56 ModuleData->StepSize =
ui->SBStepSize->value() * 1e6;
57 ModuleData->NumberOfSteps =
ui->SBNumberOfSteps->value();
58 ModuleData->NumberOfRepetitions =
ui->SBNumberOfRepetitions->value();
59 ModuleData->ScanBackAndForth =
ui->CBScanBackAndForth->isChecked();
61 ModuleData->ScanStartFrequency =
ui->RBStartAtMinimum->isChecked() ? ModuleData->LowerFrequencyLimit : ModuleData->UpperFrequencyLimit;
62 ModuleData->ScanEndFrequency =
ui->RBStartAtMinimum->isChecked() ? ModuleData->UpperFrequencyLimit : ModuleData->LowerFrequencyLimit;
70 auto Filename =
Util::PromptSaveFilePathModule(
this,
"Select directory and filename prefix for saving data",
".csv",
"Comma-separated values file (*.csv)");
71 if (Filename.isEmpty())
75 ui->LEPath->setText(Filename);
109 : QModuleBase(OwnerThreadID, std::move(Params)),
110 StateMachine(ReadyState, WaitForSettingFrequencyState, WaitForCapturingState)
120 ModuleData->LaserState = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Laser>(
ModuleData->GetLaser()->GetInstrumentData())->GetLaserState();
145 auto Widget = std::make_unique<LaserScanningSpectroscopyWidget>(*
this);
172 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
173 auto ModuleData = DynExp::dynamic_ModuleData_cast<LaserScanningSpectroscopy>(ModuleDataGetter());
179 Widget->GetUI()->action_StepwiseScan->setEnabled(
Ready);
181 Widget->GetUI()->SBLowerFrequencyLimit->setEnabled(
Ready);
182 Widget->GetUI()->SBUpperFrequencyLimit->setEnabled(
Ready);
183 Widget->GetUI()->SBFrequencyRange->setEnabled(
Ready);
184 Widget->GetUI()->SBCenterFrequency->setEnabled(
Ready);
186 Widget->GetUI()->SBNumberOfSteps->setEnabled(
Ready);
187 Widget->GetUI()->SBNumberOfRepetitions->setEnabled(
Ready);
192 Widget->GetUI()->PBLaserScanningSpectroscopyProgress->setVisible(!
Ready);
193 Widget->GetUI()->PBLaserScanningSpectroscopyProgress->setValue(
static_cast<int>(100.0 *
196 if (SettingFrequency)
197 Widget->GetUI()->LLaserScanningSpectroscopyState->setText(
" Stabilizing");
199 Widget->GetUI()->LLaserScanningSpectroscopyState->setText(
" Capturing");
201 Widget->GetUI()->LLaserScanningSpectroscopyState->setText(
" Ready");
205 const QSignalBlocker LEPathBlocker(
Widget->GetUI()->LEPath);
206 Widget->GetUI()->LEPath->setText(QString::fromStdString(
ModuleData->FileSavePath.string()));
231 double Frequency = 0.0;
254 ModuleData->GetLaser()->SetFrequency(Frequency);
260 SavePath.replace_filename(SavePath.filename().stem().concat(FilenameSuffix));
261 std::filesystem::create_directories(SavePath.parent_path());
268 auto ModuleParams = DynExp::dynamic_Params_cast<LaserScanningSpectroscopy>(Instance->
ParamsGetter());
271 if (ModuleParams->PLECommunicator.ContainsID())
276 if (ModuleParams->WFCommunicator.ContainsID())
311 ModuleData->LaserScanningSpectroscopyProgress = 0;
315 auto ModuleParams = DynExp::dynamic_Params_cast<LaserScanningSpectroscopy>(Instance->
ParamsGetter());
316 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->CapturingTimeDifference);
344 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
346 double NewFrequencyRange =
ModuleData->UpperFrequencyLimit - LowerFrequencyLimit * 1e9;
347 ModuleData->LowerFrequencyLimit = LowerFrequencyLimit * 1e9;
349 if (NewFrequencyRange < 0)
351 NewFrequencyRange =
ModuleData->FrequencyRange;
352 ModuleData->UpperFrequencyLimit = LowerFrequencyLimit * 1e9 + NewFrequencyRange;
354 else if (NewFrequencyRange >
ModuleData->ModeHopFreeTuningRange)
356 NewFrequencyRange =
ModuleData->ModeHopFreeTuningRange;
357 ModuleData->UpperFrequencyLimit = LowerFrequencyLimit * 1e9 + NewFrequencyRange;
361 ModuleData->CenterFrequency = LowerFrequencyLimit * 1e9 + NewFrequencyRange / 2;
362 ModuleData->FrequencyRange = NewFrequencyRange;
364 ModuleData->GetLaser()->SetScanRange(NewFrequencyRange);
366 const QSignalBlocker SBUpperFrequencyLimitBlocker(
Widget->GetUI()->SBUpperFrequencyLimit);
367 const QSignalBlocker SBFrequencyRangeBlocker(
Widget->GetUI()->SBFrequencyRange);
368 const QSignalBlocker SBCenterFrequencyBlocker(
Widget->GetUI()->SBCenterFrequency);
369 const QSignalBlocker SBNumberOfStepsBlocker(
Widget->GetUI()->SBNumberOfSteps);
370 Widget->GetUI()->SBUpperFrequencyLimit->setValue(
ModuleData->UpperFrequencyLimit / 1e9);
371 Widget->GetUI()->SBFrequencyRange->setValue(
ModuleData->FrequencyRange / 1e9);
372 Widget->GetUI()->SBCenterFrequency->setValue(
ModuleData->CenterFrequency / 1e9);
379 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
381 double NewFrequencyRange = UpperFrequencyLimit * 1e9 -
ModuleData->LowerFrequencyLimit;
382 ModuleData->UpperFrequencyLimit = UpperFrequencyLimit * 1e9;
384 if (NewFrequencyRange < 0)
386 NewFrequencyRange =
ModuleData->FrequencyRange;
387 ModuleData->LowerFrequencyLimit = UpperFrequencyLimit * 1e9 - NewFrequencyRange;
389 else if (NewFrequencyRange >
ModuleData->ModeHopFreeTuningRange)
391 NewFrequencyRange =
ModuleData->ModeHopFreeTuningRange;
392 ModuleData->LowerFrequencyLimit = UpperFrequencyLimit * 1e9 - NewFrequencyRange;
396 ModuleData->CenterFrequency = UpperFrequencyLimit * 1e9 - NewFrequencyRange / 2;
397 ModuleData->FrequencyRange = NewFrequencyRange;
399 ModuleData->GetLaser()->SetScanRange(NewFrequencyRange);
401 const QSignalBlocker SBLowerFrequencyLimitBlocker(
Widget->GetUI()->SBLowerFrequencyLimit);
402 const QSignalBlocker SBFrequencyRangeBlocker(
Widget->GetUI()->SBFrequencyRange);
403 const QSignalBlocker SBCenterFrequencyBlocker(
Widget->GetUI()->SBCenterFrequency);
404 const QSignalBlocker SBNumberOfStepsBlocker(
Widget->GetUI()->SBNumberOfSteps);
405 Widget->GetUI()->SBLowerFrequencyLimit->setValue(
ModuleData->LowerFrequencyLimit / 1e9);
406 Widget->GetUI()->SBFrequencyRange->setValue(NewFrequencyRange / 1e9);
407 Widget->GetUI()->SBCenterFrequency->setValue(
ModuleData->CenterFrequency / 1e9);
414 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
416 ModuleData->FrequencyRange = FrequencyRange * 1e9;
417 const double NewFrequencyRange = FrequencyRange * 1e9 <=
ModuleData->ModeHopFreeTuningRange ? FrequencyRange * 1e9 :
ModuleData->ModeHopFreeTuningRange;
422 ModuleData->FrequencyRange = NewFrequencyRange;
424 ModuleData->GetLaser()->SetScanRange(NewFrequencyRange);
426 const QSignalBlocker SBUpperFrequencyLimitBlocker(
Widget->GetUI()->SBUpperFrequencyLimit);
427 const QSignalBlocker SBFrequencyRangeBlocker(
Widget->GetUI()->SBFrequencyRange);
428 const QSignalBlocker SBCenterFrequencyBlocker(
Widget->GetUI()->SBCenterFrequency);
429 const QSignalBlocker SBNumberOfStepsBlocker(
Widget->GetUI()->SBNumberOfSteps);
430 Widget->GetUI()->SBUpperFrequencyLimit->setValue(
ModuleData->UpperFrequencyLimit / 1e9);
431 Widget->GetUI()->SBFrequencyRange->setValue(
ModuleData->FrequencyRange / 1e9);
432 Widget->GetUI()->SBCenterFrequency->setValue(
ModuleData->CenterFrequency / 1e9);
438 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
441 ModuleData->CenterFrequency = CenterFrequency * 1e9;
447 const QSignalBlocker SBLowerFrequencyLimitBlocker(
Widget->GetUI()->SBLowerFrequencyLimit);
448 const QSignalBlocker SBUpperFrequencyLimitBlocker(
Widget->GetUI()->SBUpperFrequencyLimit);
449 Widget->GetUI()->SBLowerFrequencyLimit->setValue(
ModuleData->LowerFrequencyLimit / 1e9);
450 Widget->GetUI()->SBUpperFrequencyLimit->setValue(
ModuleData->UpperFrequencyLimit / 1e9);
455 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
463 const QSignalBlocker SBNumberOfStepsBlocker(
Widget->GetUI()->SBNumberOfSteps);
469 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
477 const QSignalBlocker SBStepSizeBlocker(
Widget->GetUI()->SBStepSize);
484 ModuleData->NumberOfRepetitions = NumberOfRepetitions;
495 auto Widget = GetWidget<LaserScanningSpectroscopyWidget>();
498 ModuleData->IsStepwiseScan =
Widget->GetUI()->action_StepwiseScan->isChecked();
519 ModuleData->FileSavePath = std::filesystem::path(SaveFilename);
549 auto ModuleParams = DynExp::dynamic_Params_cast<LaserScanningSpectroscopy>(Instance->
ParamsGetter());
550 WaitingEndTimePoint = std::chrono::system_clock::now() + std::chrono::milliseconds(ModuleParams->CapturingTimeDifference);
563 auto LaserInstrData = DynExp::dynamic_InstrumentData_cast<DynExpInstr::Laser>(
ModuleData->GetLaser()->GetInstrumentData());
580 ModuleData->LaserScanningSpectroscopyProgress++;
591 auto ModuleParams = DynExp::dynamic_Params_cast<LaserScanningSpectroscopy>(Instance.
ParamsGetter());
603 ModuleData->LaserScanningSpectroscopyProgress++;
Implementation of a module to perform photoluminescence excitation spectroscopy.
@ Startup
The laser is warming up.
@ EmissionEnabledConstant
The laser is emitting in constant mode.
@ Ready
The laser is ready for emission.
This event signals that an action (like a measurement) started by a TriggerEvent has been completed.
double ScanStartFrequency
void ResetImpl(dispatch_tag< QModuleDataBase >) override final
int LaserScanningSpectroscopyProgress
double LowerFrequencyLimit
StateType LaserScanningSpectroscopyState
std::filesystem::path FileSavePath
double ModeHopFreeTuningRange
DynExpInstr::LaserData::LaserStateType LaserState
double UpperFrequencyLimit
void OnStop(DynExp::ModuleInstance *Instance) const
std::chrono::system_clock::time_point WaitingEndTimePoint
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...
void OnFinishedCapturing(DynExp::ModuleInstance *Instance) const
StateType WaitForSettingFrequencyStateFunc(DynExp::ModuleInstance &Instance)
void OnStart(DynExp::ModuleInstance *Instance) const
void OnStartAtToggled(DynExp::ModuleInstance *Instance, bool) const
void OnNumberOfRepetitionsChanged(DynExp::ModuleInstance *Instance, int NumberOfRepetitions) 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...
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 FrequencyStep(DynExp::ModuleInstance *Instance) const
StateType WaitForCapturingStateFunc(DynExp::ModuleInstance &Instance)
std::filesystem::path BuildFilename(Util::SynchronizedPointer< ModuleDataType > &ModuleData, std::string_view FilenameSuffix) const
void OnStepSizeChanged(DynExp::ModuleInstance *Instance, double StepSize) const
Util::StateMachine< StateMachineStateType > StateMachine
bool IsSettingFrequencyState() const noexcept
void OnExit(DynExp::ModuleInstance *Instance) const override final
This event is triggered right before the module thread terminates (not due to an exception,...
bool IsCapturingState() const noexcept
void ResetImpl(dispatch_tag< QModuleBase >) override final
size_t NumFailedUpdateAttempts
bool IsReadyState() const noexcept
StateType ReadyStateFunc(DynExp::ModuleInstance &Instance)
void OnLowerFrequencyLimitChanged(DynExp::ModuleInstance *Instance, double LowerFrequencyLimit) const
void OnPathChanged(DynExp::ModuleInstance *Instance, const std::string &SaveFilename) const
void OnNumberOfStepsChanged(DynExp::ModuleInstance *Instance, int NumberOfSteps) const
void OnStartClicked(DynExp::ModuleInstance *Instance, bool) const
void OnUpperFrequencyLimitChanged(DynExp::ModuleInstance *Instance, double UpperFrequencyLimit) const
void UpdateUIChild(const ModuleBase::ModuleDataGetterType &ModuleDataGetter) override final
void OnScanBackAndForthToggled(DynExp::ModuleInstance *Instance, bool Checked) const
void OnFrequencyRangeChanged(DynExp::ModuleInstance *Instance, double FrequencyRange) const
void OnCenterFrequencyChanged(DynExp::ModuleInstance *Instance, double CenterFrequency) const
void OnStopClicked(DynExp::ModuleInstance *Instance, bool) const
This event tells the receiver where to store e.g. acquired data.
This event is intended to make the receiver prepare an action (like a measurement) that is started wh...
This event is intended to make the receiver stop an action (like a measurement).
This event is intended to make the receiver start an action (like a measurement) after it received a ...
static void Register(const ModuleBase &Listener, CallableT EventFunc, ItemIDType CommunicatorID=ItemIDNotSet)
Registers/Subscribes module Listener to the event with the event function EventFunc....
static void Deregister(const ModuleBase &Listener)
Deregisters/unsubscribes module Listener from the event, regardless of the inter-module communicator ...
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.
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...
@ WaitForSettingFrequency
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.
QString PromptSaveFilePathModule(DynExp::QModuleWidget *Parent, const QString &Title, const QString &DefaultSuffix, const QString &NameFilter)
Works as PromptOpenFilePath() but asks the user to select a single file which does not need to exist....
Accumulates include statements to provide a precompiled header.