mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-11 04:17:15 +02:00
2. Dev/add jf pedestal feature (#807)
This commit is contained in:
@ -1359,6 +1359,20 @@ class Detector {
|
||||
*/
|
||||
void setNumberOfFilterCells(int cell, Positions pos = {});
|
||||
|
||||
/** [Jungfrau] */
|
||||
Result<defs::pedestalParameters> getPedestalMode(Positions pos = {}) const;
|
||||
|
||||
/** [Jungfrau] In pedestal mode, the number of frames or triggers is
|
||||
* overwritten by \n(#pedestal_frames x #pedestal_loops x 2). \nIn
|
||||
* auto timing mode or in trigger mode with #frames > 1, #frames is
|
||||
* overwritten and #triggers = 1, \nelse #triggers is overwritten and
|
||||
* #frames = 1. One cannot set #frames, #triggers or timing mode in pedestal
|
||||
* mode (it will throw an exception). Disabling pedestal mode will set back
|
||||
* the original values of #frames and #triggers
|
||||
*/
|
||||
void setPedestalMode(const defs::pedestalParameters par,
|
||||
Positions pos = {});
|
||||
|
||||
///@}
|
||||
|
||||
/** @name Gotthard Specific */
|
||||
|
@ -2105,6 +2105,55 @@ std::string CmdProxy::TemperatureEvent(int action) {
|
||||
return os.str();
|
||||
}
|
||||
|
||||
std::string CmdProxy::PedestalMode(int action) {
|
||||
std::ostringstream os;
|
||||
os << cmd << ' ';
|
||||
if (action == defs::HELP_ACTION) {
|
||||
os << " [frames<uint8_t>] [loops<uint16_t>]\n\t\t[Jungfrau] "
|
||||
"Enable pedestal mode. \n\t\tThe number of frames or triggers is "
|
||||
"overwritten by: \n\t\t(#pedestal_frames x #pedestal_loops x 2). "
|
||||
"\n\t\tIn auto timing mode or in trigger mode with #frames > 1, "
|
||||
"\n\t\t#frames is overwritten and #triggers = 1, \n\t\telse "
|
||||
"#triggers is overwritten and #frames = 1. \n\t\tOne cannot set "
|
||||
"#frames, #triggers or timing mode in pedestal mode (exception "
|
||||
"thrown).\n\n";
|
||||
os << cmd
|
||||
<< " [0]\n\t\t[Jungfrau] Disable pedestal "
|
||||
"mode.\n\t\tDisabling pedestal mode will set back the normal "
|
||||
"mode values of #frames and #triggers."
|
||||
<< '\n';
|
||||
} else if (action == defs::GET_ACTION) {
|
||||
if (args.size() != 0) {
|
||||
WrongNumberOfParameters(0);
|
||||
}
|
||||
auto t = det->getPedestalMode(std::vector<int>{det_id});
|
||||
os << OutString(t) << '\n';
|
||||
} else if (action == defs::PUT_ACTION) {
|
||||
// disable
|
||||
if (args.size() == 1) {
|
||||
if (args[0] != "0") {
|
||||
throw RuntimeError(
|
||||
"Unknown argument " + args[0] +
|
||||
". Did you mean '0' to disable pedestal mode?");
|
||||
}
|
||||
det->setPedestalMode(defs::pedestalParameters());
|
||||
}
|
||||
// enable
|
||||
else if (args.size() == 2) {
|
||||
uint8_t frames = StringTo<uint8_t>(args[0]);
|
||||
uint16_t loops = StringTo<uint16_t>(args[1]);
|
||||
det->setPedestalMode(defs::pedestalParameters(frames, loops));
|
||||
} else {
|
||||
throw RuntimeError(
|
||||
"Invalid number of parareters for this command.");
|
||||
}
|
||||
os << ToString(args) << '\n';
|
||||
} else {
|
||||
throw RuntimeError("Unknown action");
|
||||
}
|
||||
return os.str();
|
||||
}
|
||||
|
||||
/* Gotthard Specific */
|
||||
|
||||
std::string CmdProxy::ROI(int action) {
|
||||
|
@ -1187,6 +1187,7 @@ class CmdProxy {
|
||||
{"storagecell_delay", &CmdProxy::storagecell_delay},
|
||||
{"gainmode", &CmdProxy::gainmode},
|
||||
{"filtercells", &CmdProxy::filtercells},
|
||||
{"pedestalmode", &CmdProxy::PedestalMode},
|
||||
|
||||
/* Gotthard Specific */
|
||||
{"roi", &CmdProxy::ROI},
|
||||
@ -1399,6 +1400,7 @@ class CmdProxy {
|
||||
std::string DataStream(int action);
|
||||
/* Jungfrau Specific */
|
||||
std::string TemperatureEvent(int action);
|
||||
std::string PedestalMode(int action);
|
||||
/* Gotthard Specific */
|
||||
std::string ROI(int action);
|
||||
/* Gotthard2 Specific */
|
||||
|
@ -1760,6 +1760,16 @@ void Detector::setNumberOfFilterCells(int cell, Positions pos) {
|
||||
pimpl->Parallel(&Module::setNumberOfFilterCells, pos, cell);
|
||||
}
|
||||
|
||||
Result<defs::pedestalParameters>
|
||||
Detector::getPedestalMode(Positions pos) const {
|
||||
return pimpl->Parallel(&Module::getPedestalMode, pos);
|
||||
}
|
||||
|
||||
void Detector::setPedestalMode(const defs::pedestalParameters par,
|
||||
Positions pos) {
|
||||
pimpl->Parallel(&Module::setPedestalMode, pos, par);
|
||||
}
|
||||
|
||||
// Gotthard Specific
|
||||
|
||||
Result<defs::ROI> Detector::getROI(Positions pos) const {
|
||||
|
@ -1940,6 +1940,20 @@ void Module::setNumberOfFilterCells(int value) {
|
||||
sendToDetector(F_SET_NUM_FILTER_CELLS, value, nullptr);
|
||||
}
|
||||
|
||||
defs::pedestalParameters Module::getPedestalMode() const {
|
||||
return sendToDetector<defs::pedestalParameters>(F_GET_PEDESTAL_MODE);
|
||||
}
|
||||
|
||||
void Module::setPedestalMode(const defs::pedestalParameters par) {
|
||||
sendToDetector(F_SET_PEDESTAL_MODE, par, nullptr);
|
||||
if (shm()->useReceiverFlag) {
|
||||
auto value = getNumberOfFrames();
|
||||
sendToReceiver(F_RECEIVER_SET_NUM_FRAMES, value, nullptr);
|
||||
value = getNumberOfTriggers();
|
||||
sendToReceiver(F_SET_RECEIVER_NUM_TRIGGERS, value, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
// Gotthard Specific
|
||||
|
||||
slsDetectorDefs::ROI Module::getROI() const {
|
||||
|
@ -419,6 +419,8 @@ class Module : public virtual slsDetectorDefs {
|
||||
void setGainMode(const gainMode mode);
|
||||
int getNumberOfFilterCells() const;
|
||||
void setNumberOfFilterCells(int value);
|
||||
defs::pedestalParameters getPedestalMode() const;
|
||||
void setPedestalMode(defs::pedestalParameters par);
|
||||
|
||||
/**************************************************
|
||||
* *
|
||||
|
@ -506,6 +506,161 @@ TEST_CASE("filtercells", "[.cmd]") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("pedestalmode", "[.cmd]") {
|
||||
Detector det;
|
||||
CmdProxy proxy(&det);
|
||||
auto det_type = det.getDetectorType().squash();
|
||||
if (det_type == defs::JUNGFRAU) {
|
||||
auto prev_val = det.getPedestalMode();
|
||||
auto prev_frames = det.getNumberOfFrames().tsquash(
|
||||
"Inconsistent number of frames to test");
|
||||
auto prev_triggers = det.getNumberOfTriggers().tsquash(
|
||||
"Inconsistent number of triggers to test");
|
||||
auto prev_timingmode =
|
||||
det.getTimingMode().tsquash("Inconsistent timing mode to test");
|
||||
|
||||
REQUIRE_NOTHROW(proxy.Call("pedestalmode", {}, 0, GET));
|
||||
REQUIRE_NOTHROW(proxy.Call("pedestalmode", {}, -1, GET));
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"0"}, -1, GET));
|
||||
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"256", "10"}, -1, PUT));
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"-1", "10"}, 0, PUT));
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"20", "65536"}, 0, PUT));
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"20", "-1"}, 0, PUT));
|
||||
|
||||
{
|
||||
std::ostringstream oss;
|
||||
proxy.Call("pedestalmode", {"30", "1000"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "pedestalmode [30, 1000]\n");
|
||||
}
|
||||
// cannot change any of these in pedestal mode
|
||||
REQUIRE_THROWS_WITH(proxy.Call("frames", {"200"}, -1, PUT),
|
||||
"Detector returned: Cannot set frames in pedestal "
|
||||
"mode. It is overwritten anyway.\n");
|
||||
REQUIRE_THROWS_WITH(proxy.Call("triggers", {"200"}, -1, PUT),
|
||||
"Detector returned: Cannot set triggers in "
|
||||
"pedestal mode. It is overwritten anyway.\n");
|
||||
REQUIRE_THROWS_WITH(
|
||||
proxy.Call("timing", {"auto"}, -1, PUT),
|
||||
"Detector returned: Cannot set timing mode in pedestal mode. "
|
||||
"Switch off pedestal mode to change timing mode.\n");
|
||||
REQUIRE_THROWS_WITH(
|
||||
proxy.Call("scan", {"vb_comp", "500", "1500", "10"}, -1, PUT),
|
||||
"Detector returned: Cannot set scan when in pedestal mode.\n");
|
||||
REQUIRE_THROWS_WITH(
|
||||
proxy.Call("scan", {"0"}, -1, PUT),
|
||||
"Detector returned: Cannot set scan when in pedestal mode.\n");
|
||||
// should not throw to get these values though
|
||||
REQUIRE_NOTHROW(proxy.Call("frames", {}, -1, GET));
|
||||
REQUIRE_NOTHROW(proxy.Call("triggers", {}, -1, GET));
|
||||
REQUIRE_NOTHROW(proxy.Call("timing", {}, -1, GET));
|
||||
REQUIRE_NOTHROW(proxy.Call("scan", {}, -1, GET));
|
||||
|
||||
{
|
||||
std::ostringstream oss;
|
||||
proxy.Call("pedestalmode", {"50", "500"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "pedestalmode [50, 500]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
proxy.Call("pedestalmode", {}, -1, GET, oss);
|
||||
REQUIRE(oss.str() == "pedestalmode [enabled, 50, 500]\n");
|
||||
}
|
||||
{
|
||||
auto pedemode = det.getPedestalMode().tsquash(
|
||||
"Inconsistent pedestal mode to test");
|
||||
REQUIRE(pedemode.enable == true);
|
||||
REQUIRE(pedemode.frames == 50);
|
||||
REQUIRE(pedemode.loops == 500);
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
proxy.Call("pedestalmode", {"0"}, -1, PUT, oss);
|
||||
REQUIRE(oss.str() == "pedestalmode [0]\n");
|
||||
}
|
||||
{
|
||||
std::ostringstream oss;
|
||||
proxy.Call("pedestalmode", {}, -1, GET, oss);
|
||||
REQUIRE(oss.str() == "pedestalmode [disabled]\n");
|
||||
}
|
||||
|
||||
uint8_t pedestalFrames = 50;
|
||||
uint16_t pedestalLoops = 1000;
|
||||
int64_t expNumFrames = pedestalFrames * pedestalLoops * 2;
|
||||
auto origFrames = det.getNumberOfFrames().squash(-1);
|
||||
auto origTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
|
||||
// auto mode
|
||||
det.setTimingMode(defs::AUTO_TIMING);
|
||||
REQUIRE_NOTHROW(proxy.Call(
|
||||
"pedestalmode",
|
||||
{std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1,
|
||||
PUT));
|
||||
auto numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
auto numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == expNumFrames);
|
||||
REQUIRE(numTriggers == 1);
|
||||
|
||||
// pedestal mode off
|
||||
REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT));
|
||||
numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == origFrames);
|
||||
REQUIRE(numTriggers == origTriggers);
|
||||
|
||||
// trigger mode (frames > 1)
|
||||
REQUIRE_NOTHROW(det.setTimingMode(defs::TRIGGER_EXPOSURE));
|
||||
origFrames = 5;
|
||||
REQUIRE_NOTHROW(det.setNumberOfFrames(origFrames));
|
||||
REQUIRE_NOTHROW(proxy.Call(
|
||||
"pedestalmode",
|
||||
{std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1,
|
||||
PUT));
|
||||
numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == expNumFrames);
|
||||
REQUIRE(numTriggers == 1);
|
||||
|
||||
// pedestal mode off
|
||||
REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT));
|
||||
numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == origFrames);
|
||||
REQUIRE(numTriggers == origTriggers);
|
||||
|
||||
// trigger mode (frames = 1)
|
||||
origFrames = 1;
|
||||
REQUIRE_NOTHROW(det.setNumberOfFrames(origFrames));
|
||||
origTriggers = 10;
|
||||
REQUIRE_NOTHROW(det.setNumberOfTriggers(origTriggers));
|
||||
REQUIRE_NOTHROW(proxy.Call(
|
||||
"pedestalmode",
|
||||
{std::to_string(pedestalFrames), std::to_string(pedestalLoops)}, -1,
|
||||
PUT));
|
||||
numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == 1);
|
||||
REQUIRE(numTriggers == expNumFrames);
|
||||
|
||||
// pedestal mode off
|
||||
REQUIRE_NOTHROW(proxy.Call("pedestalmode", {"0"}, -1, PUT));
|
||||
numTriggers = det.getNumberOfTriggers().squash(-1);
|
||||
numFrames = det.getNumberOfFrames().squash(-1);
|
||||
REQUIRE(numFrames == origFrames);
|
||||
REQUIRE(numTriggers == origTriggers);
|
||||
|
||||
det.setNumberOfFrames(prev_frames);
|
||||
det.setNumberOfTriggers(prev_triggers);
|
||||
det.setTimingMode(prev_timingmode);
|
||||
for (int i = 0; i != det.size(); ++i) {
|
||||
det.setPedestalMode(prev_val[i], {i});
|
||||
}
|
||||
} else {
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {}, -1, GET));
|
||||
REQUIRE_THROWS(proxy.Call("pedestalmode", {"0"}, -1, PUT));
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("sync", "[.cmd]") {
|
||||
Detector det;
|
||||
CmdProxy proxy(&det);
|
||||
|
Reference in New Issue
Block a user