From 6d1856daa217ecc1bea546237689bd9a06d706f6 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Thu, 3 Sep 2020 10:47:02 +0200 Subject: [PATCH 1/3] gui: added burstmode (#159) Added burst mode in the GUI. Visible only for detectors that supports it. --- slsDetectorGui/forms/form_tab_measurement.ui | 76 +++++++++++++++----- slsDetectorGui/include/qTabMeasurement.h | 2 + slsDetectorGui/src/qTabMeasurement.cpp | 65 +++++++++++++---- 3 files changed, 113 insertions(+), 30 deletions(-) diff --git a/slsDetectorGui/forms/form_tab_measurement.ui b/slsDetectorGui/forms/form_tab_measurement.ui index ba9da5c72..5a9766232 100755 --- a/slsDetectorGui/forms/form_tab_measurement.ui +++ b/slsDetectorGui/forms/form_tab_measurement.ui @@ -432,7 +432,7 @@ 4 - + @@ -503,7 +503,7 @@ - + false @@ -572,7 +572,7 @@ Frame period between exposures. - + @@ -616,7 +616,7 @@ Frame period between exposures. - + @@ -674,7 +674,7 @@ Frame period between exposures. - + true @@ -718,7 +718,7 @@ Exposure Time of a frame. - + false @@ -735,7 +735,7 @@ Frame period between exposures. - + false @@ -745,7 +745,7 @@ Frame period between exposures. - + true @@ -762,7 +762,7 @@ Exposure Time of a frame. - + false @@ -809,7 +809,7 @@ Exposure Time of a frame. - + true @@ -871,7 +871,7 @@ Exposure Time of a frame. - + false @@ -931,7 +931,7 @@ Frame period between exposures. - + @@ -1070,7 +1070,7 @@ Frame period between exposures. - + @@ -1141,7 +1141,7 @@ Frame period between exposures. - + @@ -1268,7 +1268,7 @@ Frame period between exposures. - + @@ -1431,7 +1431,7 @@ Frame period between exposures. - + @@ -1502,7 +1502,7 @@ Frame period between exposures. - + @@ -1639,6 +1639,48 @@ Frame period between exposures. + + + + Burst Mode: + + + + + + + + 0 + 0 + + + + + 0 + 25 + + + + Timing Mode of the detector. + #timing# + + + + Off + + + + + Burst Internal + + + + + Burst external + + + + diff --git a/slsDetectorGui/include/qTabMeasurement.h b/slsDetectorGui/include/qTabMeasurement.h index 091936ecc..3d8e5b844 100644 --- a/slsDetectorGui/include/qTabMeasurement.h +++ b/slsDetectorGui/include/qTabMeasurement.h @@ -20,6 +20,7 @@ class qTabMeasurement : public QWidget, private Ui::TabMeasurementObject { private slots: void SetTimingMode(int val); + void SetBurstMode(int val); void SetNumMeasurements(int val); void SetNumFrames(int val); void SetNumTriggers(int val); @@ -52,6 +53,7 @@ class qTabMeasurement : public QWidget, private Ui::TabMeasurementObject { void EnableWidgetsforTimingMode(); void GetTimingMode(); + void GetBurstMode(); void GetNumFrames(); void GetNumTriggers(); void GetNumBursts(); diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp index 06d283f15..a9c7fc92e 100644 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ b/slsDetectorGui/src/qTabMeasurement.cpp @@ -46,6 +46,8 @@ void qTabMeasurement::SetupWidgetWindow() { ShowGates(); // enabling according to det type + lblBurstMode->hide(); + comboBurstMode->hide(); switch (det->getDetectorType().squash()) { case slsDetectorDefs::MOENCH: lblNumSamples->setEnabled(true); @@ -64,6 +66,8 @@ void qTabMeasurement::SetupWidgetWindow() { startingFnumImplemented = true; break; case slsDetectorDefs::GOTTHARD2: + lblBurstMode->show(); + comboBurstMode->show(); lblNumBursts->setEnabled(true); spinNumBursts->setEnabled(true); lblBurstPeriod->setEnabled(true); @@ -89,6 +93,10 @@ void qTabMeasurement::SetupWidgetWindow() { void qTabMeasurement::Initialization() { connect(comboTimingMode, SIGNAL(currentIndexChanged(int)), this, SLOT(SetTimingMode(int))); + if (comboBurstMode->isVisible()) { + connect(comboBurstMode, SIGNAL(currentIndexChanged(int)), this, + SLOT(SetBurstMode(int))); + } connect(spinNumMeasurements, SIGNAL(valueChanged(int)), this, SLOT(SetNumMeasurements(int))); connect(spinNumFrames, SIGNAL(valueChanged(int)), this, @@ -144,18 +152,11 @@ void qTabMeasurement::Initialization() { void qTabMeasurement::ShowTriggerDelay() { bool showTrigger = true; if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) { - try { - LOG(logDEBUG) << "Getting burst mode"; - auto retval = det->getBurstMode().tsquash( - "Inconsistent burst mode for all detectors."); - // burst mode and auto timing mode - if (retval != slsDetectorDefs::BURST_OFF && - comboTimingMode->currentIndex() == AUTO) { - showTrigger = false; - } + if ((comboBurstMode->currentIndex() != slsDetectorDefs::BURST_OFF) && + (comboTimingMode->currentIndex() == AUTO)) { + // show burst, burstperiod, not trigger or delay + showTrigger = false; } - CATCH_DISPLAY("Could not get burst mode.", - "qTabMeasurement::ShowTriggerDelay") } if (showTrigger) { @@ -248,7 +249,7 @@ void qTabMeasurement::EnableWidgetsforTimingMode() { spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) { - ShowTriggerDelay(); + GetBurstMode(); // also decides to show trigger or burst mode } break; case TRIGGER: @@ -272,7 +273,7 @@ void qTabMeasurement::EnableWidgetsforTimingMode() { spinDelay->setEnabled(true); comboDelayUnit->setEnabled(true); if (det->getDetectorType().squash() == slsDetectorDefs::GOTTHARD2) { - ShowTriggerDelay(); + GetBurstMode(); // also decides to show trigger or burst mode } } break; @@ -359,6 +360,41 @@ void qTabMeasurement::SetTimingMode(int val) { this, &qTabMeasurement::GetTimingMode) } +void qTabMeasurement::GetBurstMode() { + LOG(logDEBUG) << "Getting burst mode"; + disconnect(comboBurstMode, SIGNAL(currentIndexChanged(int)), this, + SLOT(SetBurstMode(int))); + try { + auto retval = det->getBurstMode().tsquash( + "Inconsistent burst mode for all detectors."); + switch (retval) { + case slsDetectorDefs::BURST_OFF: + case slsDetectorDefs::BURST_INTERNAL: + case slsDetectorDefs::BURST_EXTERNAL: + comboBurstMode->setCurrentIndex((int)retval); + ShowTriggerDelay(); + break; + default: + throw sls::RuntimeError(std::string("Unknown burst mode: ") + + std::to_string(retval)); + } + } + CATCH_DISPLAY("Could not get burst mode.", "qTabMeasurement::GetBurstMode") + connect(comboBurstMode, SIGNAL(currentIndexChanged(int)), this, + SLOT(SetBurstMode(int))); +} + +void qTabMeasurement::SetBurstMode(int val) { + LOG(logINFO) << "Setting burst mode:" + << comboBurstMode->currentText().toAscii().data(); + try { + det->setBurstMode(static_cast(val)); + ShowTriggerDelay(); + } + CATCH_HANDLE("Could not set burst mode.", "qTabMeasurement::SetBurstMode", + this, &qTabMeasurement::GetBurstMode) +} + void qTabMeasurement::SetNumMeasurements(int val) { LOG(logINFO) << "Setting Number of Measurements to " << val; numMeasurements = val; @@ -913,6 +949,9 @@ void qTabMeasurement::Refresh() { if (!plot->GetIsRunning()) { GetTimingMode(); + if (comboBurstMode->isVisible()) { + GetBurstMode(); + } GetNumFrames(); GetExposureTime(); GetAcquisitionPeriod(); From 6b7dee263123ffc8c0af98a080aed143eb625780 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 3 Sep 2020 11:49:08 +0200 Subject: [PATCH 2/3] added versions and parallel to python --- python/slsdet/detector.py | 42 +++++++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index e258e6f4c..a09b12937 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -139,27 +139,23 @@ class Detector(CppDetectorApi): raise ValueError("hostname needs to be string or list of strings") @property - def fw_version(self): + def firmwareversion(self): return element_if_equal(self.getFirmwareVersion()) @property - def server_version(self): + def detectorserverversion(self): # TODO! handle hex print return element_if_equal(self.getDetectorServerVersion()) @property - def client_version(self): - return element_if_equal(self.getClientVersion()) + def clientversion(self): + return self.getClientVersion() @property def rx_version(self): """Receiver version in format [0xYYMMDD].""" return element_if_equal(self.getReceiverVersion()) - @property - def detector_type(self): - return element_if_equal(self.getDetectorType()) - @property def dr(self): """ @@ -1022,6 +1018,22 @@ class Detector(CppDetectorApi): def led(self, value): self.setLEDEnable(value) + + @property + def versions(self): + return {'type': self.type, + 'package': self.packageversion, + 'client': self.clientversion, + 'firmware': self.firmwareversion, + 'detectorserver': self.detectorserverversion, + 'receiver': self.rx_version} + + + @property + def packageversion(self): + return self.getPackageVersion() + + @property def ratecorr(self): """ @@ -1172,6 +1184,19 @@ class Detector(CppDetectorApi): def subdeadtime(self, t): self.setSubDeadTime(t) + + @property + @element + def parallel(self): + """ + [Eiger] Enable or disable the parallel readout mode of Eiger. + """ + return self.getParallelMode() + + @parallel.setter + def parallel(self, value): + self.setParallelMode(value) + @property def partialreset(self): """[Eiger] Sets up detector to do partial or complete reset at start of acquisition. 0 complete reset, 1 partial reset. Default is complete reset. @@ -1392,6 +1417,7 @@ class Detector(CppDetectorApi): def veto(self, value): self.setVeto(value) + """ Mythen3 specific """ From 22f14cacb040424158c16b0d8daf4cc6da6d29e3 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 3 Sep 2020 15:33:12 +0200 Subject: [PATCH 3/3] virtual and vetofile --- python/scripts/cmd_python.py | 16 ++++++++++++ python/slsdet/detector.py | 48 +++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/python/scripts/cmd_python.py b/python/scripts/cmd_python.py index a398732c7..7c01a82d0 100644 --- a/python/scripts/cmd_python.py +++ b/python/scripts/cmd_python.py @@ -19,6 +19,22 @@ pycmd += ['vrf', 'vtr', 'vrs', 'vtgstv', 'vsvn', 'vtrim', 'vin_com', 'vin_cm', 'vrshaper', 'vrshaper_n', 'vrpreamp', 'vishaper', 'vicin', 'vcassh', 'vcal_n', 'vcal_p'] +# command : reason +intentionally_missing = [ + 'temp_10ge', #temperatures already available from enum or specialized class + 'temp_adc', + 'temp_dcdc', + 'temp_fpga', + 'temp_fpgaext', + 'temp_fpgafl', + 'temp_fpgafr', + 'temp_slowadc', + 'temp_sodl', + 'temp_sodr', + 'trigger', #use sendSoftwareTrigger +] + +pycmd += intentionally_missing missing = [] for c in cmd: if c not in pycmd: diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index a09b12937..163916e6d 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1028,12 +1028,31 @@ class Detector(CppDetectorApi): 'detectorserver': self.detectorserverversion, 'receiver': self.rx_version} + @property + def virtual(self): + """ + Setup with n virtual servers running on localhost + starting with port p + + Examples + --------- + + >>> d.virtual = n, p + + """ + raise NotImplementedError('Virtual is set only') + + @virtual.setter + def virtual(self, args): + n_detectors, starting_port = args + self.setVirtualDetectorServers(n_detectors, starting_port) + + @property def packageversion(self): return self.getPackageVersion() - @property def ratecorr(self): """ @@ -1418,6 +1437,33 @@ class Detector(CppDetectorApi): self.setVeto(value) + @property + def vetofile(self): + """ + [Gotthard2] Set veto reference for each 128 channels for specific chip. + The file should have 128 rows of gain index and 12 bit value in dec + + Examples + --------- + + d.vetofile = '/path/to/file.txt' #set for all chips + d.vetofile = 3, '/path/to/file.txt' # set for chip 3 + + """ + raise NotImplementedError('vetofile is set only') + + @vetofile.setter + def vetofile(self, args): + if isinstance(args, str): + chip_index = -1 + fname = args + elif isinstance(args, (tuple, list)): + chip_index, fname = args + else: + raise ValueError("unknow argument to vetofile") + + self.setVetoFile(chip_index, fname) + """ Mythen3 specific """