#include #include #include namespace CTA { namespace ACTL { namespace CDTS { SimulatorFrame::SimulatorFrame(const TGWindow& pParent, const Simulator_ptr& pSimulator, uint16_t pWidth, uint16_t pHeight) : TGVerticalFrame(&pParent, pWidth, pHeight), fSimulator(pSimulator), fHints(), fMainFrame(this, pWidth, pHeight / 2.), fStartStopButton(&fMainFrame, "Stop", 1), fFrequencyLabel(&fMainFrame, "Frequency [Hz]:"), fFrequencyEntry(&fMainFrame, fSimulator->GetFrequencyInHz(), 1, 2, TGNumberFormat::kNESRealOne, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1e-1, 1e6), fFrequencySlider(&fMainFrame, 100, kSlider1 | kScaleDownRight, 2), fRMSLabel(&fMainFrame, "RMS [ps]:"), fRMSEntry(&fMainFrame, fSimulator->GetRMSInPS(), 0, 3, TGNumberFormat::kNESInteger, TGNumberFormat::kNEANonNegative, TGNumberFormat::kNELLimitMinMax, 1e-1, 1e6), fRMSSlider(&fMainFrame, 100, kSlider1 | kScaleDownRight, 4), fErrorFrame(this, pWidth, pHeight / 2.), fBunchCounterErrorButton(&fErrorFrame, "Bunch Counter Errors", 5), fEventCounterErrorButton(&fErrorFrame, "Event Counter Errors", 6), fTimeStampMissingButton(&fErrorFrame, "Time Stamp Missing", 7), fSecondErrorButton(&fErrorFrame, "Second Errors", 8), fPicoSecondErrorButton(&fErrorFrame, "Picosecond Errors", 9) { fStartStopButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "StartStopClicked()"); FillFrame(fMainFrame, fHints, fStartStopButton, 100, 50); FillFrame(fMainFrame, fHints, fFrequencyLabel, 50, 20); fFrequencyEntry.Connect("ValueChanged(Long_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "FrequencyEntryChanged()"); fFrequencyEntry.Connect("ValueSet(Long_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "FrequencyEntryChanged()"); FillFrame(fMainFrame, fHints, fFrequencyEntry, 100, 20); fFrequencySlider.Connect("PositionChanged(Int_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "FrequencySliderChanged()"); fFrequencySlider.SetRange(-100, 600); fFrequencySlider.SetPosition(std::log10(fSimulator->GetFrequencyInHz()) * 100); FillFrame(fMainFrame, fHints, fFrequencySlider, 150, 20); FillFrame(fMainFrame, fHints, fRMSLabel, 50, 20); fRMSEntry.Connect("ValueChanged(Long_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "RMSEntryChanged()"); fRMSEntry.Connect("ValueSet(Long_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "RMSEntryChanged()"); FillFrame(fMainFrame, fHints, fRMSEntry, 100, 20); fRMSSlider.Connect("PositionChanged(Int_t)", "CTA::ACTL::CDTS::SimulatorFrame", this, "RMSSliderChanged()"); fRMSSlider.SetRange(-100, 600); fRMSSlider.SetPosition(std::log10(fSimulator->GetRMSInPS()) * 100); FillFrame(fMainFrame, fHints, fRMSSlider, 150, 20); FillFrame(*this, fHints, fMainFrame); fBunchCounterErrorButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "BunchCounterErrorClicked()"); FillFrame(fErrorFrame, fHints, fBunchCounterErrorButton, 100, 20); fEventCounterErrorButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "EventCounterErrorClicked()"); FillFrame(fErrorFrame, fHints, fEventCounterErrorButton, 100, 20); fTimeStampMissingButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "TimeStampMissingClicked()"); FillFrame(fErrorFrame, fHints, fTimeStampMissingButton, 100, 20); fSecondErrorButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "SecondErrorClicked()"); FillFrame(fErrorFrame, fHints, fSecondErrorButton, 100, 20); fPicoSecondErrorButton.Connect("Clicked()", "CTA::ACTL::CDTS::SimulatorFrame", this, "PicoSecondErrorClicked()"); FillFrame(fErrorFrame, fHints, fPicoSecondErrorButton, 100, 20); FillFrame(*this, fHints, fErrorFrame); fSimulator->Start(); } SimulatorFrame::~SimulatorFrame() { fSimulator->Stop(); } void SimulatorFrame::StartStopClicked() { if (fSimulator->IsRunning()) { fStartStopButton.SetText("Start"); fSimulator->Stop(); } else { fStartStopButton.SetText("Stop"); fSimulator->Start(); } } void SimulatorFrame::FrequencyEntryChanged() { double frequency = fFrequencyEntry.GetNumber(); fFrequencySlider.SetPosition(std::log10(frequency) * 100); fSimulator->SetFrequency(frequency); } void SimulatorFrame::FrequencySliderChanged() { double index = fFrequencySlider.GetPosition(); double frequency = std::pow(10, index / 100); fFrequencyEntry.SetNumber(frequency); fSimulator->SetFrequency(frequency); } void SimulatorFrame::RMSEntryChanged() { double rms = fRMSEntry.GetNumber(); fRMSSlider.SetPosition(std::log10(rms) * 100); fSimulator->SetRMS(rms); } void SimulatorFrame::RMSSliderChanged() { double index = fRMSSlider.GetPosition(); double rms = std::pow(10, index / 100); fRMSEntry.SetNumber(rms); fSimulator->SetRMS(rms); } void SimulatorFrame::BunchCounterErrorClicked() { fSimulator->SetBunchCounterErrorEnabled(fBunchCounterErrorButton.IsOn()); } void SimulatorFrame::EventCounterErrorClicked() { fSimulator->SetEventCounterErrorEnabled(fEventCounterErrorButton.IsOn()); } void SimulatorFrame::TimeStampMissingClicked() { fSimulator->SetTimeStampMissingEnabled(fTimeStampMissingButton.IsOn()); } void SimulatorFrame::SecondErrorClicked() { fSimulator->SetSecondErrorEnabled(fSecondErrorButton.IsOn()); } void SimulatorFrame::PicoSecondErrorClicked() { fSimulator->SetPicoSecondErrorEnabled(fPicoSecondErrorButton.IsOn()); } SimulatorViewer::SimulatorViewer(const Simulators& pSimulators, const std::string& pName, uint16_t pWidth, uint16_t pHeight) : TGMainFrame(gClient->GetDefaultRoot(), pWidth, pHeight * pSimulators.size()), fFrames() { for (auto& simulator : pSimulators) { fFrames.push_back(std::make_shared(*this, simulator, pWidth, pHeight)); FillFrame(*this, fHints, **fFrames.rbegin(), pWidth, pHeight); } SetWindowName(pName.c_str()); MapSubwindows(); Resize(GetDefaultSize()); MapWindow(); } } } } ClassImp(CTA::ACTL::CDTS::SimulatorFrame); ClassImp(CTA::ACTL::CDTS::SimulatorViewer)