Compare commits

...

3 Commits

Author SHA1 Message Date
cd4520b051 not validating settings for dacs temporarily (#447) 2022-05-10 15:30:34 +02:00
0129c2c686 M3: master starts twice (non blocking) part 2 (#445)
* slaves and master vectors empty means all positions included: fixing double acquisition in masters

* debug print out
2022-05-10 15:23:39 +02:00
f55bdd6eae M3: master starts twice (non blocking) (#444)
* start acq for master m3 was sent twice (non blocking), removed redundant code, check that there is only one master

* m3 can have more than 1 master (when many master modules used independently)

* fix for singe mod m3 or other dets
2022-05-10 14:27:40 +02:00
6 changed files with 47 additions and 38 deletions

View File

@ -1411,6 +1411,9 @@ enum detectorSettings setSettings(enum detectorSettings sett) {
} }
void validateSettings() { void validateSettings() {
LOG(logWARNING, ("Not validating dac settings temporarily"));
return;
// if any special dac value is changed individually => undefined // if any special dac value is changed individually => undefined
const int specialDacs[NSPECIALDACS] = SPECIALDACINDEX; const int specialDacs[NSPECIALDACS] = SPECIALDACINDEX;
int *specialDacValues[] = {defaultDacValue_standard, defaultDacValue_fast, int *specialDacValues[] = {defaultDacValue_standard, defaultDacValue_fast,

View File

@ -781,24 +781,7 @@ void Detector::startReceiver() { pimpl->Parallel(&Module::startReceiver, {}); }
void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); } void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
void Detector::startDetector(Positions pos) { void Detector::startDetector(Positions pos) {
auto detector_type = getDetectorType(pos).squash(); pimpl->startAcquisition(false, pos);
if (detector_type == defs::MYTHEN3 && size() > 1) {
std::vector<int> slaves(pos);
auto is_master = getMaster(pos);
int masterPosition = -1;
for (unsigned int i = 0; i < is_master.size(); ++i) {
if (is_master[i]) {
masterPosition = i;
slaves.erase(slaves.begin() + i);
}
}
pimpl->Parallel(&Module::startAcquisition, pos);
if (masterPosition != -1) {
pimpl->Parallel(&Module::startAcquisition, {masterPosition});
}
} else {
pimpl->Parallel(&Module::startAcquisition, pos);
}
} }
void Detector::startDetectorReadout() { void Detector::startDetectorReadout() {

View File

@ -1124,25 +1124,7 @@ int DetectorImpl::acquire() {
// start and read all // start and read all
try { try {
if (detector_type == defs::MYTHEN3 && modules.size() > 1) { startAcquisition(true, {});
// Multi module mythen
std::vector<int> master;
std::vector<int> slaves;
auto is_master = Parallel(&Module::isMaster, {});
slaves.reserve(modules.size() - 1); // check this one!!
for (size_t i = 0; i < modules.size(); ++i) {
if (is_master[i])
master.push_back(i);
else
slaves.push_back(i);
}
Parallel(&Module::startAcquisition, slaves);
Parallel(&Module::startAndReadAll, master);
} else {
// Normal acquire
Parallel(&Module::startAndReadAll, {});
}
} catch (...) { } catch (...) {
if (receiver) if (receiver)
Parallel(&Module::stopReceiver, {}); Parallel(&Module::stopReceiver, {});
@ -1191,6 +1173,44 @@ int DetectorImpl::acquire() {
return OK; return OK;
} }
void DetectorImpl::startAcquisition(bool blocking, std::vector<int> positions) {
if (shm()->detType == defs::MYTHEN3 && size() > 1) {
std::vector<int> master;
std::vector<int> slaves;
if (positions.empty() ||
(positions.size() == 1 && positions[0] == -1)) {
positions.resize(modules.size());
std::iota(begin(positions), end(positions), 0);
}
// could be all slaves in positions
slaves.reserve(positions.size());
auto is_master = Parallel(&Module::isMaster, positions);
for (size_t i : positions) {
if (is_master[i])
master.push_back(i);
else
slaves.push_back(i);
}
if (!slaves.empty()) {
Parallel(&Module::startAcquisition, slaves);
}
if (!master.empty()) {
if (blocking) {
Parallel(&Module::startAndReadAll, master);
} else {
Parallel(&Module::startAcquisition, master);
}
}
} else {
if (blocking) {
Parallel(&Module::startAndReadAll, positions);
} else {
Parallel(&Module::startAcquisition, positions);
}
}
}
void DetectorImpl::printProgress(double progress) { void DetectorImpl::printProgress(double progress) {
// spaces for python printout // spaces for python printout
std::cout << " " << std::fixed << std::setprecision(2) << std::setw(6) std::cout << " " << std::fixed << std::setprecision(2) << std::setw(6)

View File

@ -278,6 +278,9 @@ class DetectorImpl : public virtual slsDetectorDefs {
*/ */
int acquire(); int acquire();
/** also takes care of master and slave for multi module mythen */
void startAcquisition(bool blocking, std::vector<int> positions);
/** /**
* Combines data from all readouts and gives it to the gui * Combines data from all readouts and gives it to the gui
* or just gives progress of acquisition by polling receivers * or just gives progress of acquisition by polling receivers

View File

@ -10,6 +10,6 @@
#define APIGOTTHARD 0x220428 #define APIGOTTHARD 0x220428
#define APIGOTTHARD2 0x220428 #define APIGOTTHARD2 0x220428
#define APIJUNGFRAU 0x220428 #define APIJUNGFRAU 0x220428
#define APIMYTHEN3 0x220428
#define APIMOENCH 0x220427 #define APIMOENCH 0x220427
#define APIEIGER 0x220428 #define APIEIGER 0x220428
#define APIMYTHEN3 0x220510