even more

This commit is contained in:
Erik Frojdh 2018-05-25 16:32:40 +02:00
parent 4b72d685f3
commit 4f600f3129
2 changed files with 31 additions and 195 deletions

View File

@ -991,45 +991,8 @@ slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchr
int multiSlsDetector::setOnline(int off) int multiSlsDetector::setOnline(int off)
{ {
if (off != GET_ONLINE_FLAG)
if (off != GET_ONLINE_FLAG) { thisMultiDetector->onlineFlag = parallelCallDetectorMember(&slsDetector::setOnline, off);
thisMultiDetector->onlineFlag = off;
int ret = -100;
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::setOnline,
detectors[idet], off, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
thisMultiDetector->onlineFlag = ret;
}
return thisMultiDetector->onlineFlag; return thisMultiDetector->onlineFlag;
}; };
@ -1057,7 +1020,6 @@ int multiSlsDetector::exists()
} }
// Initialization functions // Initialization functions
int multiSlsDetector::getThresholdEnergy(int pos) int multiSlsDetector::getThresholdEnergy(int pos)
{ {
@ -1244,16 +1206,12 @@ int multiSlsDetector::getChanRegs(double* retval, bool fromDetector)
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) { if (detectors[idet]) {
// cout << "det " << idet << endl;
nChansDet = detectors[idet]->getChanRegs(retval1, fromDetector); nChansDet = detectors[idet]->getChanRegs(retval1, fromDetector);
// cout << "returned" << endl;
if (detectors[idet]->getErrorMask()) if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet)); setErrorMask(getErrorMask() | (1 << idet));
// cout << "memcopy "<< currentNumChans << " " << nChansDet << "(" << n << ")" << endl;
memcpy(retval + (currentNumChans), retval1, nChansDet * sizeof(double)); memcpy(retval + (currentNumChans), retval1, nChansDet * sizeof(double));
currentNumChans += nChansDet; currentNumChans += nChansDet;
// cout << "Done" << endl;
} }
} }
return n; return n;
@ -1899,40 +1857,7 @@ int64_t multiSlsDetector::getTimeLeft(timerIndex index)
int multiSlsDetector::setStoragecellStart(int pos) int multiSlsDetector::setStoragecellStart(int pos)
{ {
int ret = -100; parallelCallDetectorMember(&slsDetector::setStoragecellStart, pos);
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::setStoragecellStart,
detectors[idet], pos, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
return ret;
} }
int multiSlsDetector::setSpeed(speedVariable index, int value) int multiSlsDetector::setSpeed(speedVariable index, int value)
@ -2384,21 +2309,6 @@ double* multiSlsDetector::decodeData(int* datain, int& nn, double* fdata)
} }
//Correction //Correction
/*
enum correctionFlags {
DISCARD_BAD_CHANNELS,
AVERAGE_NEIGHBOURS_FOR_BAD_CHANNELS,
FLAT_FIELD_CORRECTION,
RATE_CORRECTION,
ANGULAR_CONVERSION
}
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
int multiSlsDetector::setFlatFieldCorrection(string fname) int multiSlsDetector::setFlatFieldCorrection(string fname)
{ {
double* data = new double[thisMultiDetector->numberOfChannels]; // xmed[thisMultiDetector->numberOfChannels]; double* data = new double[thisMultiDetector->numberOfChannels]; // xmed[thisMultiDetector->numberOfChannels];
@ -2544,10 +2454,6 @@ int multiSlsDetector::getNMods()
nm += detectors[idet]->getNMods(); nm += detectors[idet]->getNMods();
} }
} }
#ifdef VERBOSE
cout << "total number of modules is " << nm << endl;
#endif
return nm; return nm;
} }
@ -2559,19 +2465,12 @@ int multiSlsDetector::getNMod(dimension d)
nm += detectors[idet]->getNMod(d); nm += detectors[idet]->getNMod(d);
} }
} }
#ifdef VERBOSE
cout << "total number of modules in dimension " << d << " is " << nm << endl;
#endif
return nm; return nm;
} }
int multiSlsDetector::getChansPerMod(int imod) int multiSlsDetector::getChansPerMod(int imod)
{ {
int id = -1, im = -1; int id = -1, im = -1;
#ifdef VERBOSE
cout << "get chans per mod " << imod << endl;
#endif
decodeNMod(imod, id, im); decodeNMod(imod, id, im);
if (id >= 0) { if (id >= 0) {
if (detectors[id]) { if (detectors[id]) {
@ -2708,7 +2607,6 @@ int multiSlsDetector::setRateCorrection(double t)
int multiSlsDetector::getRateCorrection(double& t) int multiSlsDetector::getRateCorrection(double& t)
{ {
if (getDetectorsType() == EIGER) { if (getDetectorsType() == EIGER) {
t = getRateCorrectionTau(); t = getRateCorrectionTau();
return t; return t;
@ -2797,7 +2695,6 @@ int multiSlsDetector::getRateCorrection()
int multiSlsDetector::rateCorrect(double* datain, double* errin, double* dataout, double* errout) int multiSlsDetector::rateCorrect(double* datain, double* errin, double* dataout, double* errout)
{ {
int ichdet = 0; int ichdet = 0;
double* perr = errin; double* perr = errin;
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
@ -3408,6 +3305,22 @@ int multiSlsDetector::exitServer()
return ival; return ival;
} }
int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)())
{
int ret = -100, ret1;
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet)
if (detectors[idet]) {
ret1 = (detectors[idet]->*somefunc)();
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
if (ret == -100)
ret = ret1;
else if (ret != ret1)
ret = -1;
}
return ret;
}
int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value) int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value)
{ {
int ret = -100, ret1; int ret = -100, ret1;
@ -3455,7 +3368,6 @@ string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)())
int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value) int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value)
{ {
int ret = -100; int ret = -100;
if (!threadpool) { if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl; cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
@ -3482,14 +3394,12 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in
} }
} }
} }
return ret; return ret;
} }
int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)())
{ {
int ret = -100; int ret = -100;
if (!threadpool) { if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl; cout << "Error in creating threadpool. Exiting" << endl;
return -1; return -1;
@ -3516,7 +3426,6 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)())
} }
} }
} }
return ret; return ret;
} }
@ -3795,7 +3704,6 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic
ret = GET_EXTERNAL_COMMUNICATION_MODE; ret = GET_EXTERNAL_COMMUNICATION_MODE;
} }
} }
setMaster(); setMaster();
setSynchronization(); setSynchronization();
return ret; return ret;
@ -3803,7 +3711,6 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic
slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(externalSignalFlag pol, int signalindex) slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(externalSignalFlag pol, int signalindex)
{ {
externalSignalFlag ret, ret1; externalSignalFlag ret, ret1;
if (detectors[0]) if (detectors[0])
@ -3820,7 +3727,6 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext
ret = GET_EXTERNAL_SIGNAL_FLAG; ret = GET_EXTERNAL_SIGNAL_FLAG;
} }
} }
setMaster(); setMaster();
setSynchronization(); setSynchronization();
return ret; return ret;
@ -3833,19 +3739,7 @@ string multiSlsDetector::getSettingsFile()
int multiSlsDetector::configureMAC() int multiSlsDetector::configureMAC()
{ {
int ret = -100, ret1; return callDetectorMemeber(&slsDetector::configureMAC);
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
ret1 = detectors[idet]->configureMAC();
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
if (ret == -100)
ret = ret1;
else if (ret != ret1)
ret = -1;
}
}
return ret;
} }
int multiSlsDetector::loadImageToDetector(imageType index, string const fname) int multiSlsDetector::loadImageToDetector(imageType index, string const fname)
@ -3889,7 +3783,6 @@ int multiSlsDetector::loadImageToDetector(imageType index, string const fname)
int multiSlsDetector::writeCounterBlockFile(string const fname, int startACQ) int multiSlsDetector::writeCounterBlockFile(string const fname, int startACQ)
{ {
int ret = OK, ret1 = OK; int ret = OK, ret1 = OK;
short int arg[thisMultiDetector->numberOfChannels]; short int arg[thisMultiDetector->numberOfChannels];
ofstream outfile; ofstream outfile;
@ -3994,22 +3887,11 @@ int multiSlsDetector::setDynamicRange(int p)
int multiSlsDetector::getMaxMods() int multiSlsDetector::getMaxMods()
{ {
int ret = 0;
int ret = 0, ret1;
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) { if (detectors[idet])
ret1 = detectors[idet]->getMaxMods(); ret += detectors[idet]->getMaxMods();
#ifdef VERBOSE
cout << "detector " << idet << " maxmods " << ret1 << endl;
#endif
ret += ret1;
}
} }
#ifdef VERBOSE
cout << "max mods is " << ret << endl;
#endif
return ret; return ret;
} }
@ -4062,7 +3944,6 @@ int multiSlsDetector::getMaxMod(dimension d)
int multiSlsDetector::getMaxNumberOfModules(dimension d) int multiSlsDetector::getMaxNumberOfModules(dimension d)
{ {
int ret = 0, ret1; int ret = 0, ret1;
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
@ -4145,21 +4026,11 @@ int multiSlsDetector::setFlippedData(dimension d, int value)
int multiSlsDetector::enableGapPixels(int val) int multiSlsDetector::enableGapPixels(int val)
{ {
if (val > 0 && getDetectorsType() != EIGER) { if (val > 0 && getDetectorsType() != EIGER) {
std::cout << "Not implemented for this detector" << std::endl; std::cout << "Not implemented for this detector" << std::endl;
val = -1; val = -1;
} }
int ret = callDetectorMemeber(&slsDetector::enableGapPixels, val);
int ret = -100, ret1;
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet)
if (detectors[idet]) {
ret1 = detectors[idet]->enableGapPixels(val);
if (ret == -100)
ret = ret1;
else if (ret != ret1)
ret = -1;
}
if (val != -1) { if (val != -1) {
// update data bytes incl gap pixels // update data bytes incl gap pixels
@ -4168,11 +4039,9 @@ int multiSlsDetector::enableGapPixels(int val)
if (detectors[i]) if (detectors[i])
thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels(); thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels();
} }
// update offsets and number of channels incl gap pixels in multi level // update offsets and number of channels incl gap pixels in multi level
updateOffsets(); updateOffsets();
} }
return ret; return ret;
} }
@ -4696,12 +4565,11 @@ uint32_t multiSlsDetector::clearBit(uint32_t addr, int n)
int multiSlsDetector::printReceiverConfiguration() int multiSlsDetector::printReceiverConfiguration()
{ {
int i;
int ret, ret1 = -100; int ret, ret1 = -100;
std::cout << "Printing Receiver configurations for all detectors..." << std::endl; std::cout << "Printing Receiver configurations for all detectors..." << std::endl;
for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) {
if (detectors[i]) { if (detectors[i]) {
std::cout << std::endl std::cout << std::endl
<< "#Detector " << i << ":" << std::endl; << "#Detector " << i << ":" << std::endl;
@ -5092,41 +4960,8 @@ int multiSlsDetector::readDataFile(string fname, int* data)
int multiSlsDetector::setReceiverOnline(int off) int multiSlsDetector::setReceiverOnline(int off)
{ {
if (off != GET_ONLINE_FLAG) { if (off != GET_ONLINE_FLAG) {
int ret = -100; thisMultiDetector->receiverOnlineFlag = parallelCallDetectorMember(&slsDetector::setReceiverOnline, off);
if (!threadpool) {
cout << "Error in creating threadpool. Exiting" << endl;
return -1;
} else {
//return storage values
int* iret[thisMultiDetector->numberOfDetectors];
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
iret[idet] = new int(-1);
Task* task = new Task(new func1_t<int, int>(&slsDetector::setReceiverOnline,
detectors[idet], off, iret[idet]));
threadpool->add_task(task);
}
}
threadpool->startExecuting();
threadpool->wait_for_tasks_to_complete();
for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) {
if (detectors[idet]) {
if (iret[idet] != NULL) {
if (ret == -100)
ret = *iret[idet];
else if (ret != *iret[idet])
ret = -1;
delete iret[idet];
} else
ret = -1;
if (detectors[idet]->getErrorMask())
setErrorMask(getErrorMask() | (1 << idet));
}
}
}
thisMultiDetector->receiverOnlineFlag = ret;
} }
return thisMultiDetector->receiverOnlineFlag; return thisMultiDetector->receiverOnlineFlag;
} }
@ -5226,7 +5061,7 @@ string multiSlsDetector::setFileName(string s)
int multiSlsDetector::setReceiverFramesPerFile(int f) int multiSlsDetector::setReceiverFramesPerFile(int f)
{ {
return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f);
} }
slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f)
@ -5249,7 +5084,7 @@ slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f)
int multiSlsDetector::setFileIndex(int i) int multiSlsDetector::setFileIndex(int i)
{ {
return parallelCallDetectorMember(&slsDetector::setFileIndex, i); return parallelCallDetectorMember(&slsDetector::setFileIndex, i);
} }
int multiSlsDetector::startReceiver() int multiSlsDetector::startReceiver()
@ -5521,7 +5356,7 @@ int multiSlsDetector::getReceiverCurrentFrameIndex()
int multiSlsDetector::resetFramesCaught() int multiSlsDetector::resetFramesCaught()
{ {
return parallelCallDetectorMember(&slsDetector::resetFramesCaught); return parallelCallDetectorMember(&slsDetector::resetFramesCaught);
} }
int multiSlsDetector::createReceivingDataSockets(const bool destroy) int multiSlsDetector::createReceivingDataSockets(const bool destroy)
@ -6044,7 +5879,7 @@ int multiSlsDetector::enableDataStreamingToClient(int enable)
int multiSlsDetector::enableDataStreamingFromReceiver(int enable) int multiSlsDetector::enableDataStreamingFromReceiver(int enable)
{ {
if (enable >= 0) { if (enable >= 0) {
thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable); thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable);
} }
return thisMultiDetector->receiver_upstream; return thisMultiDetector->receiver_upstream;
} }

View File

@ -1046,6 +1046,7 @@ class multiSlsDetector : public slsDetectorUtils {
std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); std::string callDetectorMemeber(std::string(slsDetector::*somefunc)());
int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value);
int callDetectorMemeber(int (slsDetector::*somefunc)());
int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated
int parallelCallDetectorMember(int (slsDetector::*somefunc)()); int parallelCallDetectorMember(int (slsDetector::*somefunc)());