From 301600e720b52e4e4cf7d9eec629ef01dd82b752 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 24 May 2018 17:47:12 +0200 Subject: [PATCH 01/24] chaning return type of getSettingsDir and setSettingsDir to std::string --- .../multiSlsDetector/multiSlsDetector.cpp | 53 ++++--------------- .../multiSlsDetector/multiSlsDetector.h | 4 +- slsDetectorSoftware/slsDetector/slsDetector.h | 4 +- .../slsDetector/slsDetectorCommand.cpp | 4 +- .../slsDetector/slsDetectorUtils.h | 4 +- 5 files changed, 17 insertions(+), 52 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index bea8ff9ef..120446c7d 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1044,31 +1044,6 @@ slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchr } - - - - - - - - - - - - - - - - - - - - - - - - - int multiSlsDetector::setOnline(int off) { if (off!=GET_ONLINE_FLAG) { @@ -2077,8 +2052,6 @@ int multiSlsDetector::setSpeed(speedVariable index, int value){ int i; int ret1=-100, ret; - - for (i=0; inumberOfDetectors; ++i) { if (detectors[i]) { ret=detectors[i]->setSpeed(index,value); @@ -2098,22 +2071,13 @@ int multiSlsDetector::setSpeed(speedVariable index, int value){ - - - - - - - - - int multiSlsDetector::getDataBytes(){ - int ret=0; + int n_bytes = 0; for (int ip=0; ipnumberOfDetectors; ++ip) { if (detectors[ip]) - ret+=detectors[ip]->getDataBytes(); + n_bytes += detectors[ip]->getDataBytes(); } - return ret; + return n_bytes; } @@ -3656,7 +3620,8 @@ int multiSlsDetector::exitServer() { /** returns the detector trimbit/settings directory */ -char* multiSlsDetector::getSettingsDir() { +// char* multiSlsDetector::getSettingsDir() { +string multiSlsDetector::getSettingsDir() { string s0="", s1="", s; @@ -3678,16 +3643,16 @@ char* multiSlsDetector::getSettingsDir() { } } if (s1=="bad") - strcpy(ans,s0.c_str()); + return s0; else - strcpy(ans,s1.c_str()); - return ans; + return s1; + // return ans; } /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ -char* multiSlsDetector::setSettingsDir(string s){ +string multiSlsDetector::setSettingsDir(string s){ if (s.find('+')==string::npos) { for (int idet=0; idetnumberOfDetectors; ++idet) { diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 5d08fd567..311e89bdf 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1047,9 +1047,9 @@ class multiSlsDetector : public slsDetectorUtils { /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ - char* getSettingsDir(); + std::string getSettingsDir(); /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ - char* setSettingsDir(std::string s); + std::string setSettingsDir(std::string s); /** returns the location of the calibration files \sa sharedSlsDetector diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 4264fedc8..95cd47f4a 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -483,9 +483,9 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /* I/O */ /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ - char* getSettingsDir() {return thisDetector->settingsDir;}; + std::string getSettingsDir() {return std::string(thisDetector->settingsDir);}; /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ - char* setSettingsDir(string s) {sprintf(thisDetector->settingsDir, s.c_str()); return thisDetector->settingsDir;}; + std::string setSettingsDir(string s) {sprintf(thisDetector->settingsDir, s.c_str()); return thisDetector->settingsDir;}; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index aa71dd50d..cda0752f1 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3031,9 +3031,9 @@ string slsDetectorCommand::cmdSettingsDir(int narg, char *args[], int action){ if (action==PUT_ACTION) { myDet->setSettingsDir(string(args[1])); } - if (myDet->getSettingsDir()==NULL) + if (myDet->getSettingsDir()=="") return string("undefined"); - return string(myDet->getSettingsDir()); + return myDet->getSettingsDir(); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index ba183e275..e96aeb65f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -405,10 +405,10 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { /** returns the detector trimbit/settings directory */ - virtual char* getSettingsDir()=0; + virtual std::string getSettingsDir()=0; /** sets the detector trimbit/settings directory */ - virtual char* setSettingsDir(std::string s)=0; + virtual std::string setSettingsDir(std::string s)=0; /** returns the location of the calibration files From 4eef81fbe9225a329839aebcdc3ee22ab2797890 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Thu, 24 May 2018 18:14:02 +0200 Subject: [PATCH 02/24] clean up of multiSlsDetector::getSettingsDir --- .../multiSlsDetector/multiSlsDetector.cpp | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 120446c7d..8f0c3cc33 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3620,33 +3620,33 @@ int multiSlsDetector::exitServer() { /** returns the detector trimbit/settings directory */ -// char* multiSlsDetector::getSettingsDir() { string multiSlsDetector::getSettingsDir() { - string s0="", s1="", s; + string concatenatedDir, firstDir; + bool dirNotSame = false; - //char ans[1000]; for (int idet=0; idetnumberOfDetectors; ++idet) { if (detectors[idet]) { - s=detectors[idet]->getSettingsDir(); + string thisDir = detectors[idet]->getSettingsDir(); if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1< Date: Fri, 25 May 2018 08:23:59 +0200 Subject: [PATCH 03/24] clang-format on multiDetector --- .../multiSlsDetector/multiSlsDetector.cpp | 11614 ++++++++-------- 1 file changed, 5640 insertions(+), 5974 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 8f0c3cc33..678a28e0d 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -8,1001 +8,951 @@ ID: $Id$ ********************************************************************/ - - #include "multiSlsDetector.h" -#include "slsDetector.h" -#include "multiSlsDetectorCommand.h" -#include "multiSlsDetectorClient.h" -#include "postProcessingFuncs.h" -#include "usersFunctions.h" #include "ThreadPool.h" #include "ZmqSocket.h" +#include "multiSlsDetectorClient.h" +#include "multiSlsDetectorCommand.h" +#include "postProcessingFuncs.h" +#include "slsDetector.h" +#include "usersFunctions.h" -#include -#include -#include -#include -#include +#include #include //json header in zmq stream - +#include +#include +#include +#include char ans[MAX_STR_LENGTH]; -int multiSlsDetector::freeSharedMemory() { - // Detach Memory address - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) - detectors[id]->freeSharedMemory(); - } +int multiSlsDetector::freeSharedMemory() +{ + // Detach Memory address + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) + detectors[id]->freeSharedMemory(); + } - - if (shmdt(thisMultiDetector) == -1) { - perror("shmdt failed\n"); - return FAIL; - } + if (shmdt(thisMultiDetector) == -1) { + perror("shmdt failed\n"); + return FAIL; + } #ifdef VERBOSE - printf("Shared memory %d detached\n", shmId); + printf("Shared memory %d detached\n", shmId); #endif - // remove shared memory - if (shmctl(shmId, IPC_RMID, 0) == -1) { - perror("shmctl(IPC_RMID) failed\n"); - return FAIL; - } - printf("Shared memory %d deleted\n", shmId); - return OK; - + // remove shared memory + if (shmctl(shmId, IPC_RMID, 0) == -1) { + perror("shmctl(IPC_RMID) failed\n"); + return FAIL; + } + printf("Shared memory %d deleted\n", shmId); + return OK; } +int multiSlsDetector::initSharedMemory(int id = 0) +{ + key_t mem_key = DEFAULT_SHM_KEY + MAXDET + id; + int shm_id; + int sz; -int multiSlsDetector::initSharedMemory(int id=0) { - - key_t mem_key=DEFAULT_SHM_KEY+MAXDET+id; - int shm_id; - int sz; - - - - sz=sizeof(sharedMultiSlsDetector); - + sz = sizeof(sharedMultiSlsDetector); #ifdef VERBOSE - std::cout<<"multiSlsDetector: Size of shared memory is "<< sz << " - id " << mem_key << std::endl; + std::cout << "multiSlsDetector: Size of shared memory is " << sz << " - id " << mem_key << std::endl; #endif - shm_id = shmget(mem_key,sz,IPC_CREAT | 0666); // allocate shared memory + shm_id = shmget(mem_key, sz, IPC_CREAT | 0666); // allocate shared memory - if (shm_id < 0) { - std::cout<<"*** shmget error (server) ***"<< shm_id << std::endl; - return shm_id; - } + if (shm_id < 0) { + std::cout << "*** shmget error (server) ***" << shm_id << std::endl; + return shm_id; + } - /** + /** thisMultiDetector pointer is set to the memory address of the shared memory */ - thisMultiDetector = (sharedMultiSlsDetector*) shmat(shm_id, NULL, 0); /* attach */ + thisMultiDetector = (sharedMultiSlsDetector*)shmat(shm_id, NULL, 0); /* attach */ - if (thisMultiDetector == (void*)-1) { - std::cout<<"*** shmat error (server) ***" << std::endl; - return shm_id; - } - /** + if (thisMultiDetector == (void*)-1) { + std::cout << "*** shmat error (server) ***" << std::endl; + return shm_id; + } + /** shm_id returns -1 is shared memory initialization fails */ - return shm_id; - + return shm_id; } - - - -multiSlsDetector::multiSlsDetector(int id) : slsDetectorUtils(), shmId(-1) +multiSlsDetector::multiSlsDetector(int id) + : slsDetectorUtils() + , shmId(-1) { - while (shmId<0) { - shmId=initSharedMemory(id); - ++id; - } - --id; - - for (int id=0; idalreadyExisting==0) { - - - thisMultiDetector->onlineFlag = ONLINE_FLAG; - thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; - thisMultiDetector->numberOfDetectors=0; - thisMultiDetector->numberOfDetector[X]=0; - thisMultiDetector->numberOfDetector[Y]=0; - for (int id=0; iddetectorIds[id]=-1; - thisMultiDetector->offsetX[id]=0; - thisMultiDetector->offsetY[id]=0; + while (shmId < 0) { + shmId = initSharedMemory(id); + ++id; } - thisMultiDetector->masterPosition=-1; - thisMultiDetector->dataBytes=0; - thisMultiDetector->dataBytesInclGapPixels=0; - thisMultiDetector->numberOfChannels=0; - thisMultiDetector->numberOfChannel[X]=0; - thisMultiDetector->numberOfChannel[Y]=0; - thisMultiDetector->numberOfChannelInclGapPixels[X]=0; - thisMultiDetector->numberOfChannelInclGapPixels[Y]=0; + --id; - thisMultiDetector->maxNumberOfChannels=0; - thisMultiDetector->maxNumberOfChannel[X]=0; - thisMultiDetector->maxNumberOfChannel[Y]=0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[X]=0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y]=0; + for (int id = 0; id < MAXDET; ++id) { + detectors[id] = NULL; + } + if (thisMultiDetector->alreadyExisting == 0) { - thisMultiDetector->maxNumberOfChannelsPerDetector[X]=-1; - thisMultiDetector->maxNumberOfChannelsPerDetector[Y]=-1; + thisMultiDetector->onlineFlag = ONLINE_FLAG; + thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; + thisMultiDetector->numberOfDetectors = 0; + thisMultiDetector->numberOfDetector[X] = 0; + thisMultiDetector->numberOfDetector[Y] = 0; + for (int id = 0; id < MAXDET; ++id) { + thisMultiDetector->detectorIds[id] = -1; + thisMultiDetector->offsetX[id] = 0; + thisMultiDetector->offsetY[id] = 0; + } + thisMultiDetector->masterPosition = -1; + thisMultiDetector->dataBytes = 0; + thisMultiDetector->dataBytesInclGapPixels = 0; + thisMultiDetector->numberOfChannels = 0; + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; - /** set trimDsdir, calDir and filePath to default to root directory*/ - strcpy(thisMultiDetector->filePath,"/"); - /** set fileName to default to run*/ - strcpy(thisMultiDetector->fileName,"run"); - /** set fileIndex to default to 0*/ - thisMultiDetector->fileIndex=0; - /** set frames per file to default to 1*/ - thisMultiDetector->framesPerFile=1; - /** set fileFormat to default to ascii*/ - thisMultiDetector->fileFormatType=ASCII; + thisMultiDetector->maxNumberOfChannels = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - /** set progress Index to default to 0*/ - thisMultiDetector->progressIndex=0; - /** set total number of frames to be acquired to default to 1*/ - thisMultiDetector->totalProgress=1; + thisMultiDetector->maxNumberOfChannelsPerDetector[X] = -1; + thisMultiDetector->maxNumberOfChannelsPerDetector[Y] = -1; + /** set trimDsdir, calDir and filePath to default to root directory*/ + strcpy(thisMultiDetector->filePath, "/"); + /** set fileName to default to run*/ + strcpy(thisMultiDetector->fileName, "run"); + /** set fileIndex to default to 0*/ + thisMultiDetector->fileIndex = 0; + /** set frames per file to default to 1*/ + thisMultiDetector->framesPerFile = 1; + /** set fileFormat to default to ascii*/ + thisMultiDetector->fileFormatType = ASCII; + /** set progress Index to default to 0*/ + thisMultiDetector->progressIndex = 0; + /** set total number of frames to be acquired to default to 1*/ + thisMultiDetector->totalProgress = 1; + /** set correction mask to 0*/ + thisMultiDetector->correctionMask = 1 << WRITE_FILE; + thisMultiDetector->correctionMask |= (1 << OVERWRITE_FILE); + /** set deat time*/ + thisMultiDetector->tDead = 0; + /** sets bad channel list file to none */ + strcpy(thisMultiDetector->badChanFile, "none"); + /** sets flat field correction directory */ + strcpy(thisMultiDetector->flatFieldDir, getenv("HOME")); + /** sets flat field correction file */ + strcpy(thisMultiDetector->flatFieldFile, "none"); + /** set angular direction to 1*/ + thisMultiDetector->angDirection = 1; + /** set fine offset to 0*/ + thisMultiDetector->fineOffset = 0; + /** set global offset to 0*/ + thisMultiDetector->globalOffset = 0; - /** set correction mask to 0*/ - thisMultiDetector->correctionMask=1<correctionMask|=(1<tDead=0; - /** sets bad channel list file to none */ - strcpy(thisMultiDetector->badChanFile,"none"); - /** sets flat field correction directory */ - strcpy(thisMultiDetector->flatFieldDir,getenv("HOME")); - /** sets flat field correction file */ - strcpy(thisMultiDetector->flatFieldFile,"none"); - /** set angular direction to 1*/ - thisMultiDetector->angDirection=1; - /** set fine offset to 0*/ - thisMultiDetector->fineOffset=0; - /** set global offset to 0*/ - thisMultiDetector->globalOffset=0; + /** set threshold to -1*/ + thisMultiDetector->currentThresholdEV = -1; + // /** set clockdivider to 1*/ + // thisMultiDetector->clkDiv=1; + /** set number of positions to 0*/ + thisMultiDetector->numberOfPositions = 0; + /** sets angular conversion file to none */ + strcpy(thisMultiDetector->angConvFile, "none"); + /** set binsize*/ + thisMultiDetector->binSize = 0.001; + thisMultiDetector->stoppedFlag = 0; + thisMultiDetector->threadedProcessing = 1; + thisMultiDetector->actionMask = 0; - /** set threshold to -1*/ - thisMultiDetector->currentThresholdEV=-1; - // /** set clockdivider to 1*/ - // thisMultiDetector->clkDiv=1; - /** set number of positions to 0*/ - thisMultiDetector->numberOfPositions=0; - /** sets angular conversion file to none */ - strcpy(thisMultiDetector->angConvFile,"none"); - /** set binsize*/ - thisMultiDetector->binSize=0.001; - thisMultiDetector->stoppedFlag=0; + for (int ia = 0; ia < MAX_ACTIONS; ++ia) { + //thisMultiDetector->actionMode[ia]=0; + strcpy(thisMultiDetector->actionScript[ia], "none"); + strcpy(thisMultiDetector->actionParameter[ia], "none"); + } - thisMultiDetector->threadedProcessing=1; + for (int iscan = 0; iscan < MAX_SCAN_LEVELS; ++iscan) { - thisMultiDetector->actionMask=0; + thisMultiDetector->scanMode[iscan] = 0; + strcpy(thisMultiDetector->scanScript[iscan], "none"); + strcpy(thisMultiDetector->scanParameter[iscan], "none"); + thisMultiDetector->nScanSteps[iscan] = 0; + thisMultiDetector->scanPrecision[iscan] = 0; + } - - for (int ia=0; iaactionMode[ia]=0; - strcpy(thisMultiDetector->actionScript[ia],"none"); - strcpy(thisMultiDetector->actionParameter[ia],"none"); + thisMultiDetector->acquiringFlag = false; + thisMultiDetector->receiver_upstream = false; + thisMultiDetector->alreadyExisting = 1; } + //assigned before creating detector + stoppedFlag = &thisMultiDetector->stoppedFlag; + threadedProcessing = &thisMultiDetector->threadedProcessing; + actionMask = &thisMultiDetector->actionMask; + actionScript = thisMultiDetector->actionScript; + actionParameter = thisMultiDetector->actionParameter; + nScanSteps = thisMultiDetector->nScanSteps; + scanMode = thisMultiDetector->scanMode; + scanScript = thisMultiDetector->scanScript; + scanParameter = thisMultiDetector->scanParameter; + scanSteps = thisMultiDetector->scanSteps; + scanPrecision = thisMultiDetector->scanPrecision; + numberOfPositions = &thisMultiDetector->numberOfPositions; + detPositions = thisMultiDetector->detPositions; + angConvFile = thisMultiDetector->angConvFile; + correctionMask = &thisMultiDetector->correctionMask; + binSize = &thisMultiDetector->binSize; + fineOffset = &thisMultiDetector->fineOffset; + globalOffset = &thisMultiDetector->globalOffset; + angDirection = &thisMultiDetector->angDirection; + flatFieldDir = thisMultiDetector->flatFieldDir; + flatFieldFile = thisMultiDetector->flatFieldFile; + badChanFile = thisMultiDetector->badChanFile; + timerValue = thisMultiDetector->timerValue; - for (int iscan=0; iscanscanMode[iscan]=0; - strcpy(thisMultiDetector->scanScript[iscan],"none"); - strcpy(thisMultiDetector->scanParameter[iscan],"none"); - thisMultiDetector->nScanSteps[iscan]=0; - thisMultiDetector->scanPrecision[iscan]=0; + currentSettings = &thisMultiDetector->currentSettings; + currentThresholdEV = &thisMultiDetector->currentThresholdEV; + moveFlag = NULL; + + sampleDisplacement = thisMultiDetector->sampleDisplacement; + + filePath = thisMultiDetector->filePath; + fileName = thisMultiDetector->fileName; + fileIndex = &thisMultiDetector->fileIndex; + framesPerFile = &thisMultiDetector->framesPerFile; + fileFormatType = &thisMultiDetector->fileFormatType; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { +#ifdef VERBOSE + cout << thisMultiDetector->detectorIds[i] << endl; +#endif + detectors[i] = new slsDetector(i, thisMultiDetector->detectorIds[i], this); + + // setAngularConversionPointer(detectors[i]->getAngularConversionPointer(),detectors[i]->getNModsPointer(),detectors[i]->getNChans()*detectors[i]->getNChips(), i); + } + // for (int i=thisMultiDetector->numberOfDetectors; ilastPID = getpid(); + + getNMods(); + getMaxMods(); + client_downstream = false; + for (int i = 0; i < MAXDET; ++i) + zmqSocket[i] = 0; + threadpool = 0; + if (createThreadPool() == FAIL) + exit(-1); +} + +multiSlsDetector::~multiSlsDetector() +{ + //removeSlsDetector(); + for (int i = 0; i < MAXDET; ++i) { + if (zmqSocket[i]) { + delete zmqSocket[i]; + } + } + destroyThreadPool(); +} + +int multiSlsDetector::createThreadPool() +{ + if (threadpool) + destroyThreadPool(); + int numthreads = thisMultiDetector->numberOfDetectors; + if (numthreads < 1) { + numthreads = 1; //create threadpool anyway, threads initialized only when >1 detector added + } + threadpool = new ThreadPool(numthreads); + switch (threadpool->initialize_threadpool()) { + case 0: + cerr << "Failed to initialize thread pool!" << endl; + return FAIL; + case 1: +#ifdef VERBOSE + cout << "Not initializing threads, not multi detector" << endl; +#endif + break; + default: +#ifdef VERBOSE + cout << "Initialized Threadpool " << threadpool << endl; +#endif + break; + } + return OK; +} + +void multiSlsDetector::destroyThreadPool() +{ + if (threadpool) { + delete threadpool; + threadpool = 0; +#ifdef VERBOSE + cout << "Destroyed Threadpool " << threadpool << endl; +#endif + } +} + +int multiSlsDetector::addSlsDetector(int id, int pos) +{ + int j = thisMultiDetector->numberOfDetectors; + + if (slsDetector::exists(id) == 0) { + cout << "Detector " << id << " does not exist - You should first create it to determine type etc." << endl; } - thisMultiDetector->acquiringFlag = false; - thisMultiDetector->receiver_upstream = false; - thisMultiDetector->alreadyExisting=1; - } - - - //assigned before creating detector - stoppedFlag=&thisMultiDetector->stoppedFlag; - threadedProcessing=&thisMultiDetector->threadedProcessing; - actionMask=&thisMultiDetector->actionMask; - actionScript=thisMultiDetector->actionScript; - actionParameter=thisMultiDetector->actionParameter; - nScanSteps=thisMultiDetector->nScanSteps; - scanMode=thisMultiDetector->scanMode; - scanScript=thisMultiDetector->scanScript; - scanParameter=thisMultiDetector->scanParameter; - scanSteps=thisMultiDetector->scanSteps; - scanPrecision=thisMultiDetector->scanPrecision; - numberOfPositions=&thisMultiDetector->numberOfPositions; - detPositions=thisMultiDetector->detPositions; - angConvFile=thisMultiDetector->angConvFile; - correctionMask=&thisMultiDetector->correctionMask; - binSize=&thisMultiDetector->binSize; - fineOffset=&thisMultiDetector->fineOffset; - globalOffset=&thisMultiDetector->globalOffset; - angDirection=&thisMultiDetector->angDirection; - flatFieldDir=thisMultiDetector->flatFieldDir; - flatFieldFile=thisMultiDetector->flatFieldFile; - badChanFile=thisMultiDetector->badChanFile; - timerValue=thisMultiDetector->timerValue; - - expTime=&timerValue[ACQUISITION_TIME]; - - currentSettings=&thisMultiDetector->currentSettings; - currentThresholdEV=&thisMultiDetector->currentThresholdEV; - moveFlag=NULL; - - sampleDisplacement=thisMultiDetector->sampleDisplacement; - - filePath=thisMultiDetector->filePath; - fileName=thisMultiDetector->fileName; - fileIndex=&thisMultiDetector->fileIndex; - framesPerFile=&thisMultiDetector->framesPerFile; - fileFormatType=&thisMultiDetector->fileFormatType; - - - for (int i=0; inumberOfDetectors; ++i) { #ifdef VERBOSE - cout << thisMultiDetector->detectorIds[i] << endl; -#endif - detectors[i]=new slsDetector(i, thisMultiDetector->detectorIds[i], this); - - - // setAngularConversionPointer(detectors[i]->getAngularConversionPointer(),detectors[i]->getNModsPointer(),detectors[i]->getNChans()*detectors[i]->getNChips(), i); - - } - // for (int i=thisMultiDetector->numberOfDetectors; ilastPID=getpid(); - - - getNMods(); - getMaxMods(); - client_downstream = false; - for(int i=0;inumberOfDetectors; - if(numthreads < 1){ - numthreads = 1; //create threadpool anyway, threads initialized only when >1 detector added - } - threadpool = new ThreadPool(numthreads); - switch(threadpool->initialize_threadpool()){ - case 0: - cerr << "Failed to initialize thread pool!" << endl; - return FAIL; - case 1: -#ifdef VERBOSE - cout << "Not initializing threads, not multi detector" << endl; -#endif - break; - default: -#ifdef VERBOSE - cout << "Initialized Threadpool " << threadpool << endl; -#endif - break; - } - return OK; -} - -void multiSlsDetector::destroyThreadPool(){ - if(threadpool){ - delete threadpool; - threadpool=0; -#ifdef VERBOSE - cout<<"Destroyed Threadpool "<< threadpool << endl; -#endif - } -} - - -int multiSlsDetector::addSlsDetector(int id, int pos) { - int j=thisMultiDetector->numberOfDetectors; - - - if (slsDetector::exists(id)==0) { - cout << "Detector " << id << " does not exist - You should first create it to determine type etc." << endl; - } - -#ifdef VERBOSE - cout << "Adding detector " << id << " in position " << pos << endl; + cout << "Adding detector " << id << " in position " << pos << endl; #endif - if (pos<0) - pos=j; + if (pos < 0) + pos = j; - if (pos>j) - pos=thisMultiDetector->numberOfDetectors; + if (pos > j) + pos = thisMultiDetector->numberOfDetectors; + //check that it is not already in the list - - //check that it is not already in the list - - for (int i=0; inumberOfDetectors; ++i) { - //check that it is not already in the list, in that case move to new position - if (detectors[i]) { - if (detectors[i]->getDetectorId()==id) { - cout << "Detector " << id << "already part of the multiDetector in position " << i << "!" << endl << "Remove it before adding it back in a new position!"<< endl; - return -1; - } + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + //check that it is not already in the list, in that case move to new position + if (detectors[i]) { + if (detectors[i]->getDetectorId() == id) { + cout << "Detector " << id << "already part of the multiDetector in position " << i << "!" << endl + << "Remove it before adding it back in a new position!" << endl; + return -1; + } + } } - } - - - if (pos!=thisMultiDetector->numberOfDetectors) { - for (int ip=thisMultiDetector->numberOfDetectors-1; ip>=pos; --ip) { + if (pos != thisMultiDetector->numberOfDetectors) { + for (int ip = thisMultiDetector->numberOfDetectors - 1; ip >= pos; --ip) { #ifdef VERBOSE - cout << "Moving detector " << thisMultiDetector->detectorIds[ip] << " from position " << ip << " to " << ip+1 << endl; + cout << "Moving detector " << thisMultiDetector->detectorIds[ip] << " from position " << ip << " to " << ip + 1 << endl; #endif - thisMultiDetector->detectorIds[ip+1]=thisMultiDetector->detectorIds[ip]; - detectors[ip+1]=detectors[ip]; + thisMultiDetector->detectorIds[ip + 1] = thisMultiDetector->detectorIds[ip]; + detectors[ip + 1] = detectors[ip]; + } } - } #ifdef VERBOSE - cout << "Creating new detector " << pos << endl; + cout << "Creating new detector " << pos << endl; #endif - detectors[pos]=new slsDetector(pos, id, this); - thisMultiDetector->detectorIds[pos]=detectors[pos]->getDetectorId(); - ++thisMultiDetector->numberOfDetectors; + detectors[pos] = new slsDetector(pos, id, this); + thisMultiDetector->detectorIds[pos] = detectors[pos]->getDetectorId(); + ++thisMultiDetector->numberOfDetectors; - thisMultiDetector->dataBytes+=detectors[pos]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels+=detectors[pos]->getDataBytesInclGapPixels(); + thisMultiDetector->dataBytes += detectors[pos]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels += detectors[pos]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels+=detectors[pos]->getTotalNumberOfChannels(); - thisMultiDetector->maxNumberOfChannels+=detectors[pos]->getMaxNumberOfChannels(); + thisMultiDetector->numberOfChannels += detectors[pos]->getTotalNumberOfChannels(); + thisMultiDetector->maxNumberOfChannels += detectors[pos]->getMaxNumberOfChannels(); - - - getMaxMods(); - getNMods(); - getMaxMod(X); - getNMod(X); - getMaxMod(Y); - getNMod(Y); + getMaxMods(); + getNMods(); + getMaxMod(X); + getNMod(X); + getMaxMod(Y); + getNMod(Y); #ifdef VERBOSE - cout << "Detector added " << thisMultiDetector->numberOfDetectors<< endl; + cout << "Detector added " << thisMultiDetector->numberOfDetectors << endl; - for (int ip=0; ipnumberOfDetectors; ++ip) { - cout << "Detector " << thisMultiDetector->detectorIds[ip] << " position " << ip << " " << detectors[ip]->getHostname() << endl; - } + for (int ip = 0; ip < thisMultiDetector->numberOfDetectors; ++ip) { + cout << "Detector " << thisMultiDetector->detectorIds[ip] << " position " << ip << " " << detectors[ip]->getHostname() << endl; + } #endif - //set offsets - updateOffsets(); - if(createThreadPool() == FAIL) - exit(-1); - - - return thisMultiDetector->numberOfDetectors; + //set offsets + updateOffsets(); + if (createThreadPool() == FAIL) + exit(-1); + return thisMultiDetector->numberOfDetectors; } - -void multiSlsDetector::updateOffsets(){//cannot paralllize due to slsdetector calling this via parentdet-> +void multiSlsDetector::updateOffsets() +{ //cannot paralllize due to slsdetector calling this via parentdet-> #ifdef VERBOSE - cout << endl << "Updating Multi-Detector Offsets" << endl; + cout << endl + << "Updating Multi-Detector Offsets" << endl; #endif - int offsetX=0, offsetY=0, numX=0, numY=0, maxX=0, maxY=0; - int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; - int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; - int prevChanX=0; - int prevChanY=0; - bool firstTime = true; + int offsetX = 0, offsetY = 0, numX = 0, numY = 0, maxX = 0, maxY = 0; + int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; + int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; + int prevChanX = 0; + int prevChanY = 0; + bool firstTime = true; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->numberOfChannel[Y] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - thisMultiDetector->numberOfDetector[X] = 0; - thisMultiDetector->numberOfDetector[Y] = 0; + thisMultiDetector->numberOfChannel[X] = 0; + thisMultiDetector->numberOfChannel[Y] = 0; + thisMultiDetector->maxNumberOfChannel[X] = 0; + thisMultiDetector->maxNumberOfChannel[Y] = 0; + thisMultiDetector->numberOfDetector[X] = 0; + thisMultiDetector->numberOfDetector[Y] = 0; + // gap pixels + int offsetX_gp = 0, offsetY_gp = 0, numX_gp = 0, numY_gp = 0, maxX_gp = 0, maxY_gp = 0; + int prevChanX_gp = 0, prevChanY_gp = 0; + thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; + thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - // gap pixels - int offsetX_gp=0, offsetY_gp=0, numX_gp=0, numY_gp=0, maxX_gp=0, maxY_gp=0; - int prevChanX_gp=0, prevChanY_gp=0; - thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - - - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { #ifdef VERBOSE - cout<<"offsetX:"<getTotalNumberOfChannels(Y) <<" maxChanY:"< 0) && ((offsetX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) - cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; - if ((maxChanY > 0) && ((offsetY + detectors[i]->getTotalNumberOfChannels(Y)) > maxChanY)) - cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in Y dimension!" << endl; - prevChanX = detectors[i]->getTotalNumberOfChannels(X); - prevChanY = detectors[i]->getTotalNumberOfChannels(Y); - prevChanX_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); - prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); - numX += detectors[i]->getTotalNumberOfChannels(X); - numY += detectors[i]->getTotalNumberOfChannels(Y); - numX_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); - numY_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); - maxX += detectors[i]->getMaxNumberOfChannels(X); - maxY += detectors[i]->getMaxNumberOfChannels(Y); - maxX_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(X); - maxY_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y); - ++thisMultiDetector->numberOfDetector[X]; - ++thisMultiDetector->numberOfDetector[Y]; + //cout<<" totalchan:"<< detectors[i]->getTotalNumberOfChannels(Y) <<" maxChanY:"< 0) && ((offsetX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) + cout << "\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; + if ((maxChanY > 0) && ((offsetY + detectors[i]->getTotalNumberOfChannels(Y)) > maxChanY)) + cout << "\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in Y dimension!" << endl; + prevChanX = detectors[i]->getTotalNumberOfChannels(X); + prevChanY = detectors[i]->getTotalNumberOfChannels(Y); + prevChanX_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); + prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); + numX += detectors[i]->getTotalNumberOfChannels(X); + numY += detectors[i]->getTotalNumberOfChannels(Y); + numX_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); + numY_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); + maxX += detectors[i]->getMaxNumberOfChannels(X); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + maxX_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(X); + maxY_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y); + ++thisMultiDetector->numberOfDetector[X]; + ++thisMultiDetector->numberOfDetector[Y]; #ifdef VERBOSE - cout<<"incrementing in both direction"< 0) && ((offsetY + prevChanY + detectors[i]->getTotalNumberOfChannels(Y)) <= maxChanY))){ - offsetY += prevChanY; - offsetY_gp += prevChanY_gp; - prevChanY = detectors[i]->getTotalNumberOfChannels(Y); - prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); - numY += detectors[i]->getTotalNumberOfChannels(Y); - numY_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); - maxY += detectors[i]->getMaxNumberOfChannels(Y); - maxY_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y); - ++thisMultiDetector->numberOfDetector[Y]; + //incrementing in y direction + else if ((maxChanY == -1) || ((maxChanY > 0) && ((offsetY + prevChanY + detectors[i]->getTotalNumberOfChannels(Y)) <= maxChanY))) { + offsetY += prevChanY; + offsetY_gp += prevChanY_gp; + prevChanY = detectors[i]->getTotalNumberOfChannels(Y); + prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); + numY += detectors[i]->getTotalNumberOfChannels(Y); + numY_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); + maxY += detectors[i]->getMaxNumberOfChannels(Y); + maxY_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y); + ++thisMultiDetector->numberOfDetector[Y]; #ifdef VERBOSE - cout<<"incrementing in y direction"< 0) && ((offsetX + prevChanX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) - cout<<"\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; - offsetY = 0; - offsetY_gp = 0; - prevChanY = detectors[i]->getTotalNumberOfChannels(Y); - prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); - numY = 0; //assuming symmetry with this statement. whats on 1st column should be on 2nd column - numY_gp = 0; - maxY = 0; - maxY_gp = 0; - offsetX += prevChanX; - offsetX_gp += prevChanX_gp; - prevChanX = detectors[i]->getTotalNumberOfChannels(X); - prevChanX_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); - numX += detectors[i]->getTotalNumberOfChannels(X); - numX_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); - maxX += detectors[i]->getMaxNumberOfChannels(X); - maxX_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(X); - ++thisMultiDetector->numberOfDetector[X]; + //incrementing in x direction + else { + if ((maxChanX > 0) && ((offsetX + prevChanX + detectors[i]->getTotalNumberOfChannels(X)) > maxChanX)) + cout << "\nDetector[" << i << "] exceeds maximum channels allowed for complete detector set in X dimension!" << endl; + offsetY = 0; + offsetY_gp = 0; + prevChanY = detectors[i]->getTotalNumberOfChannels(Y); + prevChanY_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(Y); + numY = 0; //assuming symmetry with this statement. whats on 1st column should be on 2nd column + numY_gp = 0; + maxY = 0; + maxY_gp = 0; + offsetX += prevChanX; + offsetX_gp += prevChanX_gp; + prevChanX = detectors[i]->getTotalNumberOfChannels(X); + prevChanX_gp = detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); + numX += detectors[i]->getTotalNumberOfChannels(X); + numX_gp += detectors[i]->getTotalNumberOfChannelsInclGapPixels(X); + maxX += detectors[i]->getMaxNumberOfChannels(X); + maxX_gp += detectors[i]->getMaxNumberOfChannelsInclGapPixels(X); + ++thisMultiDetector->numberOfDetector[X]; #ifdef VERBOSE - cout<<"incrementing in x direction"<getDataBytes() / (double)(detectors[i]->getMaxNumberOfChannels(X) * detectors[i]->getMaxNumberOfChannels(Y)); - thisMultiDetector->offsetX[i] = (bytesperchannel >= 1.0) ? offsetX_gp : offsetX; - thisMultiDetector->offsetY[i] = (bytesperchannel >= 1.0) ? offsetY_gp : offsetY; + double bytesperchannel = (double)detectors[i]->getDataBytes() / (double)(detectors[i]->getMaxNumberOfChannels(X) * detectors[i]->getMaxNumberOfChannels(Y)); + thisMultiDetector->offsetX[i] = (bytesperchannel >= 1.0) ? offsetX_gp : offsetX; + thisMultiDetector->offsetY[i] = (bytesperchannel >= 1.0) ? offsetY_gp : offsetY; #ifdef VERBOSE - cout << "Detector[" << i << "] has offsets (" << thisMultiDetector->offsetX[i] << ", " << thisMultiDetector->offsetY[i] << ")" << endl; + cout << "Detector[" << i << "] has offsets (" << thisMultiDetector->offsetX[i] << ", " << thisMultiDetector->offsetY[i] << ")" << endl; #endif - //offsetY has been reset sometimes and offsetX the first time, but remember the highest values - if(numX > thisMultiDetector->numberOfChannel[X]) - thisMultiDetector->numberOfChannel[X] = numX; - if(numY > thisMultiDetector->numberOfChannel[Y]) - thisMultiDetector->numberOfChannel[Y] = numY; - if(numX_gp > thisMultiDetector->numberOfChannelInclGapPixels[X]) - thisMultiDetector->numberOfChannelInclGapPixels[X] = numX_gp; - if(numY_gp > thisMultiDetector->numberOfChannelInclGapPixels[Y]) - thisMultiDetector->numberOfChannelInclGapPixels[Y] = numY_gp; - if(maxX > thisMultiDetector->maxNumberOfChannel[X]) - thisMultiDetector->maxNumberOfChannel[X] = maxX; - if(maxY > thisMultiDetector->maxNumberOfChannel[Y]) - thisMultiDetector->maxNumberOfChannel[Y] = maxY; - if(maxX_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[X]) - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = maxX_gp; - if(maxY_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[Y]) - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = maxY_gp; - } - } + //offsetY has been reset sometimes and offsetX the first time, but remember the highest values + if (numX > thisMultiDetector->numberOfChannel[X]) + thisMultiDetector->numberOfChannel[X] = numX; + if (numY > thisMultiDetector->numberOfChannel[Y]) + thisMultiDetector->numberOfChannel[Y] = numY; + if (numX_gp > thisMultiDetector->numberOfChannelInclGapPixels[X]) + thisMultiDetector->numberOfChannelInclGapPixels[X] = numX_gp; + if (numY_gp > thisMultiDetector->numberOfChannelInclGapPixels[Y]) + thisMultiDetector->numberOfChannelInclGapPixels[Y] = numY_gp; + if (maxX > thisMultiDetector->maxNumberOfChannel[X]) + thisMultiDetector->maxNumberOfChannel[X] = maxX; + if (maxY > thisMultiDetector->maxNumberOfChannel[Y]) + thisMultiDetector->maxNumberOfChannel[Y] = maxY; + if (maxX_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[X]) + thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = maxX_gp; + if (maxY_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[Y]) + thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = maxY_gp; + } + } #ifdef VERBOSE - cout << "Number of Channels in X direction:" << thisMultiDetector->numberOfChannel[X] << endl; - cout << "Number of Channels in Y direction:" << thisMultiDetector->numberOfChannel[Y] << endl << endl; - cout << "Number of Channels in X direction with Gap Pixels:" << thisMultiDetector->numberOfChannelInclGapPixels[X] << endl; - cout << "Number of Channels in Y direction with Gap Pixels:" << thisMultiDetector->numberOfChannelInclGapPixels[Y] << endl << endl; + cout << "Number of Channels in X direction:" << thisMultiDetector->numberOfChannel[X] << endl; + cout << "Number of Channels in Y direction:" << thisMultiDetector->numberOfChannel[Y] << endl + << endl; + cout << "Number of Channels in X direction with Gap Pixels:" << thisMultiDetector->numberOfChannelInclGapPixels[X] << endl; + cout << "Number of Channels in Y direction with Gap Pixels:" << thisMultiDetector->numberOfChannelInclGapPixels[Y] << endl + << endl; #endif } -string multiSlsDetector::setHostname(const char* name, int pos){ +string multiSlsDetector::setHostname(const char* name, int pos) +{ - // int id=0; - string s; - if (pos>=0) { - addSlsDetector(name, pos); - if (detectors[pos]) - return detectors[pos]->getHostname(); - } else { - size_t p1=0; - s=string(name); - size_t p2=s.find('+',p1); - char hn[1000]; - if (p2==string::npos) { - strcpy(hn,s.c_str()); - addSlsDetector(hn, pos); + // int id=0; + string s; + if (pos >= 0) { + addSlsDetector(name, pos); + if (detectors[pos]) + return detectors[pos]->getHostname(); } else { - while (p2!=string::npos) { - strcpy(hn,s.substr(p1,p2-p1).c_str()); - addSlsDetector(hn, pos); - s=s.substr(p2+1); - p2=s.find('+'); - } + size_t p1 = 0; + s = string(name); + size_t p2 = s.find('+', p1); + char hn[1000]; + if (p2 == string::npos) { + strcpy(hn, s.c_str()); + addSlsDetector(hn, pos); + } else { + while (p2 != string::npos) { + strcpy(hn, s.substr(p1, p2 - p1).c_str()); + addSlsDetector(hn, pos); + s = s.substr(p2 + 1); + p2 = s.find('+'); + } + } } - } #ifdef VERBOSE - cout << "-----------------------------set online!" << endl; + cout << "-----------------------------set online!" << endl; #endif - setOnline(ONLINE_FLAG); + setOnline(ONLINE_FLAG); - return getHostname(pos); + return getHostname(pos); } -string multiSlsDetector::ssetDetectorsType(string name, int pos) { +string multiSlsDetector::ssetDetectorsType(string name, int pos) +{ - - // int id=0; - string s; - if (pos>=0) { - if (getDetectorType(name)!=GET_DETECTOR_TYPE) - addSlsDetector(name.c_str(), pos); - } else { - removeSlsDetector(); //reset detector list! - size_t p1=0; - s=string(name); - size_t p2=s.find('+',p1); - char hn[1000]; - if (p2==string::npos) { - strcpy(hn,s.c_str()); - addSlsDetector(hn, pos); + // int id=0; + string s; + if (pos >= 0) { + if (getDetectorType(name) != GET_DETECTOR_TYPE) + addSlsDetector(name.c_str(), pos); } else { - while (p2!=string::npos) { - strcpy(hn,s.substr(p1,p2-p1).c_str()); - if (getDetectorType(hn)!=GET_DETECTOR_TYPE) - addSlsDetector(hn, pos); - s=s.substr(p2+1); - p2=s.find('+'); - } + removeSlsDetector(); //reset detector list! + size_t p1 = 0; + s = string(name); + size_t p2 = s.find('+', p1); + char hn[1000]; + if (p2 == string::npos) { + strcpy(hn, s.c_str()); + addSlsDetector(hn, pos); + } else { + while (p2 != string::npos) { + strcpy(hn, s.substr(p1, p2 - p1).c_str()); + if (getDetectorType(hn) != GET_DETECTOR_TYPE) + addSlsDetector(hn, pos); + s = s.substr(p2 + 1); + p2 = s.find('+'); + } + } } - } - return sgetDetectorsType(pos); - + return sgetDetectorsType(pos); } -string multiSlsDetector::getHostname(int pos) { - string hostnames; - if (pos>=0){ - if (detectors[pos]) - return detectors[pos]->getHostname(); - } else { - for (int ip=0; ipnumberOfDetectors; ++ip) { - if (detectors[ip]) - hostnames += detectors[ip]->getHostname() + "+"; - } - } - return hostnames; +string multiSlsDetector::getHostname(int pos) +{ + string hostnames; + if (pos >= 0) { + if (detectors[pos]) + return detectors[pos]->getHostname(); + } else { + for (int ip = 0; ip < thisMultiDetector->numberOfDetectors; ++ip) { + if (detectors[ip]) + hostnames += detectors[ip]->getHostname() + "+"; + } + } + return hostnames; } +slsDetectorDefs::detectorType multiSlsDetector::getDetectorsType(int pos) +{ -slsDetectorDefs::detectorType multiSlsDetector::getDetectorsType(int pos) { - - detectorType s =GENERIC; + detectorType s = GENERIC; #ifdef VERBOSE - cout << "returning type of detector with ID " << pos << endl; + cout << "returning type of detector with ID " << pos << endl; #endif - if (pos>=0) { - if (detectors[pos]) - return detectors[pos]->getDetectorsType(); - } else if (detectors[0]) - return detectors[0]->getDetectorsType(); - return s; + if (pos >= 0) { + if (detectors[pos]) + return detectors[pos]->getDetectorsType(); + } else if (detectors[0]) + return detectors[0]->getDetectorsType(); + return s; } - -string multiSlsDetector::sgetDetectorsType(int pos) { - string s; - if (pos>=0) { - if (detectors[pos]) - return detectors[pos]->sgetDetectorsType(); - } else { - for (int ip=0; ipnumberOfDetectors; ++ip) { - if (detectors[ip]) - s+=detectors[ip]->sgetDetectorsType() + "+"; +string multiSlsDetector::sgetDetectorsType(int pos) +{ + string s; + if (pos >= 0) { + if (detectors[pos]) + return detectors[pos]->sgetDetectorsType(); + } else { + for (int ip = 0; ip < thisMultiDetector->numberOfDetectors; ++ip) { + if (detectors[ip]) + s += detectors[ip]->sgetDetectorsType() + "+"; + } } - } - return s; + return s; } -int multiSlsDetector::getDetectorId(int pos) { +int multiSlsDetector::getDetectorId(int pos) +{ #ifdef VERBOSE - cout << "Getting detector ID " << pos << endl; + cout << "Getting detector ID " << pos << endl; #endif - if (pos>=0) { - if (detectors[pos]) - return detectors[pos]->getDetectorId(); - } - return -1; -} - - - -int multiSlsDetector::setDetectorId(int ival, int pos){ - - if (pos>=0) { - addSlsDetector(ival, pos); - if (detectors[pos]) - return detectors[pos]->getDetectorId(); - } else { + if (pos >= 0) { + if (detectors[pos]) + return detectors[pos]->getDetectorId(); + } return -1; - } - return -1; - } +int multiSlsDetector::setDetectorId(int ival, int pos) +{ -int multiSlsDetector::addSlsDetector(const char *name, int pos) { - - detectorType t=getDetectorType(string(name)); - int online=0; - slsDetector *s=NULL; - int id; -#ifdef VERBOSE - cout << "Adding detector "<numberOfDetectors; ++i) { - if (detectors[i]) { - if (detectors[i]->getHostname()==string(name)) { - cout << "Detector " << name << "already part of the multiDetector in position " << i << "!" << endl<< "Remove it before adding it back in a new position!"<< endl; - return -1; - } - } + if (pos >= 0) { + addSlsDetector(ival, pos); + if (detectors[pos]) + return detectors[pos]->getDetectorId(); + } else { + return -1; } - - //checking that the detector doesn't already exists - - for (id=0; id0) { -#ifdef VERBOSE - cout << "Detector " << id << " already exists" << endl; -#endif - s=new slsDetector(pos, id, this); - if (s->getHostname()==string(name)) - break; - delete s; - s=NULL; - //++id; - } - } - - if (s==NULL) { - t=slsDetector::getDetectorType(name, DEFAULT_PORTNO); - if (t==GENERIC) { - cout << "Detector " << name << "does not exist in shared memory and could not connect to it to determine the type (which is not specified)!" << endl; - setErrorMask(getErrorMask()|MULTI_DETECTORS_NOT_ADDED); - appendNotAddedList(name); - return -1; - } -#ifdef VERBOSE - else - cout << "Detector type is " << t << endl; -#endif - online=1; - } - } -#ifdef VERBOSE - else - cout << "Adding detector by type " << getDetectorType(t) << endl; -#endif - - - - if (s==NULL) { - for (id=0; idsetTCPSocket(name); - setOnline(ONLINE_FLAG); - } - delete s; - } -#ifdef VERBOSE - cout << "Adding it to the multi detector structure" << endl; -#endif - return addSlsDetector(id, pos); - - -} - - -int multiSlsDetector::addSlsDetector(detectorType t, int pos) { - - int id; - - if (t==GENERIC) { return -1; - } +} - for (id=0; idnumberOfDetectors; ++i) { + if (detectors[i]) { + if (detectors[i]->getHostname() == string(name)) { + cout << "Detector " << name << "already part of the multiDetector in position " << i << "!" << endl + << "Remove it before adding it back in a new position!" << endl; + return -1; + } + } + } + //checking that the detector doesn't already exists + + for (id = 0; id < MAXDET; ++id) { + if (slsDetector::exists(id) > 0) { +#ifdef VERBOSE + cout << "Detector " << id << " already exists" << endl; +#endif + s = new slsDetector(pos, id, this); + if (s->getHostname() == string(name)) + break; + delete s; + s = NULL; + //++id; + } + } + + if (s == NULL) { + t = slsDetector::getDetectorType(name, DEFAULT_PORTNO); + if (t == GENERIC) { + cout << "Detector " << name << "does not exist in shared memory and could not connect to it to determine the type (which is not specified)!" << endl; + setErrorMask(getErrorMask() | MULTI_DETECTORS_NOT_ADDED); + appendNotAddedList(name); + return -1; + } +#ifdef VERBOSE + else + cout << "Detector type is " << t << endl; +#endif + online = 1; + } + } +#ifdef VERBOSE + else + cout << "Adding detector by type " << getDetectorType(t) << endl; +#endif + + if (s == NULL) { + for (id = 0; id < MAXDET; ++id) { + if (slsDetector::exists(id) == 0) { + break; + } + } + +#ifdef VERBOSE + cout << "Creating detector " << id << " of type " << getDetectorType(t) << endl; +#endif + s = new slsDetector(pos, t, id, this); + if (online) { + s->setTCPSocket(name); + setOnline(ONLINE_FLAG); + } + delete s; + } +#ifdef VERBOSE + cout << "Adding it to the multi detector structure" << endl; +#endif + return addSlsDetector(id, pos); } +int multiSlsDetector::addSlsDetector(detectorType t, int pos) +{ + int id; - -int multiSlsDetector::getDetectorOffset(int pos, int &ox, int &oy) { - ox=-1; - oy=-1; - int ret=FAIL; - if (pos>=0 && posnumberOfDetectors) { - if (detectors[pos]) { - ox=thisMultiDetector->offsetX[pos]; - oy=thisMultiDetector->offsetY[pos]; - ret=OK; + if (t == GENERIC) { + return -1; } - } - return ret; + + for (id = 0; id < MAXDET; ++id) { + if (slsDetector::exists(id) == 0) { + break; + } + } + +#ifdef VERBOSE + cout << "Creating detector " << id << " of type " << getDetectorType(t) << endl; +#endif + new slsDetector(pos, t, id, this); + +#ifdef VERBOSE + cout << "Adding it to the multi detector structure" << endl; +#endif + + return addSlsDetector(id, pos); } -int multiSlsDetector::setDetectorOffset(int pos, int ox, int oy) { - - - int ret=FAIL; - - if (pos>=0 && posnumberOfDetectors) { - if (detectors[pos]) { - if (ox!=-1) - thisMultiDetector->offsetX[pos]=ox; - if (oy!=-1) - thisMultiDetector->offsetY[pos]=oy; - ret=OK; +int multiSlsDetector::getDetectorOffset(int pos, int& ox, int& oy) +{ + ox = -1; + oy = -1; + int ret = FAIL; + if (pos >= 0 && pos < thisMultiDetector->numberOfDetectors) { + if (detectors[pos]) { + ox = thisMultiDetector->offsetX[pos]; + oy = thisMultiDetector->offsetY[pos]; + ret = OK; + } } - } - return ret; + return ret; } +int multiSlsDetector::setDetectorOffset(int pos, int ox, int oy) +{ + int ret = FAIL; -int multiSlsDetector::removeSlsDetector(char *name){ - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - if (detectors[id]->getHostname()==string(name)) { - removeSlsDetector(id); - } + if (pos >= 0 && pos < thisMultiDetector->numberOfDetectors) { + if (detectors[pos]) { + if (ox != -1) + thisMultiDetector->offsetX[pos] = ox; + if (oy != -1) + thisMultiDetector->offsetY[pos] = oy; + ret = OK; + } } - } - return thisMultiDetector->numberOfDetectors; + return ret; +} + +int multiSlsDetector::removeSlsDetector(char* name) +{ + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + if (detectors[id]->getHostname() == string(name)) { + removeSlsDetector(id); + } + } + } + return thisMultiDetector->numberOfDetectors; }; - - - -int multiSlsDetector::removeSlsDetector(int pos) { - int j; +int multiSlsDetector::removeSlsDetector(int pos) +{ + int j; #ifdef VERBOSE - cout << "Removing detector in position " << pos << endl; + cout << "Removing detector in position " << pos << endl; #endif - int mi=0, ma=thisMultiDetector->numberOfDetectors, single=0; + int mi = 0, ma = thisMultiDetector->numberOfDetectors, single = 0; - if (pos>=0) { - mi=pos; - ma=pos+1; - single=1; - } - - // if (pos<0 ) - // pos=thisMultiDetector->numberOfDetectors-1; - - if (pos>=thisMultiDetector->numberOfDetectors) - return thisMultiDetector->numberOfDetectors; - - //j=pos; - for (j=mi; jdataBytes-=detectors[j]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels-=detectors[j]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels-=detectors[j]->getTotalNumberOfChannels(); - thisMultiDetector->maxNumberOfChannels-=detectors[j]->getMaxNumberOfChannels(); - - delete detectors[j]; - detectors[j]=0; - --thisMultiDetector->numberOfDetectors; - - - if (single) { - for (int i=j+1; inumberOfDetectors+1; ++i) { - detectors[i-1]=detectors[i]; - thisMultiDetector->detectorIds[i-1]=thisMultiDetector->detectorIds[i]; - } - detectors[thisMultiDetector->numberOfDetectors]=NULL; - thisMultiDetector->detectorIds[thisMultiDetector->numberOfDetectors]=-1; - } + if (pos >= 0) { + mi = pos; + ma = pos + 1; + single = 1; } - } - updateOffsets(); - if(createThreadPool() == FAIL) - exit(-1); + // if (pos<0 ) + // pos=thisMultiDetector->numberOfDetectors-1; - return thisMultiDetector->numberOfDetectors; + if (pos >= thisMultiDetector->numberOfDetectors) + return thisMultiDetector->numberOfDetectors; + + //j=pos; + for (j = mi; j < ma; ++j) { + + if (detectors[j]) { + + thisMultiDetector->dataBytes -= detectors[j]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels -= detectors[j]->getDataBytesInclGapPixels(); + thisMultiDetector->numberOfChannels -= detectors[j]->getTotalNumberOfChannels(); + thisMultiDetector->maxNumberOfChannels -= detectors[j]->getMaxNumberOfChannels(); + + delete detectors[j]; + detectors[j] = 0; + --thisMultiDetector->numberOfDetectors; + + if (single) { + for (int i = j + 1; i < thisMultiDetector->numberOfDetectors + 1; ++i) { + detectors[i - 1] = detectors[i]; + thisMultiDetector->detectorIds[i - 1] = thisMultiDetector->detectorIds[i]; + } + detectors[thisMultiDetector->numberOfDetectors] = NULL; + thisMultiDetector->detectorIds[thisMultiDetector->numberOfDetectors] = -1; + } + } + } + + updateOffsets(); + if (createThreadPool() == FAIL) + exit(-1); + + return thisMultiDetector->numberOfDetectors; } +int multiSlsDetector::setMaster(int i) +{ - - - - - - -int multiSlsDetector::setMaster(int i) { - - int ret=-1, slave=0; - masterFlags f; + int ret = -1, slave = 0; + masterFlags f; #ifdef VERBOSE - cout << "settin master in position " << i << endl; + cout << "settin master in position " << i << endl; #endif - if (i>=0 && inumberOfDetectors) { - if (detectors[i]) { + if (i >= 0 && i < thisMultiDetector->numberOfDetectors) { + if (detectors[i]) { #ifdef VERBOSE - cout << "detector position " << i << " "; + cout << "detector position " << i << " "; #endif - thisMultiDetector->masterPosition=i; - detectors[i]->setMaster(IS_MASTER); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++id) { - if (i!=id) { - if (detectors[id]) { + thisMultiDetector->masterPosition = i; + detectors[i]->setMaster(IS_MASTER); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + } + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (i != id) { + if (detectors[id]) { #ifdef VERBOSE - cout << "detector position " << id << " "; + cout << "detector position " << id << " "; #endif - detectors[id]->setMaster(IS_SLAVE); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setMaster(IS_SLAVE); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + } + } - } - } + } else if (i == -2) { + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { +#ifdef VERBOSE + cout << "detector position " << id << " "; +#endif + detectors[id]->setMaster(NO_MASTER); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + } } - } else if (i==-2) { - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { + // check return value + + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { #ifdef VERBOSE - cout << "detector position " << id << " "; + cout << "detector position " << id << " "; #endif - detectors[id]->setMaster(NO_MASTER); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setMaster(GET_MASTER); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); - } + switch (f) { + case NO_MASTER: + if (ret != -1) + ret = -2; + break; + case IS_MASTER: + if (ret == -1) + ret = id; + else + ret = -2; + break; + case IS_SLAVE: + slave = 1; + break; + default: + ret = -2; + } + } } + if (slave > 0 && ret < 0) + ret = -2; - } + if (ret < 0) + ret = -1; - // check return value + thisMultiDetector->masterPosition = ret; - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { -#ifdef VERBOSE - cout << "detector position " << id << " "; -#endif - f=detectors[id]->setMaster(GET_MASTER); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<0 && ret<0) - ret=-2; - - if (ret<0) - ret=-1; - - thisMultiDetector->masterPosition=ret; - - return thisMultiDetector->masterPosition; + return thisMultiDetector->masterPosition; } // enum synchronyzationMode { @@ -1018,1029 +968,409 @@ int multiSlsDetector::setMaster(int i) { \param sync syncronization mode \returns current syncronization mode */ -slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchronizationMode sync) { +slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchronizationMode sync) +{ + synchronizationMode ret = GET_SYNCHRONIZATION_MODE, ret1 = GET_SYNCHRONIZATION_MODE; - synchronizationMode ret=GET_SYNCHRONIZATION_MODE, ret1=GET_SYNCHRONIZATION_MODE; - - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - ret1=detectors[id]->setSynchronization(sync); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++id) { + if (detectors[id]) { + ret1 = detectors[id]->setSynchronization(sync); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + if (id == 0) + ret = ret1; + else if (ret != ret1) + ret = GET_SYNCHRONIZATION_MODE; + } } - } - thisMultiDetector->syncMode=ret; - - return thisMultiDetector->syncMode; + thisMultiDetector->syncMode = ret; + return thisMultiDetector->syncMode; } +int multiSlsDetector::setOnline(int off) +{ -int multiSlsDetector::setOnline(int off) { + if (off != GET_ONLINE_FLAG) { + thisMultiDetector->onlineFlag = off; - if (off!=GET_ONLINE_FLAG) { - 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(&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)); + } + } + } - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setOnline, - detectors[idet],off,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<onlineFlag=ret; - } - return thisMultiDetector->onlineFlag; + thisMultiDetector->onlineFlag = ret; + } + return thisMultiDetector->onlineFlag; }; - - -string multiSlsDetector::checkOnline() { - string offlineDetectors = ""; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - string tmp = detectors[idet]->checkOnline(); - if(!tmp.empty()) - offlineDetectors += tmp + "+"; +string multiSlsDetector::checkOnline() +{ + string offlineDetectors = ""; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + string tmp = detectors[idet]->checkOnline(); + if (!tmp.empty()) + offlineDetectors += tmp + "+"; + } } - } - return offlineDetectors; + return offlineDetectors; } -int multiSlsDetector::activate(int const enable){ - int ret1=-100, ret; +int multiSlsDetector::activate(int const enable) +{ + int ret1 = -100, ret; - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->activate(enable); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->activate(enable); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = -1; + } + } - return ret1; + return ret1; } - - -int multiSlsDetector::exists() { - return thisMultiDetector->alreadyExisting; +int multiSlsDetector::exists() +{ + return thisMultiDetector->alreadyExisting; } - - - // Initialization functions +int multiSlsDetector::getThresholdEnergy(int pos) +{ + int i, posmin, posmax; + int ret1 = -100, ret; - - -int multiSlsDetector::getThresholdEnergy(int pos) { - - - int i, posmin, posmax; - int ret1=-100, ret; - - if (pos<0) { - posmin=0; - posmax=thisMultiDetector->numberOfDetectors; - } else { - posmin=pos; - posmax=pos+1; - } - - for (i=posmin; igetThresholdEnergy(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<(ret1+200)) - ret1=-1; - + if (pos < 0) { + posmin = 0; + posmax = thisMultiDetector->numberOfDetectors; + } else { + posmin = pos; + posmax = pos + 1; } - } - thisMultiDetector->currentThresholdEV=ret1; - return ret1; - - -} - - -int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings, int tb) { - - int posmin, posmax; - int ret=-100; - if (pos<0) { - posmin=0; - posmax=thisMultiDetector->numberOfDetectors; - } else { - posmin=pos; - posmax=pos+1; - } - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - }else{ - //return storage values - int* iret[posmax-posmin]; - for(int idet=posmin; idet(&slsDetector::setThresholdEnergy, - detectors[idet],e_eV,-1,isettings,tb,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idet(ret+200)) - ret=-1; - delete iret[idet]; - }else ret=-1; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<currentThresholdEV=ret; - return ret; -} - - - - -slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) { - - int posmin, posmax; - int ret=-100; - - if (pos<0) { - posmin=0; - posmax=thisMultiDetector->numberOfDetectors; - } else { - posmin=pos; - posmax=pos+1; - } - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return GET_SETTINGS; - }else{ - //return storage values - detectorSettings* iret[posmax-posmin]; - for(int idet=posmin; idet(&slsDetector::getSettings, - detectors[idet],-1,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<currentSettings=(detectorSettings)ret; - return (detectorSettings)ret; -} - -slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings isettings, int pos) { - - int posmin, posmax; - int ret=-100; - - if (pos<0) { - posmin=0; - posmax=thisMultiDetector->numberOfDetectors; - } else { - posmin=pos; - posmax=pos+1; - } - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return GET_SETTINGS; - }else{ - //return storage values - detectorSettings* iret[posmax-posmin]; - for(int idet=posmin; idet(&slsDetector::setSettings, - detectors[idet],isettings,-1,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<currentSettings=(detectorSettings)ret; - return (detectorSettings)ret; - -} - - - -int multiSlsDetector::getChanRegs(double* retval,bool fromDetector){ - //nChansDet and currentNumChans is because of varying channel size per detector - int n = thisMultiDetector->numberOfChannels,nChansDet,currentNumChans=0; - double retval1[n]; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - // cout << "det " << idet << endl; - nChansDet = detectors[idet]->getChanRegs(retval1,fromDetector); - // cout << "returned" << endl; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getThresholdEnergy(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret < (ret1 - 200) || ret > (ret1 + 200)) + ret1 = -1; + } } - } - return n; + thisMultiDetector->currentThresholdEV = ret1; + return ret1; } - - - - - - - - - - - - - - - - - - -/* Communication to server */ - -int multiSlsDetector::prepareAcquisition(){ - - int i=0; - int ret=OK; - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax-posmin]; - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::prepareAcquisition, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->prepareAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - i=thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->cleanupAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::cleanupAcquisition, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax-posmin]; - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startAcquisition, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->startAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - i=thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->stopAcquisition(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::stopAcquisition, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (i>=0) { - if (detectors[i]) { - ret=detectors[i]->startReadOut(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->startReadOut(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<dataBytes/sizeof(int); - int n = 0; - int* retval= NULL; - int *retdet, *p=retval; - int nodatadet=-1; - int nodatadetectortype = false; - detectorType types = getDetectorsType(); - if(types == EIGER || types == JUNGFRAU){ - nodatadetectortype = true; - } - - if(!nodatadetectortype) - retval=new int[nel]; - p=retval; - // cout << "multi: " << thisMultiDetector->dataBytes << endl; - - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - retdet=detectors[id]->getDataFromDetector(p); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getDataBytes(); - if (retdet) {; -#ifdef VERBOSE - cout << "Detector " << id << " returned " << n << " bytes " << endl; -#endif - } else { - nodatadet=id; -#ifdef VERBOSE - cout << "Detector " << id << " does not have data left " << endl; -#endif - } - p+=n/sizeof(int); - } - } - } - - //eiger returns only null - if(nodatadetectortype){ - return NULL; - } - - if (nodatadet>=0) { - for (int id=0; idnumberOfDetectors; ++id) { - if (id!=nodatadet) { - if (detectors[id]) { -//#ifdef VERBOSE - cout << "Stopping detector "<< id << endl; -//#endif - detectors[id]->stopAcquisition(); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getDataFromDetector())) { - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) - setErrorMask(getErrorMask()|(1<dataBytes/sizeof(int); - int n; - int* retval=new int[nel]; - int *retdet, *p=retval; - - /** probably it's always better to have one integer per channel in any case! */ - - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - retdet=detectors[id]->readFrame(); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getDataBytes(); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<onlineFlag==ONLINE_FLAG) { - - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - detectors[id]->readAllNoWait(); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++id) { - if (detectors[id]) { - detectors[id]->disconnectControl(); - } +int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings, int tb) +{ + + int posmin, posmax; + int ret = -100; + if (pos < 0) { + posmin = 0; + posmax = thisMultiDetector->numberOfDetectors; + } else { + posmin = pos; + posmax = pos + 1; } - } - -#ifdef VERBOSE - std::cout<< "received "<< i<< " frames" << std::endl; - //#else - // std::cout << std::endl; -#endif - return dataQueueFront(); // check what we return! - -}; - -int* multiSlsDetector::startAndReadAll(){ - - /** Thread for each detector?!?!?! */ -#ifdef VERBOSE - cout << "Start and read all " << endl; -#endif - - - int* retval; - int i=0; - if (thisMultiDetector->onlineFlag==ONLINE_FLAG) { - - if (getDetectorsType() == EIGER) { - if (prepareAcquisition() == FAIL) - return NULL; - } - startAndReadAllNoWait(); - - while ((retval=getDataFromDetector())){ - ++i; -#ifdef VERBOSE - std::cout<< i << std::endl; - //#else - //std::cout << "-" << flush; -#endif - dataQueue.push(retval); - } - - for (int id=0; idnumberOfDetectors; ++id) { - if (detectors[id]) { - detectors[id]->disconnectControl(); - } - } - - } - -#ifdef VERBOSE - std::cout<< "MMMM recieved "<< i<< " frames" << std::endl; - //#else - // std::cout << std::endl; -#endif - return dataQueueFront(); // check what we return! - - -}; - - -int multiSlsDetector::startAndReadAllNoWait(){ - pthread_mutex_lock(&mg); // locks due to processing thread using threadpool when in use - int i=0; - int ret=OK; - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax-posmin]; - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startAndReadAllNoWait, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->startAndReadAllNoWait(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition>=0) - if (detectors[thisMultiDetector->masterPosition]){ - s = detectors[thisMultiDetector->masterPosition]->getRunStatus(); - if(detectors[thisMultiDetector->masterPosition]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition)); - return s; - } - - for (int i=0; inumberOfDetectors; ++i) { - s1=detectors[i]->getRunStatus(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int64_t(-1); - Task* task = new Task(new func2_t(&slsDetector::setTimer, - detectors[idet],index,t,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<timerValue[index]=ret; - return ret; -} - - - - -int64_t multiSlsDetector::getTimeLeft(timerIndex index){ - int i; - int64_t ret1=-100, ret; - - - if (thisMultiDetector->masterPosition>=0) - if (detectors[thisMultiDetector->masterPosition]){ - ret1 = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index); - if(detectors[thisMultiDetector->masterPosition]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition)); - return ret1; - } - - for (i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->getTimeLeft(index); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setStoragecellStart, - detectors[idet],pos,iret[idet])); + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func4_t(&slsDetector::setThresholdEnergy, + detectors[idet], e_eV, -1, isettings, tb, iret[idet])); threadpool->add_task(task); } } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - if (ret==-100) - ret=*iret[idet]; - else if (ret!=*iret[idet]) - ret=-1; + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (ret == -100) + ret = *iret[idet]; + else if (*iret[idet] < (ret - 200) || *iret[idet] > (ret + 200)) + ret = -1; delete iret[idet]; - }else ret=-1; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + thisMultiDetector->currentThresholdEV = ret; + return ret; +} + +slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) +{ + + int posmin, posmax; + int ret = -100; + + if (pos < 0) { + posmin = 0; + posmax = thisMultiDetector->numberOfDetectors; + } else { + posmin = pos; + posmax = pos + 1; + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return GET_SETTINGS; + } else { + //return storage values + detectorSettings* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new detectorSettings(GET_SETTINGS); + Task* task = new Task(new func1_t(&slsDetector::getSettings, + detectors[idet], -1, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (ret == -100) + ret = *iret[idet]; + else if (ret != *iret[idet]) + ret = GET_SETTINGS; + delete iret[idet]; + } else + ret = GET_SETTINGS; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + thisMultiDetector->currentSettings = (detectorSettings)ret; + return (detectorSettings)ret; +} + +slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings isettings, int pos) +{ + + int posmin, posmax; + int ret = -100; + + if (pos < 0) { + posmin = 0; + posmax = thisMultiDetector->numberOfDetectors; + } else { + posmin = pos; + posmax = pos + 1; + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return GET_SETTINGS; + } else { + //return storage values + detectorSettings* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new detectorSettings(GET_SETTINGS); + Task* task = new Task(new func2_t(&slsDetector::setSettings, + detectors[idet], isettings, -1, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (ret == -100) + ret = *iret[idet]; + else if (ret != *iret[idet]) + ret = GET_SETTINGS; + delete iret[idet]; + } else + ret = GET_SETTINGS; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + thisMultiDetector->currentSettings = (detectorSettings)ret; + return (detectorSettings)ret; +} + +int multiSlsDetector::getChanRegs(double* retval, bool fromDetector) +{ + //nChansDet and currentNumChans is because of varying channel size per detector + int n = thisMultiDetector->numberOfChannels, nChansDet, currentNumChans = 0; + double retval1[n]; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + // cout << "det " << idet << endl; + nChansDet = detectors[idet]->getChanRegs(retval1, fromDetector); + // cout << "returned" << endl; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + // cout << "memcopy "<< currentNumChans << " " << nChansDet << "(" << n << ")" << endl; + + memcpy(retval + (currentNumChans), retval1, nChansDet * sizeof(double)); + currentNumChans += nChansDet; + // cout << "Done" << endl; + } + } + return n; +} + +/* Communication to server */ + +int multiSlsDetector::prepareAcquisition() +{ + + int i = 0; + int ret = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::prepareAcquisition, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + //master + int ret1 = OK; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->prepareAcquisition(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + + return ret; +} + +int multiSlsDetector::cleanupAcquisition() +{ + int i = 0; + int ret = OK, ret1 = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->cleanupAcquisition(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::cleanupAcquisition, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); } } } @@ -2048,471 +1378,1025 @@ int multiSlsDetector::setStoragecellStart(int pos) { return ret; } -int multiSlsDetector::setSpeed(speedVariable index, int value){ - int i; - int ret1=-100, ret; +// Acquisition functions +/* change these funcs accepting also ok/fail */ - for (i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->setSpeed(index,value); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; -} - - - - -int multiSlsDetector::getDataBytes(){ - int n_bytes = 0; - for (int ip=0; ipnumberOfDetectors; ++ip) { - if (detectors[ip]) - n_bytes += detectors[ip]->getDataBytes(); - } - return n_bytes; -} - - - - - - -// Flags -int multiSlsDetector::setDynamicRange(int n, int pos){ - - // cout << "multi " << endl; - int imi, ima, i; - int ret, ret1=-100; - - if (pos<0) { - imi=0; - ima=thisMultiDetector->numberOfDetectors; - } else { - imi=pos; - ima=pos+1; - } - - for (i=imi; idataBytes-=detectors[i]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels-=detectors[i]->getDataBytesInclGapPixels(); - ret=detectors[i]->setDynamicRange(n); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<dataBytes+=detectors[i]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels+=detectors[i]->getDataBytesInclGapPixels(); + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::startAcquisition, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } } - } - //for usability for the user - if (getDetectorsType() == EIGER){ - if(n == 32){ - std::cout << "Setting Clock to Quarter Speed to cope with Dynamic Range of 32" << std::endl; - setSpeed(CLOCK_DIVIDER,2); - } - else if(n == 16){ - std::cout << "Setting Clock to Half Speed for Dynamic Range of 16" << std::endl; - setSpeed(CLOCK_DIVIDER,1); - } - if (n != -1) - updateOffsets(); - } - - return thisMultiDetector->dataBytes; + //master + int ret1 = OK; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->startAcquisition(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + return ret; }; +int multiSlsDetector::stopAcquisition() +{ + pthread_mutex_lock(&mg); // locks due to processing thread using threadpool when in use + int i = 0; + int ret = OK, ret1 = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->stopAcquisition(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } - -void multiSlsDetector::verifyMinMaxROI(int n, ROI r[]){ - int temp; - for(int i=0;inumberOfDetectors;++i){ - if (detectors[i]) { - //check x offset range - if ((offsetX >= thisMultiDetector->offsetX[i]) && (offsetX < (thisMultiDetector->offsetX[i]+detectors[i]->getMaxNumberOfChannelsInclGapPixels(X)))){ - if(offsetY==-1){ - channelX = offsetX - thisMultiDetector->offsetX[i]; - return i; - }else{ - //check y offset range - if((offsetY >= thisMultiDetector->offsetY[i]) && (offsetY< (thisMultiDetector->offsetY[i]+detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y)))){ - channelX = offsetX - thisMultiDetector->offsetX[i]; - channelY = offsetY - thisMultiDetector->offsetY[i]; - return i; - } - } - } - } - } - return -1; -} - - -int multiSlsDetector::setROI(int n,ROI roiLimits[]){ - int ret1=-100,ret; - int i,xmin,xmax,ymin,ymax,channelX,channelY,idet,lastChannelX,lastChannelY,index,offsetX,offsetY; - bool invalidroi=false; - int ndet = thisMultiDetector->numberOfDetectors; - ROI allroi[ndet][n]; - int nroi[ndet]; - for(i=0;igetMaxNumberOfChannelsInclGapPixels(X))-1; - lastChannelY = (detectors[idet]->getMaxNumberOfChannelsInclGapPixels(Y))-1; - - offsetX = thisMultiDetector->offsetX[idet]; - offsetY = thisMultiDetector->offsetY[idet]; - //at the end in x dir - if ((offsetX + lastChannelX) >= xmax) - lastChannelX = xmax - offsetX; - //at the end in y dir - if ((offsetY + lastChannelY) >= ymax) - lastChannelY = ymax - offsetY; - -#ifdef VERBOSE - cout<<"lastChannelX:"<numberOfDetectors;++i){ - cout<<"detector "<numberOfDetectors; ++i) { - if (detectors[i]){ -#ifdef VERBOSE - cout << "detector " << i << ":" << endl; -#endif - ret = detectors[i]->setROI(nroi[i],allroi[i]); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - int maxroi = ndet*MAX_ROIS; - ROI temproi; - ROI roiLimits[maxroi]; - ROI* retval = new ROI[maxroi]; - ROI* temp=0; - int index=0; - - //get each detector's roi array - for (i=0; inumberOfDetectors; ++i){ - if (detectors[i]){ - temp = detectors[i]->getROI(index); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<offsetX[i]; - roiLimits[n].xmax = temp[j].xmax + thisMultiDetector->offsetX[i]; - roiLimits[n].ymin = temp[j].ymin + thisMultiDetector->offsetY[i]; - roiLimits[n].ymax = temp[j].ymin + thisMultiDetector->offsetY[i]; - ++n; - } - } - } - } - - - - //empty roi - if (!n) return NULL; - - - -#ifdef VERBOSE - cout<<"ROI :"<getDetectorsType()==JUNGFRAUCTB) { - nn=thisMultiDetector->dataBytes/2; - dataout=new double[nn]; + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; } else { - nn=thisMultiDetector->numberOfChannels; - dataout=new double[nn]; + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::stopAcquisition, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } } - } - // int ich=0; - int n; - double *detp=dataout; - int *datap=datain; + *stoppedFlag = 1; + pthread_mutex_unlock(&mg); + return ret; +}; - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - detectors[i]->decodeData(datap, n, detp); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getDataBytes()/sizeof(int); - detp+=n; - // if (detectors[0]->getDetectorsType()==JUNGFRAUCTB) { - // detp+=detectors[i]->getDataBytes()/2; - // } else { - // detp+=detectors[i]->getTotalNumberOfChannels(); - // } -#ifdef VERBOSE - cout << "done " << endl; -#endif - // for (int j=0; jgetTotalNumberOfChannels(); ++j) { - // dataout[ich]=detp[j]; - // ++ich; - // } - //delete [] detp; +int multiSlsDetector::startReadOut() +{ + + int i = 0; + int ret = OK, ret1 = OK; + i = thisMultiDetector->masterPosition; + if (i >= 0) { + if (detectors[i]) { + ret = detectors[i]->startReadOut(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret != OK) + ret1 = FAIL; + } + } + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->startReadOut(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret != OK) + ret1 = FAIL; + } } - } + return ret1; +}; - return dataout; +int* multiSlsDetector::getDataFromDetector() +{ + + int nel = thisMultiDetector->dataBytes / sizeof(int); + int n = 0; + int* retval = NULL; + int *retdet, *p = retval; + int nodatadet = -1; + int nodatadetectortype = false; + detectorType types = getDetectorsType(); + if (types == EIGER || types == JUNGFRAU) { + nodatadetectortype = true; + } + + if (!nodatadetectortype) + retval = new int[nel]; + p = retval; + // cout << "multi: " << thisMultiDetector->dataBytes << endl; + + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + retdet = detectors[id]->getDataFromDetector(p); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + if (!nodatadetectortype) { + n = detectors[id]->getDataBytes(); + if (retdet) { + ; +#ifdef VERBOSE + cout << "Detector " << id << " returned " << n << " bytes " << endl; +#endif + } else { + nodatadet = id; +#ifdef VERBOSE + cout << "Detector " << id << " does not have data left " << endl; +#endif + } + p += n / sizeof(int); + } + } + } + + //eiger returns only null + if (nodatadetectortype) { + return NULL; + } + + if (nodatadet >= 0) { + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (id != nodatadet) { + if (detectors[id]) { + //#ifdef VERBOSE + cout << "Stopping detector " << id << endl; + //#endif + detectors[id]->stopAcquisition(); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + + while ((retdet = detectors[id]->getDataFromDetector())) { + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + +#ifdef VERBOSE + cout << "Detector " << id << " still sent data " << endl; +#endif + delete[] retdet; + } + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + } + } + delete[] retval; + return NULL; + } + + return retval; +}; + +int* multiSlsDetector::readFrame() +{ + int nel = thisMultiDetector->dataBytes / sizeof(int); + int n; + int* retval = new int[nel]; + int *retdet, *p = retval; + + /** probably it's always better to have one integer per channel in any case! */ + + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + retdet = detectors[id]->readFrame(); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + if (retdet) { + n = detectors[id]->getDataBytes(); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + memcpy(p, retdet, n); + delete[] retdet; + p += n / sizeof(int); + } else { +#ifdef VERBOSE + cout << "Detector " << id << " does not have data left " << endl; +#endif + delete[] retval; + return NULL; + } + } + } + dataQueue.push(retval); + return retval; +}; + +int* multiSlsDetector::readAll() +{ + + /** Thread for each detector?!?!?! */ + + // int fnum=F_READ_ALL; + int* retval; // check what we return! + // int ret=OK, ret1=OK; + + int i = 0; +#ifdef VERBOSE + std::cout << "Reading all frames " << std::endl; +#endif + if (thisMultiDetector->onlineFlag == ONLINE_FLAG) { + + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + detectors[id]->readAllNoWait(); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + } + while ((retval = getDataFromDetector())) { + ++i; +#ifdef VERBOSE + std::cout << i << std::endl; + //#else + //std::cout << "-" << flush; +#endif + dataQueue.push(retval); + } + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + detectors[id]->disconnectControl(); + } + } + } + +#ifdef VERBOSE + std::cout << "received " << i << " frames" << std::endl; + //#else + // std::cout << std::endl; +#endif + return dataQueueFront(); // check what we return! +}; + +int* multiSlsDetector::startAndReadAll() +{ + + /** Thread for each detector?!?!?! */ +#ifdef VERBOSE + cout << "Start and read all " << endl; +#endif + + int* retval; + int i = 0; + if (thisMultiDetector->onlineFlag == ONLINE_FLAG) { + + if (getDetectorsType() == EIGER) { + if (prepareAcquisition() == FAIL) + return NULL; + } + startAndReadAllNoWait(); + + while ((retval = getDataFromDetector())) { + ++i; +#ifdef VERBOSE + std::cout << i << std::endl; + //#else + //std::cout << "-" << flush; +#endif + dataQueue.push(retval); + } + + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) { + if (detectors[id]) { + detectors[id]->disconnectControl(); + } + } + } + +#ifdef VERBOSE + std::cout << "MMMM recieved " << i << " frames" << std::endl; + //#else + // std::cout << std::endl; +#endif + return dataQueueFront(); // check what we return! +}; + +int multiSlsDetector::startAndReadAllNoWait() +{ + pthread_mutex_lock(&mg); // locks due to processing thread using threadpool when in use + int i = 0; + int ret = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::startAndReadAllNoWait, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + //master + int ret1 = OK; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->startAndReadAllNoWait(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + pthread_mutex_unlock(&mg); + return ret; +} + +/** + get run status + \returns status mask +*/ +slsDetectorDefs::runStatus multiSlsDetector::getRunStatus() +{ + + runStatus s = IDLE, s1 = IDLE; + if (thisMultiDetector->masterPosition >= 0) + if (detectors[thisMultiDetector->masterPosition]) { + s = detectors[thisMultiDetector->masterPosition]->getRunStatus(); + if (detectors[thisMultiDetector->masterPosition]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition)); + return s; + } + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + s1 = detectors[i]->getRunStatus(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (s1 == ERROR) { + return ERROR; + } + if (s1 != IDLE) + s = s1; + // if (s1==IDLE && s!=IDLE) + // s=ERROR; + } + return s; +} + +int* multiSlsDetector::popDataQueue() +{ + int* retval = NULL; + if (!dataQueue.empty()) { + retval = dataQueue.front(); + dataQueue.pop(); + } + return retval; +} + +detectorData* multiSlsDetector::popFinalDataQueue() +{ + detectorData* retval = NULL; + if (!finalDataQueue.empty()) { + retval = finalDataQueue.front(); + finalDataQueue.pop(); + } + return retval; +} + +void multiSlsDetector::resetDataQueue() +{ + int* retval = NULL; + while (!dataQueue.empty()) { + retval = dataQueue.front(); + dataQueue.pop(); + delete[] retval; + } +} + +void multiSlsDetector::resetFinalDataQueue() +{ + detectorData* retval = NULL; + while (!finalDataQueue.empty()) { + retval = finalDataQueue.front(); + finalDataQueue.pop(); + delete retval; + } +} + +int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t) +{ + + int64_t ret = -100; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + //return storage values + int64_t* iret[thisMultiDetector->numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int64_t(-1); + Task* task = new Task(new func2_t(&slsDetector::setTimer, + detectors[idet], index, t, 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)); + } + } + } + + if (index == SAMPLES_JCTB) + setDynamicRange(); + + thisMultiDetector->timerValue[index] = ret; + return ret; +} + +int64_t multiSlsDetector::getTimeLeft(timerIndex index) +{ + int i; + int64_t ret1 = -100, ret; + + if (thisMultiDetector->masterPosition >= 0) + if (detectors[thisMultiDetector->masterPosition]) { + ret1 = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index); + if (detectors[thisMultiDetector->masterPosition]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition)); + return ret1; + } + + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->getTimeLeft(index); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = -1; + } + } + + return ret1; +} + +int multiSlsDetector::setStoragecellStart(int pos) +{ + 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(&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 i; + int ret1 = -100, ret; + + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->setSpeed(index, value); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = FAIL; + } + } + + return ret1; +} + +int multiSlsDetector::getDataBytes() +{ + int n_bytes = 0; + for (int ip = 0; ip < thisMultiDetector->numberOfDetectors; ++ip) { + if (detectors[ip]) + n_bytes += detectors[ip]->getDataBytes(); + } + return n_bytes; +} + +// Flags +int multiSlsDetector::setDynamicRange(int n, int pos) +{ + + // cout << "multi " << endl; + int imi, ima, i; + int ret, ret1 = -100; + + if (pos < 0) { + imi = 0; + ima = thisMultiDetector->numberOfDetectors; + } else { + imi = pos; + ima = pos + 1; + } + + for (i = imi; i < ima; ++i) { + // cout << "multi ************ detector " << i << endl; + + if (detectors[i]) { + thisMultiDetector->dataBytes -= detectors[i]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels -= detectors[i]->getDataBytesInclGapPixels(); + ret = detectors[i]->setDynamicRange(n); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = FAIL; + thisMultiDetector->dataBytes += detectors[i]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels(); + } + } + + //for usability for the user + if (getDetectorsType() == EIGER) { + if (n == 32) { + std::cout << "Setting Clock to Quarter Speed to cope with Dynamic Range of 32" << std::endl; + setSpeed(CLOCK_DIVIDER, 2); + } else if (n == 16) { + std::cout << "Setting Clock to Half Speed for Dynamic Range of 16" << std::endl; + setSpeed(CLOCK_DIVIDER, 1); + } + if (n != -1) + updateOffsets(); + } + + return thisMultiDetector->dataBytes; +}; + +void multiSlsDetector::verifyMinMaxROI(int n, ROI r[]) +{ + int temp; + for (int i = 0; i < n; ++i) { + if ((r[i].xmax) < (r[i].xmin)) { + temp = r[i].xmax; + r[i].xmax = r[i].xmin; + r[i].xmin = temp; + } + if ((r[i].ymax) < (r[i].ymin)) { + temp = r[i].ymax; + r[i].ymax = r[i].ymin; + r[i].ymin = temp; + } + } +} + +int multiSlsDetector::decodeNChannel(int offsetX, int offsetY, int& channelX, int& channelY) +{ + channelX = -1; + channelY = -1; + //loop over + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + //check x offset range + if ((offsetX >= thisMultiDetector->offsetX[i]) && (offsetX < (thisMultiDetector->offsetX[i] + detectors[i]->getMaxNumberOfChannelsInclGapPixels(X)))) { + if (offsetY == -1) { + channelX = offsetX - thisMultiDetector->offsetX[i]; + return i; + } else { + //check y offset range + if ((offsetY >= thisMultiDetector->offsetY[i]) && (offsetY < (thisMultiDetector->offsetY[i] + detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y)))) { + channelX = offsetX - thisMultiDetector->offsetX[i]; + channelY = offsetY - thisMultiDetector->offsetY[i]; + return i; + } + } + } + } + } + return -1; +} + +int multiSlsDetector::setROI(int n, ROI roiLimits[]) +{ + int ret1 = -100, ret; + int i, xmin, xmax, ymin, ymax, channelX, channelY, idet, lastChannelX, lastChannelY, index, offsetX, offsetY; + bool invalidroi = false; + int ndet = thisMultiDetector->numberOfDetectors; + ROI allroi[ndet][n]; + int nroi[ndet]; + for (i = 0; i < ndet; ++i) + nroi[i] = 0; + + if ((n < 0) || (roiLimits == NULL)) + return FAIL; + + //ensures min < max + verifyMinMaxROI(n, roiLimits); +#ifdef VERBOSE + cout << "Setting ROI for " << n << "rois:" << endl; + for (i = 0; i < n; ++i) + cout << i << ":" << roiLimits[i].xmin << "\t" << roiLimits[i].xmax << "\t" << roiLimits[i].ymin << "\t" << roiLimits[i].ymax << endl; +#endif + //for each roi + for (i = 0; i < n; ++i) { + xmin = roiLimits[i].xmin; + xmax = roiLimits[i].xmax; + ymin = roiLimits[i].ymin; + ymax = roiLimits[i].ymax; + + //check roi max values + idet = decodeNChannel(xmax, ymax, channelX, channelY); +#ifdef VERBOSE + cout << "Decoded Channel max vals: " << endl; + cout << "det:" << idet << "\t" << xmax << "\t" << ymax << "\t" << channelX << "\t" << channelY << endl; +#endif + if (idet == -1) { + cout << "invalid roi" << endl; + continue; + } + + //split in x dir + while (xmin <= xmax) { + invalidroi = false; + ymin = roiLimits[i].ymin; + //split in y dir + while (ymin <= ymax) { + //get offset for each detector + idet = decodeNChannel(xmin, ymin, channelX, channelY); +#ifdef VERBOSE + cout << "Decoded Channel min vals: " << endl; + cout << "det:" << idet << "\t" << xmin << "\t" << ymin << "\t" << channelX << "\t" << channelY << endl; +#endif + if (idet == -1) { + cout << "invalid roi" << endl; + invalidroi = true; + break; + } + if (detectors[idet]) { + //get last channel for each det in x and y dir + lastChannelX = (detectors[idet]->getMaxNumberOfChannelsInclGapPixels(X)) - 1; + lastChannelY = (detectors[idet]->getMaxNumberOfChannelsInclGapPixels(Y)) - 1; + + offsetX = thisMultiDetector->offsetX[idet]; + offsetY = thisMultiDetector->offsetY[idet]; + //at the end in x dir + if ((offsetX + lastChannelX) >= xmax) + lastChannelX = xmax - offsetX; + //at the end in y dir + if ((offsetY + lastChannelY) >= ymax) + lastChannelY = ymax - offsetY; + +#ifdef VERBOSE + cout << "lastChannelX:" << lastChannelX << "\t" + << "lastChannelY:" << lastChannelY << endl; +#endif + + //creating the list of roi for corresponding detector + index = nroi[idet]; + allroi[idet][index].xmin = channelX; + allroi[idet][index].xmax = lastChannelX; + allroi[idet][index].ymin = channelY; + allroi[idet][index].ymax = lastChannelY; + nroi[idet] = nroi[idet] + 1; + + ymin = lastChannelY + offsetY + 1; + if ((lastChannelY + offsetY) == ymax) + ymin = ymax + 1; + +#ifdef VERBOSE + cout << "nroi[idet]:" << nroi[idet] << "\tymin:" << ymin << endl; +#endif + } + } + if (invalidroi) + break; + + xmin = lastChannelX + offsetX + 1; + if ((lastChannelX + offsetX) == xmax) + xmin = xmax + 1; + } + } + +#ifdef VERBOSE + cout << "Setting ROI :" << endl; + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + cout << "detector " << i << endl; + for (int j = 0; j < nroi[i]; ++j) { + cout << allroi[i][j].xmin << "\t" << allroi[i][j].xmax << "\t" << allroi[i][j].ymin << "\t" << allroi[i][j].ymax << endl; + } + } +#endif + + //settings the rois for each detector + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { +#ifdef VERBOSE + cout << "detector " << i << ":" << endl; +#endif + ret = detectors[i]->setROI(nroi[i], allroi[i]); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else + ret1 = FAIL; + } + } + + return ret1; +} + +slsDetectorDefs::ROI* multiSlsDetector::getROI(int& n) +{ + + n = 0; + int num = 0, i, j; + int ndet = thisMultiDetector->numberOfDetectors; + int maxroi = ndet * MAX_ROIS; + ROI temproi; + ROI roiLimits[maxroi]; + ROI* retval = new ROI[maxroi]; + ROI* temp = 0; + int index = 0; + + //get each detector's roi array + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + temp = detectors[i]->getROI(index); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + + if (temp) { + //#ifdef VERBOSE + if (index) + cout << "detector " << i << ":" << endl; + //#endif + for (j = 0; j < index; ++j) { + //#ifdef VERBOSE + cout << temp[j].xmin << "\t" << temp[j].xmax << "\t" << temp[j].ymin << "\t" << temp[j].ymax << endl; + //#endif + roiLimits[n].xmin = temp[j].xmin + thisMultiDetector->offsetX[i]; + roiLimits[n].xmax = temp[j].xmax + thisMultiDetector->offsetX[i]; + roiLimits[n].ymin = temp[j].ymin + thisMultiDetector->offsetY[i]; + roiLimits[n].ymax = temp[j].ymin + thisMultiDetector->offsetY[i]; + ++n; + } + } + } + } + + //empty roi + if (!n) + return NULL; + +#ifdef VERBOSE + cout << "ROI :" << endl; + for (int j = 0; j < n; ++j) { + cout << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t" << roiLimits[j].ymin << "\t" << roiLimits[j].ymax << endl; + } +#endif + + //combine all the adjacent rois in x direction + for (i = 0; i < n; ++i) { + //since the ones combined are replaced by -1 + if ((roiLimits[i].xmin) == -1) + continue; + for (j = i + 1; j < n; ++j) { + //since the ones combined are replaced by -1 + if ((roiLimits[j].xmin) == -1) + continue; + //if y values are same + if (((roiLimits[i].ymin) == (roiLimits[j].ymin)) && ((roiLimits[i].ymax) == (roiLimits[j].ymax))) { + //if adjacent, increase [i] range and replace all [j] with -1 + if ((roiLimits[i].xmax) + 1 == roiLimits[j].xmin) { + roiLimits[i].xmax = roiLimits[j].xmax; + roiLimits[j].xmin = -1; + roiLimits[j].xmax = -1; + roiLimits[j].ymin = -1; + roiLimits[j].ymax = -1; + } + //if adjacent, increase [i] range and replace all [j] with -1 + else if ((roiLimits[i].xmin) - 1 == roiLimits[j].xmax) { + roiLimits[i].xmin = roiLimits[j].xmin; + roiLimits[j].xmin = -1; + roiLimits[j].xmax = -1; + roiLimits[j].ymin = -1; + roiLimits[j].ymax = -1; + } + } + } + } + +#ifdef VERBOSE + cout << "Combined along x axis Getting ROI :" << endl; + cout << "detector " << i << endl; + for (int j = 0; j < n; ++j) { + cout << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t" << roiLimits[j].ymin << "\t" << roiLimits[j].ymax << endl; + } +#endif + + //combine all the adjacent rois in y direction + for (i = 0; i < n; ++i) { + //since the ones combined are replaced by -1 + if ((roiLimits[i].ymin) == -1) + continue; + for (j = i + 1; j < n; ++j) { + //since the ones combined are replaced by -1 + if ((roiLimits[j].ymin) == -1) + continue; + //if x values are same + if (((roiLimits[i].xmin) == (roiLimits[j].xmin)) && ((roiLimits[i].xmax) == (roiLimits[j].xmax))) { + //if adjacent, increase [i] range and replace all [j] with -1 + if ((roiLimits[i].ymax) + 1 == roiLimits[j].ymin) { + roiLimits[i].ymax = roiLimits[j].ymax; + roiLimits[j].xmin = -1; + roiLimits[j].xmax = -1; + roiLimits[j].ymin = -1; + roiLimits[j].ymax = -1; + } + //if adjacent, increase [i] range and replace all [j] with -1 + else if ((roiLimits[i].ymin) - 1 == roiLimits[j].ymax) { + roiLimits[i].ymin = roiLimits[j].ymin; + roiLimits[j].xmin = -1; + roiLimits[j].xmax = -1; + roiLimits[j].ymin = -1; + roiLimits[j].ymax = -1; + } + } + } + } + + // get rid of -1s + for (i = 0; i < n; ++i) { + if ((roiLimits[i].xmin) != -1) { + retval[num] = roiLimits[i]; + ++num; + } + } + //sort final roi + for (i = 0; i < num; ++i) { + for (j = i + 1; j < num; ++j) { + if (retval[j].xmin < retval[i].xmin) { + temproi = retval[i]; + retval[i] = retval[j]; + retval[j] = temproi; + } + } + } + n = num; + + cout << "\nxmin\txmax\tymin\tymax" << endl; + for (i = 0; i < n; ++i) + cout << retval[i].xmin << "\t" << retval[i].xmax << "\t" << retval[i].ymin << "\t" << retval[i].ymax << endl; + return retval; +} + +double* multiSlsDetector::decodeData(int* datain, int& nn, double* fdata) +{ + double* dataout; + + if (fdata) + dataout = fdata; + else { + if (detectors[0]->getDetectorsType() == JUNGFRAUCTB) { + nn = thisMultiDetector->dataBytes / 2; + dataout = new double[nn]; + } else { + nn = thisMultiDetector->numberOfChannels; + dataout = new double[nn]; + } + } + + // int ich=0; + int n; + double* detp = dataout; + int* datap = datain; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + detectors[i]->decodeData(datap, n, detp); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); +#ifdef VERBOSE + cout << "increment pointers " << endl; +#endif + datap += detectors[i]->getDataBytes() / sizeof(int); + detp += n; + // if (detectors[0]->getDetectorsType()==JUNGFRAUCTB) { + // detp+=detectors[i]->getDataBytes()/2; + // } else { + // detp+=detectors[i]->getTotalNumberOfChannels(); + // } +#ifdef VERBOSE + cout << "done " << endl; +#endif + // for (int j=0; jgetTotalNumberOfChannels(); ++j) { + // dataout[ich]=detp[j]; + // ++ich; + // } + //delete [] detp; + } + } + + return dataout; } //Correction @@ -2526,815 +2410,744 @@ double* multiSlsDetector::decodeData(int *datain, int &nn, double *fdata) { } */ - /////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// +int multiSlsDetector::setFlatFieldCorrection(string fname) +{ + double* data = new double[thisMultiDetector->numberOfChannels]; // xmed[thisMultiDetector->numberOfChannels]; + double* ffcoefficients = new double[thisMultiDetector->numberOfChannels]; + double* fferrors = new double[thisMultiDetector->numberOfChannels]; + // int nmed=0; + // int idet=0, ichdet=-1; + char ffffname[MAX_STR_LENGTH * 2]; + int nch; //nbad=0, + //int badlist[MAX_BADCHANS]; + //int im=0; - - - - - - - - - - - - -int multiSlsDetector::setFlatFieldCorrection(string fname){ - double* data = new double[thisMultiDetector->numberOfChannels];// xmed[thisMultiDetector->numberOfChannels]; - double* ffcoefficients = new double[thisMultiDetector->numberOfChannels]; - double*fferrors = new double[thisMultiDetector->numberOfChannels]; - // int nmed=0; - // int idet=0, ichdet=-1; - char ffffname[MAX_STR_LENGTH*2]; - int nch;//nbad=0, - //int badlist[MAX_BADCHANS]; - //int im=0; - - if (fname=="default") { - fname=string(thisMultiDetector->flatFieldFile); - } - - - thisMultiDetector->correctionMask&=~(1<correctionMask&=~(1<flatFieldFile,"none"); - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]){ - detectors[i]->setFlatFieldCorrection(NULL, NULL); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<flatFieldFile); } - } else { + + thisMultiDetector->correctionMask &= ~(1 << FLAT_FIELD_CORRECTION); + + if (fname == "") { #ifdef VERBOSE - std::cout<< "Setting flat field correction from file " << fname << std::endl; + std::cout << "disabling flat field correction" << std::endl; #endif - sprintf(ffffname,"%s/%s",thisMultiDetector->flatFieldDir,fname.c_str()); - nch=readDataFile(string(ffffname),data); - - if (nch>thisMultiDetector->numberOfChannels) - nch=thisMultiDetector->numberOfChannels; - - if (nch>0) { - - //???? bad ff chans? - int nm=getNMods(); - int chpm[nm]; - int mMask[nm]; - for (int i=0; i=0) { - strcpy(thisMultiDetector->flatFieldFile,fname.c_str()); - - - thisMultiDetector->correctionMask|=(1<correctionMask &= ~(1 << FLAT_FIELD_CORRECTION); + // strcpy(thisMultiDetector->flatFieldFile,"none"); + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + detectors[i]->setFlatFieldCorrection(NULL, NULL); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + } + } } else { - std::cout<< "Flat field from file " << fname << " is not valid " << nch << std::endl; - } +#ifdef VERBOSE + std::cout << "Setting flat field correction from file " << fname << std::endl; +#endif + sprintf(ffffname, "%s/%s", thisMultiDetector->flatFieldDir, fname.c_str()); + nch = readDataFile(string(ffffname), data); - } - return thisMultiDetector->correctionMask&(1< thisMultiDetector->numberOfChannels) + nch = thisMultiDetector->numberOfChannels; + + if (nch > 0) { + + //???? bad ff chans? + int nm = getNMods(); + int chpm[nm]; + int mMask[nm]; + for (int i = 0; i < nm; ++i) { + chpm[i] = getChansPerMod(i); + mMask[i] = i; + // cout << "multi chpm " << im << " " << chpm[im] << endl; + } + fillModuleMask(mMask); + // cout << "multi chpm0 " << chpm[0] << endl; + fillBadChannelMask(); + if ((postProcessingFuncs::calculateFlatField(&nm, chpm, mMask, badChannelMask, data, ffcoefficients, fferrors)) >= 0) { + strcpy(thisMultiDetector->flatFieldFile, fname.c_str()); + + thisMultiDetector->correctionMask |= (1 << FLAT_FIELD_CORRECTION); + + setFlatFieldCorrection(ffcoefficients, fferrors); + + } else + std::cout << "Calculated flat field from file " << fname << " is not valid " << nch << std::endl; + } else { + std::cout << "Flat field from file " << fname << " is not valid " << nch << std::endl; + } + } + return thisMultiDetector->correctionMask & (1 << FLAT_FIELD_CORRECTION); } -int multiSlsDetector::fillModuleMask(int *mM) { - int imod=0, off=0; - if (mM) { - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - for (int im=0; imgetNMods(); ++im) { - mM[imod]=im+off; - ++imod; - } - off+=detectors[i]->getMaxMods(); - } - - +int multiSlsDetector::fillModuleMask(int* mM) +{ + int imod = 0, off = 0; + if (mM) { + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + for (int im = 0; im < detectors[i]->getNMods(); ++im) { + mM[imod] = im + off; + ++imod; + } + off += detectors[i]->getMaxMods(); + } + } } - } - return getNMods(); + return getNMods(); } - - -int multiSlsDetector::setFlatFieldCorrection(double *corr, double *ecorr) { - int ichdet=0; - double *p, *ep; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - if (corr!=NULL) - p=corr+ichdet; - else - p=NULL; - if (ecorr!=NULL) - ep=ecorr+ichdet; - else - ep=NULL; - detectors[idet]->setFlatFieldCorrection(p, ep); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getTotalNumberOfChannels(); +int multiSlsDetector::setFlatFieldCorrection(double* corr, double* ecorr) +{ + int ichdet = 0; + double *p, *ep; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (corr != NULL) + p = corr + ichdet; + else + p = NULL; + if (ecorr != NULL) + ep = ecorr + ichdet; + else + ep = NULL; + detectors[idet]->setFlatFieldCorrection(p, ep); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + ichdet += detectors[idet]->getTotalNumberOfChannels(); + } } - } - return 0; + return 0; } - - - - - - - - -int multiSlsDetector::getFlatFieldCorrection(double *corr, double *ecorr) { - int ichdet=0; - double *p, *ep; - int ff=1, dff; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - if (corr!=NULL) - p=corr+ichdet; - else - p=NULL; - if (ecorr!=NULL) - ep=ecorr+ichdet; - else - ep=NULL; - dff=detectors[idet]->getFlatFieldCorrection(p, ep); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getTotalNumberOfChannels(); +int multiSlsDetector::getFlatFieldCorrection(double* corr, double* ecorr) +{ + int ichdet = 0; + double *p, *ep; + int ff = 1, dff; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (corr != NULL) + p = corr + ichdet; + else + p = NULL; + if (ecorr != NULL) + ep = ecorr + ichdet; + else + ep = NULL; + dff = detectors[idet]->getFlatFieldCorrection(p, ep); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (dff == 0) + ff = 0; + ichdet += detectors[idet]->getTotalNumberOfChannels(); + } } - } - return ff; + return ff; } - - - - - - - - - - - - - - -int multiSlsDetector::getNMods(){ - int nm=0; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - nm+=detectors[idet]->getNMods(); +int multiSlsDetector::getNMods() +{ + int nm = 0; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + nm += detectors[idet]->getNMods(); + } } - } #ifdef VERBOSE - cout << "total number of modules is " << nm << endl; + cout << "total number of modules is " << nm << endl; #endif - return nm; + return nm; } - -int multiSlsDetector::getNMod(dimension d){ - int nm=0; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - nm+=detectors[idet]->getNMod(d); +int multiSlsDetector::getNMod(dimension d) +{ + int nm = 0; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + nm += detectors[idet]->getNMod(d); + } } - } #ifdef VERBOSE - cout << "total number of modules in dimension " << d << " is " << nm << endl; + cout << "total number of modules in dimension " << d << " is " << nm << endl; #endif - return nm; + return nm; } - - -int multiSlsDetector::getChansPerMod(int imod){ - int id=-1, im=-1; +int multiSlsDetector::getChansPerMod(int imod) +{ + int id = -1, im = -1; #ifdef VERBOSE - cout << "get chans per mod " << imod << endl; + cout << "get chans per mod " << imod << endl; #endif - decodeNMod(imod, id, im); - if (id >=0) { - if (detectors[id]) { - return detectors[id]->getChansPerMod(im); + decodeNMod(imod, id, im); + if (id >= 0) { + if (detectors[id]) { + return detectors[id]->getChansPerMod(im); + } } - } - return -1; - + return -1; } -int multiSlsDetector::getMoveFlag(int imod){ - int id=-1, im=-1; - decodeNMod(imod, id, im); - if (id>=0) { - if (detectors[id]) { - return detectors[id]->getMoveFlag(im); +int multiSlsDetector::getMoveFlag(int imod) +{ + int id = -1, im = -1; + decodeNMod(imod, id, im); + if (id >= 0) { + if (detectors[id]) { + return detectors[id]->getMoveFlag(im); + } } - } - //default!!! - return 1; -} - - - - -angleConversionConstant * multiSlsDetector::getAngularConversionPointer(int imod){ - int id=-1, im=-1; -#ifdef VERBOSE - cout << "get angular conversion pointer " << endl; -#endif - if (decodeNMod(imod, id, im)>=0) { - if (detectors[id]) { - return detectors[id]->getAngularConversionPointer(im); - } - } - return NULL; - -} - - - -int multiSlsDetector::flatFieldCorrect(double* datain, double *errin, double* dataout, double *errout){ - - int ichdet=0; - double *perr=errin;//*pdata, - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { -#ifdef VERBOSE - cout << " detector " << idet << " offset " << ichdet << endl; -#endif - if (errin) - perr+=ichdet; - detectors[idet]->flatFieldCorrect(datain+ichdet, perr, dataout+ichdet, errout+ichdet); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getTotalNumberOfChannels();//detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods(); - } - } - return 0; -}; - - - - - - - - -int multiSlsDetector::setRateCorrection(double t){ - -#ifdef VERBOSE - std::cout<< "Setting rate correction with dead time "<< thisMultiDetector->tDead << std::endl; -#endif - int ret=OK; - int posmax=thisMultiDetector->numberOfDetectors; - - // eiger return value is ok/fail - if (getDetectorsType() == EIGER){ - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax]; - for(int idet=0; idet(&slsDetector::setRateCorrection, - detectors[idet],t,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<(&slsDetector::setRateCorrection, - detectors[idet],t,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask&(1<correctionMask&(1<tDead << std::endl; -#endif - return 1; - } else - t=0; -#ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; -#endif - return 0; -}; - -double multiSlsDetector::getRateCorrectionTau(){ - - double ret=-100.0; - int posmax = thisMultiDetector->numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - }else{ - double* iret[posmax]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new double(-1); - Task* task = new Task(new func0_t(&slsDetector::getRateCorrectionTau, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for(int idet=0; idet 0.000000001) { - std::cout<< "Rate correction is different for different readouts " << std::endl; - ret=-1; - } - delete iret[idet]; - }else ret = -1; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask&(1<tDead << std::endl; -#endif - } else { -#ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; -#endif - ret=0; - } - return ret; - -}; - - - -int multiSlsDetector::getRateCorrection(){ - - if (getDetectorsType() == EIGER){ - return getRateCorrectionTau(); - } - - if (thisMultiDetector->correctionMask&(1<= 0) { + if (detectors[id]) { + return detectors[id]->getAngularConversionPointer(im); + } + } + return NULL; +} + +int multiSlsDetector::flatFieldCorrect(double* datain, double* errin, double* dataout, double* errout) +{ + + int ichdet = 0; + double* perr = errin; //*pdata, + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { +#ifdef VERBOSE + cout << " detector " << idet << " offset " << ichdet << endl; +#endif + if (errin) + perr += ichdet; + detectors[idet]->flatFieldCorrect(datain + ichdet, perr, dataout + ichdet, errout + ichdet); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + ichdet += detectors[idet]->getTotalNumberOfChannels(); //detectors[idet]->getNChans()*detectors[idet]->getNChips()*detectors[idet]->getNMods(); + } + } return 0; }; +int multiSlsDetector::setRateCorrection(double t) +{ +#ifdef VERBOSE + std::cout << "Setting rate correction with dead time " << thisMultiDetector->tDead << std::endl; +#endif + int ret = OK; + int posmax = thisMultiDetector->numberOfDetectors; - -int multiSlsDetector::rateCorrect(double* datain, double *errin, double* dataout, double *errout){ - - int ichdet=0; - double *perr=errin; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - if (errin) - perr+=ichdet; - detectors[idet]->rateCorrect(datain+ichdet, perr, dataout+ichdet, errout+ichdet); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getTotalNumberOfChannels(); + // eiger return value is ok/fail + if (getDetectorsType() == EIGER) { + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax]; + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(OK); + Task* task = new Task(new func1_t(&slsDetector::setRateCorrection, + detectors[idet], t, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + return ret; } - } - return 0; + + // mythen, others + if (t == 0) { + thisMultiDetector->correctionMask &= ~(1 << RATE_CORRECTION); + return thisMultiDetector->correctionMask & (1 << RATE_CORRECTION); + } else + thisMultiDetector->correctionMask |= (1 << RATE_CORRECTION); + + ret = -100; + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + int* iret[posmax]; + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func1_t(&slsDetector::setRateCorrection, + detectors[idet], t, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) + delete iret[idet]; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + return thisMultiDetector->correctionMask & (1 << RATE_CORRECTION); +} + +int multiSlsDetector::getRateCorrection(double& t) +{ + + if (getDetectorsType() == EIGER) { + t = getRateCorrectionTau(); + return t; + } + + if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { +#ifdef VERBOSE + std::cout << "Rate correction is enabled with dead time " << thisMultiDetector->tDead << std::endl; +#endif + return 1; + } else + t = 0; +#ifdef VERBOSE + std::cout << "Rate correction is disabled " << std::endl; +#endif + return 0; }; +double multiSlsDetector::getRateCorrectionTau() +{ -int multiSlsDetector::setBadChannelCorrection(string fname){ + double ret = -100.0; + int posmax = thisMultiDetector->numberOfDetectors; - int badlist[MAX_BADCHANS];// badlistdet[MAX_BADCHANS]; - int nbad=0;//, nbaddet=0, choff=0, idet=0; - int ret=0; + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + double* iret[posmax]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new double(-1); + Task* task = new Task(new func0_t(&slsDetector::getRateCorrectionTau, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); - cout << thisMultiDetector->badChanFile << endl; + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (ret == -100.0) + ret = *iret[idet]; + else if ((ret - *iret[idet]) > 0.000000001) { + std::cout << "Rate correction is different for different readouts " << std::endl; + ret = -1; + } + delete iret[idet]; + } else + ret = -1; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } - if (fname=="default") - fname=string(thisMultiDetector->badChanFile); + if (getDetectorsType() == EIGER) + return ret; - - - - - ret=setBadChannelCorrection(fname, nbad, badlist); - //#ifdef VERBOSE - cout << "multi: file contained " << ret << " badchans" << endl; - //#endif - if (ret==0) { - thisMultiDetector->correctionMask&=~(1<correctionMask|=(1<badChanFile,fname.c_str()); - } - - return setBadChannelCorrection(nbad,badlist,0); - -} - - - -int multiSlsDetector::setBadChannelCorrection(int nbad, int *badlist, int ff) { - - //#define VERBOSE - - int badlistdet[MAX_BADCHANS]; - int nbaddet=0, choff=0, idet=0; - if (nbad<1) - badlistdet[0]=0; - else - badlistdet[0]=badlist[0]; - - if (nbad>0) { - thisMultiDetector->correctionMask|=(1<=detectors[idet]->getMaxNumberOfChannels()) { - //#ifdef VERBOSE - cout << "setting " << nbaddet << " badchans to detector " << idet << endl; - //#endif - detectors[idet]->setBadChannelCorrection(nbaddet,badlistdet,0); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - nbaddet=0; - ++idet; - if (detectors[idet]==NULL) - break; - } - badlistdet[nbaddet]=(badlist[ich]-choff); - ++nbaddet; + //only mythen + if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { #ifdef VERBOSE - cout << nbaddet << " " << badlist[ich] << " " << badlistdet[nbaddet-1] << endl; + std::cout << "Rate correction is enabled with dead time " << thisMultiDetector->tDead << std::endl; #endif - } - } - if (nbaddet>0) { - - if (detectors[idet]) { + } else { #ifdef VERBOSE - cout << "setting " << nbaddet << " badchans to detector " << idet << endl; + std::cout << "Rate correction is disabled " << std::endl; #endif - detectors[idet]->setBadChannelCorrection(nbaddet,badlistdet,0); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - nbaddet=0; - ++idet; - } + ret = 0; } - nbaddet=0; - for (int i=idet; inumberOfDetectors; ++i) { - #ifdef VERBOSE - cout << "setting " << 0 << " badchans to detector " << i << endl; - #endif - if (detectors[i]) { - detectors[i]->setBadChannelCorrection(nbaddet,badlistdet,0); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[idet]) { + if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { + return 1; + } else + return 0; +}; + +int multiSlsDetector::rateCorrect(double* datain, double* errin, double* dataout, double* errout) +{ + + int ichdet = 0; + double* perr = errin; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (errin) + perr += ichdet; + detectors[idet]->rateCorrect(datain + ichdet, perr, dataout + ichdet, errout + ichdet); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + ichdet += detectors[idet]->getTotalNumberOfChannels(); + } + } + return 0; +}; + +int multiSlsDetector::setBadChannelCorrection(string fname) +{ + + int badlist[MAX_BADCHANS]; // badlistdet[MAX_BADCHANS]; + int nbad = 0; //, nbaddet=0, choff=0, idet=0; + int ret = 0; + + cout << thisMultiDetector->badChanFile << endl; + + if (fname == "default") + fname = string(thisMultiDetector->badChanFile); + + ret = setBadChannelCorrection(fname, nbad, badlist); + //#ifdef VERBOSE + cout << "multi: file contained " << ret << " badchans" << endl; + //#endif + if (ret == 0) { + thisMultiDetector->correctionMask &= ~(1 << DISCARD_BAD_CHANNELS); + nbad = 0; + } else { + thisMultiDetector->correctionMask |= (1 << DISCARD_BAD_CHANNELS); + strcpy(thisMultiDetector->badChanFile, fname.c_str()); + } + + return setBadChannelCorrection(nbad, badlist, 0); +} + +int multiSlsDetector::setBadChannelCorrection(int nbad, int* badlist, int ff) +{ + + //#define VERBOSE + + int badlistdet[MAX_BADCHANS]; + int nbaddet = 0, choff = 0, idet = 0; + if (nbad < 1) + badlistdet[0] = 0; + else + badlistdet[0] = badlist[0]; + + if (nbad > 0) { + thisMultiDetector->correctionMask |= (1 << DISCARD_BAD_CHANNELS); + + for (int ich = 0; ich < nbad; ++ich) { + if (detectors[idet]) { + if ((badlist[ich] - choff) >= detectors[idet]->getMaxNumberOfChannels()) { + //#ifdef VERBOSE + cout << "setting " << nbaddet << " badchans to detector " << idet << endl; + //#endif + detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + choff += detectors[idet]->getMaxNumberOfChannels(); + nbaddet = 0; + ++idet; + if (detectors[idet] == NULL) + break; + } + badlistdet[nbaddet] = (badlist[ich] - choff); + ++nbaddet; #ifdef VERBOSE - cout << "setting " << 0 << " badchans to detector " << idet << endl; + cout << nbaddet << " " << badlist[ich] << " " << badlistdet[nbaddet - 1] << endl; #endif - detectors[idet]->setBadChannelCorrection(nbaddet,badlistdet,0); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask&=~(1< 0) { + + if (detectors[idet]) { #ifdef VERBOSE - cout << (thisMultiDetector->correctionMask&(1<correctionMask&(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { + detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + choff += detectors[idet]->getMaxNumberOfChannels(); + nbaddet = 0; + ++idet; + } + } + nbaddet = 0; + for (int i = idet; i < thisMultiDetector->numberOfDetectors; ++i) { #ifdef VERBOSE - cout << " detector " << idet << endl; + cout << "setting " << 0 << " badchans to detector " << i << endl; #endif - detectors[idet]->readAngularConversion(infile); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setBadChannelCorrection(nbaddet, badlistdet, 0); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + } + } + + } else { + nbaddet = 0; + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[idet]) { +#ifdef VERBOSE + cout << "setting " << 0 << " badchans to detector " << idet << endl; +#endif + detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + thisMultiDetector->correctionMask &= ~(1 << DISCARD_BAD_CHANNELS); } - infile.close(); - } else { - std::cout<< "Could not open calibration file "<< fname << std::endl; - return -1; - } - return 0; - +#ifdef VERBOSE + cout << (thisMultiDetector->correctionMask & (1 << DISCARD_BAD_CHANNELS)) << endl; +#endif + return thisMultiDetector->correctionMask & (1 << DISCARD_BAD_CHANNELS); } +int multiSlsDetector::readAngularConversionFile(string fname) +{ -int multiSlsDetector::writeAngularConversion(string fname) { + ifstream infile; + //int nm=0; + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { - - ofstream outfile; - // int nm=0; - outfile.open(fname.c_str(), ios_base::out); - if (outfile.is_open()) { - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - detectors[idet]->writeAngularConversion(outfile); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { +#ifdef VERBOSE + cout << " detector " << idet << endl; +#endif + detectors[idet]->readAngularConversion(infile); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + infile.close(); + } else { + std::cout << "Could not open calibration file " << fname << std::endl; + return -1; } - outfile.close(); - } else { - std::cout<< "Could not open calibration file "<< fname << std::endl; - return -1; - } - return 0; - + return 0; } -int multiSlsDetector::getAngularConversion(int &direction, angleConversionConstant *angconv) { +int multiSlsDetector::writeAngularConversion(string fname) +{ - int dir=-100, dir1; - angleConversionConstant *a1=angconv; + ofstream outfile; + // int nm=0; + outfile.open(fname.c_str(), ios_base::out); + if (outfile.is_open()) { - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - detectors[idet]->getAngularConversion(dir1,a1); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getNMods(); - } + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + detectors[idet]->writeAngularConversion(outfile); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + outfile.close(); + } else { + std::cout << "Could not open calibration file " << fname << std::endl; + return -1; } - } - direction=dir; - - if (thisMultiDetector->correctionMask&(1<< ANGULAR_CONVERSION)) { - return 1; - } - return 0; - - + return 0; } +int multiSlsDetector::getAngularConversion(int& direction, angleConversionConstant* angconv) +{ + int dir = -100, dir1; + angleConversionConstant* a1 = angconv; -dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { - dacs_t ret = -100; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + detectors[idet]->getAngularConversion(dir1, a1); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (dir == -100) + dir = dir1; + if (dir != dir1) + dir = 0; + if (angconv) { + a1 += detectors[idet]->getNMods(); + } + } + } + direction = dir; - // single - { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ - ret = detectors[id]->setDAC(val, idac, mV, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - dacs_t* iret[posmax-posmin]; - - for(int idet=posmin; idet(&slsDetector::setDAC, - detectors[idet],val, idac, mV, imod, iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask & (1 << ANGULAR_CONVERSION)) { + return 1; + } + return 0; } -dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) { - dacs_t ret = -100; +dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) +{ + dacs_t ret = -100; - // single - { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ - ret = detectors[id]->getADC(idac, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<= 0) { + if (detectors[id]) { + ret = detectors[id]->setDAC(val, idac, mV, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + } + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } - // multi - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + dacs_t* iret[posmax - posmin]; - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - dacs_t* iret[posmax-posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new dacs_t(-1); + Task* task = new Task(new func4_t(&slsDetector::setDAC, + detectors[idet], val, idac, mV, imod, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { - for(int idet=posmin; idet(&slsDetector::getADC, - detectors[idet],idac, imod, iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + if (ret == -100) + ret = -1; - return ret; + return ret; } +dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) +{ + dacs_t ret = -100; + // single + { + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->getADC(idac, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + } -int multiSlsDetector::setThresholdTemperature(int val, int imod) { + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } + + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + dacs_t* iret[posmax - posmin]; + + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new dacs_t(-1); + Task* task = new Task(new func2_t(&slsDetector::getADC, + detectors[idet], idac, imod, iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++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::setThresholdTemperature(int val, int imod) +{ int ret = -100; // single { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { ret = detectors[id]->setThresholdTemperature(val, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); return ret; } return -1; @@ -3342,53 +3155,54 @@ int multiSlsDetector::setThresholdTemperature(int val, int imod) { } // multi - if(!threadpool){ + if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; } - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - int* iret[posmax-posmin]; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + int* iret[posmax - posmin]; - for(int idet=posmin; idet(&slsDetector::setThresholdTemperature, - detectors[idet], val, imod, iret[idet])); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new dacs_t(-1); + Task* task = new Task(new func2_t(&slsDetector::setThresholdTemperature, + detectors[idet], val, imod, iret[idet])); threadpool->add_task(task); } } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); } } return ret; } - -int multiSlsDetector::setTemperatureControl(int val, int imod) { +int multiSlsDetector::setTemperatureControl(int val, int imod) +{ int ret = -100; // single { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { ret = detectors[id]->setTemperatureControl(val, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); return ret; } return -1; @@ -3396,54 +3210,54 @@ int multiSlsDetector::setTemperatureControl(int val, int imod) { } // multi - if(!threadpool){ + if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; } - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - int* iret[posmax-posmin]; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + int* iret[posmax - posmin]; - for(int idet=posmin; idet(&slsDetector::setTemperatureControl, - detectors[idet], val, imod, iret[idet])); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new dacs_t(-1); + Task* task = new Task(new func2_t(&slsDetector::setTemperatureControl, + detectors[idet], val, imod, iret[idet])); threadpool->add_task(task); } } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); } } return ret; } - - -int multiSlsDetector::setTemperatureEvent(int val, int imod) { +int multiSlsDetector::setTemperatureEvent(int val, int imod) +{ int ret = -100; // single { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { ret = detectors[id]->setTemperatureEvent(val, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); return ret; } return -1; @@ -3451,70 +3265,66 @@ int multiSlsDetector::setTemperatureEvent(int val, int imod) { } // multi - if(!threadpool){ + if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; } - int posmin=0, posmax=thisMultiDetector->numberOfDetectors; - int* iret[posmax-posmin]; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + int* iret[posmax - posmin]; - for(int idet=posmin; idet(&slsDetector::setTemperatureEvent, - detectors[idet], val, imod, iret[idet])); + for (int idet = posmin; idet < posmax; ++idet) { + if (detectors[idet]) { + iret[idet] = new dacs_t(-1); + Task* task = new Task(new func2_t(&slsDetector::setTemperatureEvent, + detectors[idet], val, imod, iret[idet])); threadpool->add_task(task); } } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); } } return ret; } +int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) +{ + int ret, ret1 = -100; + int id = -1, im = -1; + int dmi = 0, dma = thisMultiDetector->numberOfDetectors; - - -int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { - int ret, ret1=-100; - int id=-1, im=-1; - int dmi=0, dma=thisMultiDetector->numberOfDetectors; - - if (decodeNMod(imod, id, im)>=0) { - dmi=id; - dma=id+1; - } - for (int idet=dmi; idetsetChannel(reg, ichan, ichip, im); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<= 0) { + dmi = id; + dma = id + 1; } - } - return ret1; - + for (int idet = dmi; idet < dma; ++idet) { + if (detectors[idet]) { + ret = detectors[idet]->setChannel(reg, ichan, ichip, im); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = -1; + } + } + return ret1; } - - /** sets the value of s angular conversion parameter \param c can be ANGULAR_DIRECTION, GLOBAL_OFFSET, FINE_OFFSET, BIN_SIZE @@ -3522,23 +3332,21 @@ int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { \returns the actual value */ -double multiSlsDetector::setAngularConversionParameter(angleConversionParameter c, double v) { - double ret=slsDetectorUtils::setAngularConversionParameter(c,v); - for (int idet=0; idetnumberOfDetectors; ++idet) { +double multiSlsDetector::setAngularConversionParameter(angleConversionParameter c, double v) +{ + double ret = slsDetectorUtils::setAngularConversionParameter(c, v); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - - detectors[idet]->setAngularConversionParameter(c,v); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setAngularConversionParameter(c, v); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } } - } - return ret; + return ret; } - - // double* multiSlsDetector::convertAngles(double pos) { // double *ang=new double[thisMultiDetector->numberOfChannels]; @@ -3567,707 +3375,662 @@ double multiSlsDetector::setAngularConversionParameter(angleConversionParameter // return ang; // } +int multiSlsDetector::getBadChannelCorrection(int* bad) +{ + //int ichan; + int *bd, nd, ntot = 0, choff = 0; + ; -int multiSlsDetector::getBadChannelCorrection(int *bad) { - //int ichan; - int *bd, nd, ntot=0, choff=0;; + if (((thisMultiDetector->correctionMask) & (1 << DISCARD_BAD_CHANNELS)) == 0) + return 0; + //else + // cout << "bad chans corr enabled "<< thisMultiDetector->correctionMask << endl; - if (((thisMultiDetector->correctionMask)&(1<< DISCARD_BAD_CHANNELS))==0) - return 0; - //else - // cout << "bad chans corr enabled "<< thisMultiDetector->correctionMask << endl; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - nd=detectors[idet]->getBadChannelCorrection(); - // cout << "det " << idet << " nbad " << nd << endl; - if (nd>0) { - bd = new int[nd]; - nd=detectors[idet]->getBadChannelCorrection(bd); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getTotalNumberOfChannels()) { - if (bad) bad[ntot]=choff+bd[id]; - ++ntot; - } - } - choff+=detectors[idet]->getTotalNumberOfChannels(); - delete [] bd; - } else - ntot+=nd; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + nd = detectors[idet]->getBadChannelCorrection(); + // cout << "det " << idet << " nbad " << nd << endl; + if (nd > 0) { + bd = new int[nd]; + nd = detectors[idet]->getBadChannelCorrection(bd); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + for (int id = 0; id < nd; ++id) { + if (bd[id] < detectors[idet]->getTotalNumberOfChannels()) { + if (bad) + bad[ntot] = choff + bd[id]; + ++ntot; + } + } + choff += detectors[idet]->getTotalNumberOfChannels(); + delete[] bd; + } else + ntot += nd; + } } - } - return ntot; - + return ntot; } +int multiSlsDetector::exitServer() +{ -int multiSlsDetector::exitServer() { - - int ival=FAIL, iv; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - iv=detectors[idet]->exitServer(); - if (iv==OK) - ival=iv; + int ival = FAIL, iv; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iv = detectors[idet]->exitServer(); + if (iv == OK) + ival = iv; + } } - } - return ival; + return ival; } - /** returns the detector trimbit/settings directory */ -string multiSlsDetector::getSettingsDir() { +string multiSlsDetector::getSettingsDir() +{ - string concatenatedDir, firstDir; - bool dirNotSame = false; + string concatenatedDir, firstDir; + bool dirNotSame = false; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - string thisDir = detectors[idet]->getSettingsDir(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + string thisDir = detectors[idet]->getSettingsDir(); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); - if (firstDir.empty()){ - concatenatedDir = thisDir; - firstDir = thisDir; - } - else{ - concatenatedDir += "+" + thisDir; - } - - if (firstDir != thisDir) - dirNotSame = true; + if (firstDir.empty()) { + concatenatedDir = thisDir; + firstDir = thisDir; + } else { + concatenatedDir += "+" + thisDir; + } + + if (firstDir != thisDir) + dirNotSame = true; + } } - } - if (dirNotSame) - return concatenatedDir; - else - return firstDir; + if (dirNotSame) + return concatenatedDir; + else + return firstDir; } - - /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ -string multiSlsDetector::setSettingsDir(string s){ +string multiSlsDetector::setSettingsDir(string s) +{ - if (s.find('+')==string::npos) { - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - detectors[idet]->setSettingsDir(s); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + detectors[idet]->setSettingsDir(s); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } else { + size_t p1 = 0; + size_t p2 = s.find('+', p1); + int id = 0; + while (p2 != string::npos) { + + if (detectors[id]) { + detectors[id]->setSettingsDir(s.substr(p1, p2 - p1)); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + ++id; + s = s.substr(p2 + 1); + p2 = s.find('+'); + if (id >= thisMultiDetector->numberOfDetectors) + break; + } } - } else { - size_t p1=0; - size_t p2=s.find('+',p1); - int id=0; - while (p2!=string::npos) { - - if (detectors[id]) { - detectors[id]->setSettingsDir(s.substr(p1,p2-p1)); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=thisMultiDetector->numberOfDetectors) - break; - } - - } - return getSettingsDir(); - - + return getSettingsDir(); } +int multiSlsDetector::setTrimEn(int ne, int* ene) +{ + int ret = -100, ret1; - -int multiSlsDetector::setTrimEn(int ne, int *ene) { - - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setTrimEn(ne,ene); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setTrimEn(ne, ene); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } } - } - return ret; - + return ret; } +int multiSlsDetector::getTrimEn(int* ene) +{ + int ret = -100, ret1; -int multiSlsDetector::getTrimEn(int *ene) { - - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->getTrimEn(ene); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->getTrimEn(ene); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } } - } - return ret; - -} - - - - - - - - - -/** - returns the location of the calibration files - \sa sharedSlsDetector -*/ -char* multiSlsDetector::getCalDir() { - string s0="", s1="", s; - //char ans[1000]; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - s=detectors[idet]->getCalDir(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - detectors[idet]->setCalDir(s); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setCalDir(s.substr(p1,p2-p1)); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=thisMultiDetector->numberOfDetectors) - break; - } - - } - return getCalDir(); - + return ret; } /** returns the location of the calibration files \sa sharedSlsDetector */ -string multiSlsDetector::getNetworkParameter(networkParameter p) { - string s0="", s1="",s ; - string ans=""; - //char ans[1000]; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - s=detectors[idet]->getNetworkParameter(p); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + s = detectors[idet]->getCalDir(); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (s0 == "") + s0 = s; + else + s0 += string("+") + s; + if (s1 == "") + s1 = s; + else if (s1 != s) + s1 = "bad"; + } } - } - if (s1=="bad") - ans=s0; - // strcpy(ans,s0.c_str()); - else - ans=s1; - // strcpy(ans,s1.c_str()); - return ans; -} - - -/** - sets the location of the calibration files - \sa sharedSlsDetector -*/ -string multiSlsDetector::setNetworkParameter(networkParameter p, string s){ - - if (s.find('+')==string::npos) { - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return getNetworkParameter(p); - }else{ - string* sret[thisMultiDetector->numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if (p == RECEIVER_STREAMING_PORT || p == CLIENT_STREAMING_PORT) - s.append("multi\0"); - sret[idet]=new string("error"); - Task* task = new Task(new func2_t(&slsDetector::setNetworkParameter, - detectors[idet],p,s,sret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(sret[idet]!= NULL) - delete sret[idet]; - //doing nothing with the return values - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setNetworkParameter(p,s.substr(p1,p2-p1)); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=thisMultiDetector->numberOfDetectors) - break; - } - - } - - return getNetworkParameter(p); - -} - -int multiSlsDetector::setPort(portType t, int p) { - - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setPort(t,p); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->lockServer(p); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - s=detectors[idet]->getLastClientIP(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setReadOutFlags(flag); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setExternalCommunicationMode(pol); - if(detectors[0]->getErrorMask()) - setErrorMask(getErrorMask()|(1<<0)); - - - for (int idet=1; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setExternalCommunicationMode(pol); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<setExternalSignalFlags(pol,signalindex); - if(detectors[0]->getErrorMask()) - setErrorMask(getErrorMask()|(1<<0)); - - for (int idet=1; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setExternalSignalFlags(pol,signalindex); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - s=detectors[idet]->getSettingsFile(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->configureMAC(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfChannels]; - - ifstream infile; - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { -#ifdef VERBOSE - std::cout<< std::endl<< "Loading "; - if(!index) - std::cout<<"Dark"; + if (s1 == "bad") + strcpy(ans, s0.c_str()); else - std::cout<<"Gain"; - std::cout<<" image from file " << fname << std::endl; -#endif - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - if(detectors[idet]->readDataFile(infile,imageVals)>=0){ - ret1=detectors[idet]->sendImageToDetector(index,imageVals); - if (ret==-100) - ret=ret1; - else if (ret!=ret1) - ret=-1; - } - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfChannels]; - ofstream outfile; - outfile.open(fname.c_str(), ios_base::out); - if (outfile.is_open()) { + if (s.find('+') == string::npos) { + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + detectors[idet]->setCalDir(s); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } else { + size_t p1 = 0; + size_t p2 = s.find('+', p1); + int id = 0; + while (p2 != string::npos) { + + if (detectors[id]) { + detectors[id]->setCalDir(s.substr(p1, p2 - p1)); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + ++id; + s = s.substr(p2 + 1); + p2 = s.find('+'); + if (id >= thisMultiDetector->numberOfDetectors) + break; + } + } + return getCalDir(); +} + +/** + returns the location of the calibration files + \sa sharedSlsDetector +*/ +string multiSlsDetector::getNetworkParameter(networkParameter p) +{ + string s0 = "", s1 = "", s; + string ans = ""; + //char ans[1000]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + s = detectors[idet]->getNetworkParameter(p); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + + if (s0 == "") + s0 = s + string("+"); + else + s0 += s + string("+"); + + if (s1 == "") + s1 = s; + else if (s1 != s) + s1 = "bad"; + } + } + if (s1 == "bad") + ans = s0; + // strcpy(ans,s0.c_str()); + else + ans = s1; + // strcpy(ans,s1.c_str()); + return ans; +} + +/** + sets the location of the calibration files + \sa sharedSlsDetector +*/ +string multiSlsDetector::setNetworkParameter(networkParameter p, string s) +{ + + if (s.find('+') == string::npos) { + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return getNetworkParameter(p); + } else { + string* sret[thisMultiDetector->numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (p == RECEIVER_STREAMING_PORT || p == CLIENT_STREAMING_PORT) + s.append("multi\0"); + sret[idet] = new string("error"); + Task* task = new Task(new func2_t(&slsDetector::setNetworkParameter, + detectors[idet], p, s, sret[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 (sret[idet] != NULL) + delete sret[idet]; + //doing nothing with the return values + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + } else { + size_t p1 = 0; + size_t p2 = s.find('+', p1); + int id = 0; + while (p2 != string::npos) { + + if (detectors[id]) { + detectors[id]->setNetworkParameter(p, s.substr(p1, p2 - p1)); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + } + ++id; + s = s.substr(p2 + 1); + p2 = s.find('+'); + if (id >= thisMultiDetector->numberOfDetectors) + break; + } + } + + return getNetworkParameter(p); +} + +int multiSlsDetector::setPort(portType t, int p) +{ + + int ret = -100, ret1; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setPort(t, p); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + return ret; +} + +int multiSlsDetector::lockServer(int p) +{ + + int ret = -100, ret1; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->lockServer(p); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + + return ret; +} + +string multiSlsDetector::getLastClientIP() +{ + string s0 = "", s1 = "", s; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + s = detectors[idet]->getLastClientIP(); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + + if (s0 == "") + s0 = s; + else + s0 += string("+") + s; + if (s1 == "") + s1 = s; + else if (s1 != s) + s1 = "bad"; + } + } + if (s1 == "bad") + return s0; + else + return s1; +} + +int multiSlsDetector::setReadOutFlags(readOutFlags flag) +{ + + int ret = -100, ret1; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setReadOutFlags(flag); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + + return ret; +} + +slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunicationMode(externalCommunicationMode pol) +{ + + externalCommunicationMode ret, ret1; + + if (detectors[0]) + ret = detectors[0]->setExternalCommunicationMode(pol); + if (detectors[0]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << 0)); + + for (int idet = 1; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setExternalCommunicationMode(pol); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret != ret1) + ret = GET_EXTERNAL_COMMUNICATION_MODE; + } + } + + setMaster(); + setSynchronization(); + return ret; +} + +slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(externalSignalFlag pol, int signalindex) +{ + + externalSignalFlag ret, ret1; + + if (detectors[0]) + ret = detectors[0]->setExternalSignalFlags(pol, signalindex); + if (detectors[0]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << 0)); + + for (int idet = 1; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setExternalSignalFlags(pol, signalindex); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret != ret1) + ret = GET_EXTERNAL_SIGNAL_FLAG; + } + } + + setMaster(); + setSynchronization(); + return ret; +} + +string multiSlsDetector::getSettingsFile() +{ + + string s0 = "", s1 = "", s; + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + s = detectors[idet]->getSettingsFile(); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + + if (s0 == "") + s0 = s; + else + s0 += string("+") + s; + if (s1 == "") + s1 = s; + else if (s1 != s) + s1 = "bad"; + } + } + if (s1 == "bad") + return s0; + else + return s1; +} + +int multiSlsDetector::configureMAC() +{ + + int ret = -100, ret1; + + 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 ret = -100, ret1; + short int imageVals[thisMultiDetector->numberOfChannels]; + + ifstream infile; + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { #ifdef VERBOSE - std::cout<< std::endl<< "Reading Counter to \""<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->getCounterBlock(arg,startACQ); - if(ret1!=OK) - ret=FAIL; - else{ - ret1=detectors[idet]->writeDataFile(outfile,arg); - if(ret1!=OK) - ret=FAIL; - } - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (detectors[idet]->readDataFile(infile, imageVals) >= 0) { + ret1 = detectors[idet]->sendImageToDetector(index, imageVals); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + infile.close(); + } else { + std::cout << "Could not open file " << fname << std::endl; + return -1; } - outfile.close(); - } else { - std::cout<< "Could not open file "<< fname << std::endl; - return -1; - } - return ret; + return ret; } +int multiSlsDetector::writeCounterBlockFile(string const fname, int startACQ) +{ -int multiSlsDetector::resetCounterBlock(int startACQ){ - - int ret=-100, ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->resetCounterBlock(startACQ); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfChannels]; + ofstream outfile; + outfile.open(fname.c_str(), ios_base::out); + if (outfile.is_open()) { +#ifdef VERBOSE + std::cout << std::endl + << "Reading Counter to \"" << fname; + if (startACQ == 1) + std::cout << "\" and Restarting Acquisition"; + std::cout << std::endl; +#endif + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->getCounterBlock(arg, startACQ); + if (ret1 != OK) + ret = FAIL; + else { + ret1 = detectors[idet]->writeDataFile(outfile, arg); + if (ret1 != OK) + ret = FAIL; + } + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + outfile.close(); + } else { + std::cout << "Could not open file " << fname << std::endl; + return -1; } - } - return ret; + return ret; } +int multiSlsDetector::resetCounterBlock(int startACQ) +{ - -int multiSlsDetector::setCounterBit(int i){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setCounterBit(i); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->resetCounterBlock(startACQ); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + return ret; } +int multiSlsDetector::setCounterBit(int i) +{ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setCounterBit(i); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; +} +int multiSlsDetector::setDynamicRange(int p) +{ + int ret = -100; + thisMultiDetector->dataBytes = 0; + thisMultiDetector->dataBytesInclGapPixels = 0; + thisMultiDetector->numberOfChannels = 0; -int multiSlsDetector::setDynamicRange(int p) { - - int ret=-100; - thisMultiDetector->dataBytes=0; - thisMultiDetector->dataBytesInclGapPixels=0; - thisMultiDetector->numberOfChannels=0; - - if(!threadpool){ + if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; - }else{ + } else { //return storage values int* iret[thisMultiDetector->numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setDynamicRange, - detectors[idet],p,iret[idet])); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func1_t(&slsDetector::setDynamicRange, + detectors[idet], p, iret[idet])); threadpool->add_task(task); } } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - thisMultiDetector->dataBytes+=detectors[idet]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels+=detectors[idet]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels+=detectors[idet]->getTotalNumberOfChannels(); - if (ret==-100) - ret=*iret[idet]; - else if (ret!=*iret[idet]) - ret=-1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + thisMultiDetector->dataBytes += detectors[idet]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels += detectors[idet]->getDataBytesInclGapPixels(); + thisMultiDetector->numberOfChannels += detectors[idet]->getTotalNumberOfChannels(); + 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<getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); } } } //for usability for the user - if (getDetectorsType() == EIGER){ - if(p == 32){ + if (getDetectorsType() == EIGER) { + if (p == 32) { std::cout << "Setting Clock to Quarter Speed to cope with Dynamic Range of 32" << std::endl; - setSpeed(CLOCK_DIVIDER,2); - } - else if(p == 16){ + setSpeed(CLOCK_DIVIDER, 2); + } else if (p == 16) { std::cout << "Setting Clock to Half Speed for Dynamic Range of 16" << std::endl; - setSpeed(CLOCK_DIVIDER,1); + setSpeed(CLOCK_DIVIDER, 1); } if (p != -1) updateOffsets(); @@ -4275,1798 +4038,1737 @@ int multiSlsDetector::setDynamicRange(int p) { return ret; } +int multiSlsDetector::getMaxMods() +{ + int ret = 0, ret1; -int multiSlsDetector::getMaxMods() { - - - int ret=0, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->getMaxMods(); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->getMaxMods(); #ifdef VERBOSE - cout << "detector " << idet << " maxmods " << ret1 << endl; + cout << "detector " << idet << " maxmods " << ret1 << endl; #endif - ret+=ret1; + ret += ret1; + } } - } #ifdef VERBOSE - cout << "max mods is " << ret << endl; + cout << "max mods is " << ret << endl; #endif - return ret; - + return ret; } +int multiSlsDetector::getTotalNumberOfChannels() +{ + thisMultiDetector->numberOfChannels = 0; + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) + thisMultiDetector->numberOfChannels += detectors[id]->getTotalNumberOfChannels(); + return thisMultiDetector->numberOfChannels; +}; +//int multiSlsDetector::getTotalNumberOfChannels(dimension d){thisMultiDetector->numberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->numberOfChannel[d]+=detectors[id]->getTotalNumberOfChannels(d); return thisMultiDetector->numberOfChannel[d];}; +int multiSlsDetector::getTotalNumberOfChannels(dimension d) { return thisMultiDetector->numberOfChannel[d]; }; +int multiSlsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d) { return thisMultiDetector->numberOfChannelInclGapPixels[d]; } - int multiSlsDetector::getTotalNumberOfChannels(){thisMultiDetector->numberOfChannels=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->numberOfChannels+=detectors[id]->getTotalNumberOfChannels(); return thisMultiDetector->numberOfChannels;}; +int multiSlsDetector::getMaxNumberOfChannels() +{ + thisMultiDetector->maxNumberOfChannels = 0; + for (int id = 0; id < thisMultiDetector->numberOfDetectors; ++id) + thisMultiDetector->maxNumberOfChannels += detectors[id]->getMaxNumberOfChannels(); + return thisMultiDetector->maxNumberOfChannels; +}; - //int multiSlsDetector::getTotalNumberOfChannels(dimension d){thisMultiDetector->numberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->numberOfChannel[d]+=detectors[id]->getTotalNumberOfChannels(d); return thisMultiDetector->numberOfChannel[d];}; - int multiSlsDetector::getTotalNumberOfChannels(dimension d){return thisMultiDetector->numberOfChannel[d];}; +// int multiSlsDetector::getMaxNumberOfChannels(dimension d){thisMultiDetector->maxNumberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->maxNumberOfChannel[d]+=detectors[id]->getMaxNumberOfChannels(d);return thisMultiDetector->maxNumberOfChannel[d];}; +int multiSlsDetector::getMaxNumberOfChannels(dimension d) { return thisMultiDetector->maxNumberOfChannel[d]; }; - int multiSlsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d){return thisMultiDetector->numberOfChannelInclGapPixels[d];} +int multiSlsDetector::getMaxNumberOfChannelsInclGapPixels(dimension d) { return thisMultiDetector->maxNumberOfChannelInclGapPixels[d]; }; - int multiSlsDetector::getMaxNumberOfChannels(){thisMultiDetector->maxNumberOfChannels=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->maxNumberOfChannels+=detectors[id]->getMaxNumberOfChannels();return thisMultiDetector->maxNumberOfChannels;}; +int multiSlsDetector::getMaxMod(dimension d) +{ - // int multiSlsDetector::getMaxNumberOfChannels(dimension d){thisMultiDetector->maxNumberOfChannel[d]=0; for (int id=0; id< thisMultiDetector->numberOfDetectors; ++id) thisMultiDetector->maxNumberOfChannel[d]+=detectors[id]->getMaxNumberOfChannels(d);return thisMultiDetector->maxNumberOfChannel[d];}; - int multiSlsDetector::getMaxNumberOfChannels(dimension d){return thisMultiDetector->maxNumberOfChannel[d];}; + int ret = 0, ret1; - int multiSlsDetector::getMaxNumberOfChannelsInclGapPixels(dimension d){return thisMultiDetector->maxNumberOfChannelInclGapPixels[d];}; - - - - -int multiSlsDetector::getMaxMod(dimension d){ - - int ret=0, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->getNMaxMod(d); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->getNMaxMod(d); #ifdef VERBOSE - cout << "detector " << idet << " maxmods " << ret1 << " in direction " << d << endl; + cout << "detector " << idet << " maxmods " << ret1 << " in direction " << d << endl; #endif - ret+=ret1; + ret += ret1; + } } - } #ifdef VERBOSE - cout << "max mods in direction "<< d << " is " << ret << endl; + cout << "max mods in direction " << d << " is " << ret << endl; #endif - return ret; - + return ret; } +int multiSlsDetector::getMaxNumberOfModules(dimension d) +{ -int multiSlsDetector::getMaxNumberOfModules(dimension d) { + int ret = 0, ret1; - int ret=0, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->getMaxNumberOfModules(d); - ret+=ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->getMaxNumberOfModules(d); + ret += ret1; + } } - } - return ret; - + return ret; } - -int multiSlsDetector::getFlippedData(dimension d){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->getFlippedData(d); - if(ret==-100) - ret=ret1; - else if (ret!=ret1) - ret=-1; - } - return ret; +int multiSlsDetector::getFlippedData(dimension d) +{ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->getFlippedData(d); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } -int multiSlsDetector::setNumberOfModules(int p, dimension d) { +int multiSlsDetector::setNumberOfModules(int p, dimension d) +{ - int ret=0;//, ret1; - int nm, mm, nt=p; + int ret = 0; //, ret1; + int nm, mm, nt = p; - thisMultiDetector->dataBytes=0; - thisMultiDetector->dataBytesInclGapPixels=0; - thisMultiDetector->numberOfChannels=0; + thisMultiDetector->dataBytes = 0; + thisMultiDetector->dataBytesInclGapPixels = 0; + thisMultiDetector->numberOfChannels = 0; - for (int idet=0; idetnumberOfDetectors; ++idet) { + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - // cout << "detector " << idet << endl; - if (detectors[idet]) { - if (p<0) - nm=p; - else { - mm=detectors[idet]->getMaxNumberOfModules(); - //mm=detectors[idet]->getMaxMods(); - if (nt>mm) { - nm=mm; - nt-=nm; - } else { - nm=nt; - nt-=nm; - } - } - ret+=detectors[idet]->setNumberOfModules(nm); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<dataBytes+=detectors[idet]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels+=detectors[idet]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels+=detectors[idet]->getTotalNumberOfChannels(); + // cout << "detector " << idet << endl; + if (detectors[idet]) { + if (p < 0) + nm = p; + else { + mm = detectors[idet]->getMaxNumberOfModules(); + //mm=detectors[idet]->getMaxMods(); + if (nt > mm) { + nm = mm; + nt -= nm; + } else { + nm = nt; + nt -= nm; + } + } + ret += detectors[idet]->setNumberOfModules(nm); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + thisMultiDetector->dataBytes += detectors[idet]->getDataBytes(); + thisMultiDetector->dataBytesInclGapPixels += detectors[idet]->getDataBytesInclGapPixels(); + thisMultiDetector->numberOfChannels += detectors[idet]->getTotalNumberOfChannels(); + } } - } - - if(p != -1) - updateOffsets(); - return ret; + if (p != -1) + updateOffsets(); + return ret; } - - -int multiSlsDetector::setFlippedData(dimension d, int value){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setFlippedData(d,value); - if(ret==-100) - ret=ret1; - else if (ret!=ret1) - ret=-1; - } - return ret; +int multiSlsDetector::setFlippedData(dimension d, int value) +{ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setFlippedData(d, value); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } -int multiSlsDetector::enableGapPixels(int val) { +int multiSlsDetector::enableGapPixels(int val) +{ - if(val > 0 && getDetectorsType() != EIGER){ - std::cout << "Not implemented for this detector" << std::endl; - val = -1; - } + if (val > 0 && getDetectorsType() != EIGER) { + std::cout << "Not implemented for this detector" << std::endl; + val = -1; + } - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->enableGapPixels(val); - if(ret==-100) - ret=ret1; - else if (ret!=ret1) - ret=-1; - } + 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) { - // update data bytes incl gap pixels - thisMultiDetector->dataBytesInclGapPixels=0; - for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { - if (detectors[i]) - thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels(); - } + if (val != -1) { + // update data bytes incl gap pixels + thisMultiDetector->dataBytesInclGapPixels = 0; + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) + thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels(); + } - // update offsets and number of channels incl gap pixels in multi level - updateOffsets(); - } + // update offsets and number of channels incl gap pixels in multi level + updateOffsets(); + } - return ret; + return ret; } - - - -int multiSlsDetector::decodeNMod(int i, int &id, int &im) { +int multiSlsDetector::decodeNMod(int i, int& id, int& im) +{ #ifdef VERBOSE - cout << " Module " << i << " belongs to detector " << id << endl;; - cout << getMaxMods(); + cout << " Module " << i << " belongs to detector " << id << endl; + ; + cout << getMaxMods(); #endif - if (i<0 || i>=getMaxMods()) { - id=-1; - im=-1; + if (i < 0 || i >= getMaxMods()) { + id = -1; + im = -1; #ifdef VERBOSE - cout << " A---------" << id << " position " << im << endl; + cout << " A---------" << id << " position " << im << endl; #endif + return -1; + } + int nm; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + nm = detectors[idet]->getNMods(); + if (nm > i) { + id = idet; + im = i; +#ifdef VERBOSE + cout << " B---------" << id << " position " << im << endl; +#endif + return im; + } else { + i -= nm; + } + } + } + id = -1; + im = -1; +#ifdef VERBOSE + cout << " C---------" << id << " position " << im << endl; +#endif return -1; - } - int nm; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - nm=detectors[idet]->getNMods(); - if (nm>i) { - id=idet; - im=i; -#ifdef VERBOSE - cout << " B---------" <=0) { - if (detectors[id]) { - ret = detectors[id]->getId(mode, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<= 0) { + if (detectors[id]) { + ret = detectors[id]->getId(mode, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } } - } - ret = -100; int64_t ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->getId(mode, imod); - if(ret==-100) - ret=ret1; - else if (ret!=ret1) - ret=-1; + ret = -100; + int64_t ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->getId(mode, imod); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; } return ret; - return -1; - + return -1; } -int multiSlsDetector::digitalTest(digitalTestMode mode, int imod) { +int multiSlsDetector::digitalTest(digitalTestMode mode, int imod) +{ - int id, im, ret; + int id, im, ret; - if (decodeNMod(imod, id, im)>=0) { - if (detectors[id]) { - ret = detectors[id]->digitalTest(mode, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<= 0) { + if (detectors[id]) { + ret = detectors[id]->digitalTest(mode, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } } - } - - return -1; + return -1; } +int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod) +{ + int ret = 100; + // single + { + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->executeTrimming(mode, par1, par2, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + } + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } + 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 func4_t(&slsDetector::executeTrimming, + detectors[idet], mode, par1, par2, imod, 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)); + } + } -int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod) { - int ret=100; - - // single - { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if (detectors[id]) { - ret = detectors[id]->executeTrimming(mode, par1, par2, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func4_t(&slsDetector::executeTrimming, - detectors[idet],mode,par1,par2,imod,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->programFPGA(fname); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->resetFPGA(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->powerChip(ival); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { if (detectors[i]) { - ret=detectors[i]->setAutoComparatorDisableMode(ival); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<programFPGA(fname); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret == FAIL) + ret1 = FAIL; } } return ret1; } - -int multiSlsDetector::loadSettingsFile(string fname, int imod) { - int ret=OK; - - // single - { - int id=-1, im=-1; - if (decodeNMod(imod, id, im)>=0) { - if(detectors[id]){ - ret = detectors[id]->loadSettingsFile(fname, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(OK); - Task* task = new Task(new func2_t(&slsDetector::loadSettingsFile, - detectors[idet],fname,imod,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=0) { - if (detectors[id]) { - ret = detectors[id]->saveSettingsFile(fname, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret=detectors[idet]->saveSettingsFile(fname, imod); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=0) { - if(detectors[id]){ - ret = detectors[id]->setAllTrimbits(val,im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func2_t(&slsDetector::setAllTrimbits, - detectors[idet],val,imod,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<=0) { - if(detectors[id]){ - ret = detectors[id]->loadCalibrationFile(fname, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(OK); - Task* task = new Task(new func2_t(&slsDetector::loadCalibrationFile, - detectors[idet],fname,imod,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<=0) { - if (detectors[id]) { - ret = detectors[id]->saveCalibrationFile(fname, im); - if(detectors[id]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret=detectors[idet]->saveCalibrationFile(fname, imod); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->writeRegister(addr,val); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->writeAdcRegister(addr,val); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret=detectors[i]->readRegister(addr); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret1=detectors[i]->setBit(addr,n); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - ret1=detectors[i]->clearBit(addr,n); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - std::cout << std::endl << "#Detector " << i << ":" << std::endl; - - ret=detectors[i]->printReceiverConfiguration(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - for (int i=0; ifreeSharedMemory(); +int multiSlsDetector::resetFPGA() +{ + int ret = OK, ret1 = OK; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->resetFPGA(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret == FAIL) + ret1 = FAIL; + } } - } - thisMultiDetector->numberOfDetectors=0; + return ret1; +} - multiSlsDetectorClient *cmd; +int multiSlsDetector::powerChip(int ival) +{ + int ret = OK, ret1 = OK; + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->powerChip(ival); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret == FAIL) + ret1 = FAIL; + } + } + return ret1; +} - setAcquiringFlag(false); - clearAllErrorMask(); +int multiSlsDetector::setAutoComparatorDisableMode(int ival) +{ + int ret = OK, ret1 = OK; - string ans; - string str; - ifstream infile; - int iargval; - int interrupt=0; - char *args[1000]; + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->setAutoComparatorDisableMode(ival); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret == FAIL) + ret1 = FAIL; + } + } + return ret1; +} - char myargs[1000][1000]; +int multiSlsDetector::loadSettingsFile(string fname, int imod) +{ + int ret = OK; - - string sargname, sargval; - int iline=0; - std::cout<< "config file name "<< fname << std::endl; - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - - - while (infile.good() and interrupt==0) { - sargname="none"; - sargval="0"; - getline(infile,str); - ++iline; -#ifdef VERBOSE - std::cout<< str << std::endl; -#endif - if (str.find('#')!=string::npos) { -#ifdef VERBOSE - std::cout<< "Line is a comment " << std::endl; - std::cout<< str << std::endl; -#endif - continue; - } else if (str.length()<2) { -#ifdef VERBOSE - std::cout<< "Empty line " << std::endl; -#endif - continue; - } else { - istringstream ssstr(str); - iargval=0; - while (ssstr.good()) { - ssstr >> sargname; - //if (ssstr.good()) { -#ifdef VERBOSE - std::cout<< iargval << " " << sargname << std::endl; -#endif - - strcpy(myargs[iargval], sargname.c_str()); - args[iargval]=myargs[iargval]; - -#ifdef VERBOSE - std::cout<< "--" << iargval << " " << args[iargval] << std::endl; -#endif - - ++iargval; - //} - } - -#ifdef VERBOSE - cout << endl; - for (int ia=0; ia= 0) { + if (detectors[id]) { + ret = detectors[id]->loadSettingsFile(fname, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } } + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } + int* iret[thisMultiDetector->numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(OK); + Task* task = new Task(new func2_t(&slsDetector::loadSettingsFile, + detectors[idet], fname, imod, 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 (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + return ret; +} - infile.close(); +int multiSlsDetector::saveSettingsFile(string fname, int imod) +{ + int id = -1, im = -1, ret; - //if(getDetectorsType() != MYTHEN) - // printReceiverConfiguration(); + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->saveSettingsFile(fname, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret = detectors[idet]->saveSettingsFile(fname, imod); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + return ret; +} - } else { - std::cout<< "Error opening configuration file " << fname << " for reading" << std::endl; - setErrorMask(getErrorMask()|MULTI_CONFIG_FILE_ERROR); - return FAIL; - } +int multiSlsDetector::setAllTrimbits(int val, int imod) +{ + + int ret = -100; + + // single + { + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->setAllTrimbits(val, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + } + + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } + 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 func2_t(&slsDetector::setAllTrimbits, + detectors[idet], val, imod, 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::loadCalibrationFile(string fname, int imod) +{ + int ret = OK; + + // single + { + int id = -1, im = -1; + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->loadCalibrationFile(fname, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + } + + // multi + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } + + int* iret[thisMultiDetector->numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(OK); + Task* task = new Task(new func2_t(&slsDetector::loadCalibrationFile, + detectors[idet], fname, imod, 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 (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + + return ret; +} + +int multiSlsDetector::saveCalibrationFile(string fname, int imod) +{ + int id = -1, im = -1, ret; + + if (decodeNMod(imod, id, im) >= 0) { + if (detectors[id]) { + ret = detectors[id]->saveCalibrationFile(fname, im); + if (detectors[id]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << id)); + return ret; + } + return -1; + } + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret = detectors[idet]->saveCalibrationFile(fname, imod); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + return ret; +} + +uint32_t multiSlsDetector::writeRegister(uint32_t addr, uint32_t val) +{ + + uint32_t ret, ret1; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->writeRegister(addr, val); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (i == 0) + ret1 = ret; + else if (ret != ret1) { + // not setting it to -1 as it is a possible value + std::cout << "Error: Different Values for function writeRegister [" << ret << "," << ret1 << "]" << endl; + setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); + } + } + } + + return ret1; +} + +int multiSlsDetector::writeAdcRegister(int addr, int val) +{ + + int ret, ret1 = -100; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->writeAdcRegister(addr, val); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) { + // not setting it to -1 as it is a possible value + std::cout << "Error: Different Values for function writeAdcRegister [" << ret << "," << ret1 << "]" << endl; + setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); + } + } + } + + return ret1; +} + +uint32_t multiSlsDetector::readRegister(uint32_t addr) +{ + + uint32_t ret, ret1; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret = detectors[i]->readRegister(addr); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (i == 0) + ret1 = ret; + else if (ret != ret1) { + // not setting it to -1 as it is a possible value + std::cout << "Error: Different Values for function readRegister [" << ret << "," << ret1 << "]" << endl; + setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); + } + } + } + + return ret1; +} + +uint32_t multiSlsDetector::setBit(uint32_t addr, int n) +{ + uint32_t ret, ret1; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret1 = detectors[i]->setBit(addr, n); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (i == 0) + ret = ret1; + else if (ret != ret1) { + // not setting it to -1 as it is a possible value + std::cout << "Error: Different Values for function setBit [" << ret << "," << ret1 << "]" << endl; + setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); + } + } + } + + return ret; +} + +uint32_t multiSlsDetector::clearBit(uint32_t addr, int n) +{ + uint32_t ret, ret1; + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + ret1 = detectors[i]->clearBit(addr, n); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (i == 0) + ret = ret1; + else if (ret != ret1) { + // not setting it to -1 as it is a possible value + std::cout << "Error: Different Values for function clearBit [" << ret << "," << ret1 << "]" << endl; + setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); + } + } + } + + return ret; +} + +int multiSlsDetector::printReceiverConfiguration() +{ + int i; + int ret, ret1 = -100; + + std::cout << "Printing Receiver configurations for all detectors..." << std::endl; + + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + std::cout << std::endl + << "#Detector " << i << ":" << std::endl; + + ret = detectors[i]->printReceiverConfiguration(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == -100) + ret1 = ret; + else if (ret != ret1) + ret1 = -1; + } + } + + return ret1; +} + +int multiSlsDetector::readConfigurationFile(string const fname) +{ + + int nd = thisMultiDetector->numberOfDetectors; + + for (int i = 0; i < nd; ++i) { + if (detectors[i]) { + detectors[i]->freeSharedMemory(); + } + } + thisMultiDetector->numberOfDetectors = 0; + + multiSlsDetectorClient* cmd; + + setAcquiringFlag(false); + clearAllErrorMask(); + + string ans; + string str; + ifstream infile; + int iargval; + int interrupt = 0; + char* args[1000]; + + char myargs[1000][1000]; + + string sargname, sargval; + int iline = 0; + std::cout << "config file name " << fname << std::endl; + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + + while (infile.good() and interrupt == 0) { + sargname = "none"; + sargval = "0"; + getline(infile, str); + ++iline; #ifdef VERBOSE - std::cout<< "Read configuration file of " << iline << " lines" << std::endl; + std::cout << str << std::endl; +#endif + if (str.find('#') != string::npos) { +#ifdef VERBOSE + std::cout << "Line is a comment " << std::endl; + std::cout << str << std::endl; +#endif + continue; + } else if (str.length() < 2) { +#ifdef VERBOSE + std::cout << "Empty line " << std::endl; +#endif + continue; + } else { + istringstream ssstr(str); + iargval = 0; + while (ssstr.good()) { + ssstr >> sargname; + //if (ssstr.good()) { +#ifdef VERBOSE + std::cout << iargval << " " << sargname << std::endl; #endif - setNumberOfModules(-1); - getMaxNumberOfModules(); + strcpy(myargs[iargval], sargname.c_str()); + args[iargval] = myargs[iargval]; - if (getErrorMask()){ - int c; - cprintf(RED,"\n----------------\n Error Messages\n----------------\n%s\n", - getErrorMessage(c).c_str()); - return FAIL; - } +#ifdef VERBOSE + std::cout << "--" << iargval << " " << args[iargval] << std::endl; +#endif - return OK; + ++iargval; + //} + } +#ifdef VERBOSE + cout << endl; + for (int ia = 0; ia < iargval; ia++) + cout << args[ia] << " ??????? "; + cout << endl; +#endif + cmd = new multiSlsDetectorClient(iargval, args, PUT_ACTION, this); + delete cmd; + } + ++iline; + } + infile.close(); + + //if(getDetectorsType() != MYTHEN) + // printReceiverConfiguration(); + + } else { + std::cout << "Error opening configuration file " << fname << " for reading" << std::endl; + setErrorMask(getErrorMask() | MULTI_CONFIG_FILE_ERROR); + return FAIL; + } +#ifdef VERBOSE + std::cout << "Read configuration file of " << iline << " lines" << std::endl; +#endif + + setNumberOfModules(-1); + getMaxNumberOfModules(); + + if (getErrorMask()) { + int c; + cprintf(RED, "\n----------------\n Error Messages\n----------------\n%s\n", + getErrorMessage(c).c_str()); + return FAIL; + } + + return OK; }; +int multiSlsDetector::writeConfigurationFile(string const fname) +{ + string names[] = { + "detsizechan", + "hostname", + "master", + "sync", + "outdir", + "ffdir", + "headerbefore", + "headerafter", + "headerbeforepar", + "headerafterpar", + "badchannels", + "angconv", + "globaloff", + "binsize", + "threaded" + }; + int nvar = 15; + char* args[100]; + for (int ia = 0; ia < 100; ++ia) { + args[ia] = new char[1000]; + } + int ret = OK, ret1 = OK; + ofstream outfile; + int iline = 0; -int multiSlsDetector::writeConfigurationFile(string const fname){ + outfile.open(fname.c_str(), ios_base::out); + if (outfile.is_open()) { - string names[]={ \ - "detsizechan", \ - "hostname", \ - "master", \ - "sync", \ - "outdir", \ - "ffdir", \ - "headerbefore", \ - "headerafter", \ - "headerbeforepar", \ - "headerafterpar", \ - "badchannels", \ - "angconv", \ - "globaloff", \ - "binsize", \ - "threaded" }; + slsDetectorCommand* cmd = new slsDetectorCommand(this); - int nvar=15; - char *args[100]; - for (int ia=0; ia<100; ++ia) { - args[ia]=new char[1000]; - } - int ret=OK,ret1=OK; + // complete size of detector + cout << iline << " " << names[iline] << endl; + strcpy(args[0], names[iline].c_str()); + outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; + ++iline; + // hostname of the detectors + cout << iline << " " << names[iline] << endl; + strcpy(args[0], names[iline].c_str()); + outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; + ++iline; + // single detector configuration + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + // sprintf(ext,".det%d",i); + if (detectors[i]) { + outfile << endl; + ret1 = detectors[i]->writeConfigurationFile(outfile, i); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 == FAIL) + ret = FAIL; + } + } - ofstream outfile; - int iline = 0; + outfile << endl; + //other configurations + while (iline < nvar) { + cout << iline << " " << names[iline] << endl; + strcpy(args[0], names[iline].c_str()); + outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; + ++iline; + } - outfile.open(fname.c_str(),ios_base::out); - if (outfile.is_open()) { - - - - slsDetectorCommand *cmd=new slsDetectorCommand(this); - - // complete size of detector - cout << iline << " " << names[iline] << endl; - strcpy(args[0],names[iline].c_str()); - outfile << names[iline] << " " << cmd->executeLine(1,args,GET_ACTION) << std::endl; - ++iline; - - // hostname of the detectors - cout << iline << " " << names[iline] << endl; - strcpy(args[0],names[iline].c_str()); - outfile << names[iline] << " " << cmd->executeLine(1,args,GET_ACTION) << std::endl; - ++iline; - - // single detector configuration - for (int i=0; inumberOfDetectors; ++i) { - // sprintf(ext,".det%d",i); - if (detectors[i]) { - outfile << endl; - ret1 = detectors[i]->writeConfigurationFile(outfile,i); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<executeLine(1,args,GET_ACTION) << std::endl; - ++iline; - } - - - - delete cmd; - outfile.close(); + delete cmd; + outfile.close(); #ifdef VERBOSE - std::cout<< "wrote " <numberOfDetectors; ++i) { - - if (detectors[i]) { - n=detectors[i]->getTotalNumberOfChannels(); - if (nch_leftwriteDataFile(outfile,n, data+off, pe, pa, dataformat, choff); - fileIOStatic::writeDataFile(outfile,n, data+off, pe, pa, dataformat, choff); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - - off+=n; - - if (pe) - pe=err+off; - - if (pa) - pa=ang+off; - - } - - } - outfile.close(); - return OK; } else { - std::cout<< "Could not open file " << fname << "for writing"<< std::endl; - return FAIL; - } -} - - -int multiSlsDetector::writeDataFile(string fname, int *data) { - ofstream outfile; - int choff=0, off=0; - -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to write raw data file " << endl; -#endif - - if (data==NULL) - return FAIL; - - outfile.open (fname.c_str(),ios_base::out); - if (outfile.is_open()) - { - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { -#ifdef VERBOSE - cout << " write " << i << " position " << off << " offset " << choff << endl; -#endif - detectors[i]->writeDataFile(outfile, detectors[i]->getTotalNumberOfChannels(), data+off, choff); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - off+=detectors[i]->getTotalNumberOfChannels(); - } - } - - - outfile.close(); - return OK; - } else { - std::cout<< "Could not open file " << fname << "for writing"<< std::endl; - return FAIL; - } -} - - -int multiSlsDetector::readDataFile(string fname, double *data, double *err, double *ang, char dataformat){ - -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to read formatted data file " << endl; -#endif - - ifstream infile; - int iline=0;//ichan, - //int interrupt=0; - string str; - int choff=0, off=0; - double *pe=err, *pa=ang; - -#ifdef VERBOSE - std::cout<< "Opening file "<< fname << std::endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - iline+=detectors[i]->readDataFile(detectors[i]->getTotalNumberOfChannels(), infile, data+off, pe, pa, dataformat, choff); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - off+=detectors[i]->getTotalNumberOfChannels(); - if (pe) - pe=pe+off; - if (pa) - pa=pa+off; - } + std::cout << "Error opening configuration file " << fname << " for writing" << std::endl; + setErrorMask(getErrorMask() | MULTI_CONFIG_FILE_ERROR); + ret = FAIL; } - - infile.close(); - } else { - std::cout<< "Could not read file " << fname << std::endl; - return -1; - } - return iline; - -} - -int multiSlsDetector::readDataFile(string fname, int *data) { - -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to read raw data file " << endl; -#endif - - ifstream infile; - int iline=0;//ichan, - //int interrupt=0; - string str; - int choff=0, off=0; - -#ifdef VERBOSE - std::cout<< "Opening file "<< fname << std::endl; -#endif - infile.open(fname.c_str(), ios_base::in); - if (infile.is_open()) { - - for (int i=0; inumberOfDetectors; ++i) { - if (detectors[i]) { - iline+=detectors[i]->readDataFile(infile, data+off,detectors[i]->getTotalNumberOfChannels(), choff); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<getMaxNumberOfChannels(); - off+=detectors[i]->getTotalNumberOfChannels(); - } + for (int ia = 0; ia < 100; ++ia) { + delete[] args[ia]; } - infile.close(); - } else { - std::cout<< "Could not read file " << fname << std::endl; - return -1; - } - return iline; + + return ret; } +int multiSlsDetector::writeDataFile(string fname, double* data, double* err, double* ang, char dataformat, int nch) +{ +#ifdef VERBOSE + cout << "using overloaded multiSlsDetector function to write formatted data file " << getTotalNumberOfChannels() << endl; +#endif + ofstream outfile; + int choff = 0, off = 0; //idata, + double *pe = err, *pa = ang; + int nch_left = nch, n; //, nd; + if (nch_left <= 0) + nch_left = getTotalNumberOfChannels(); + + if (data == NULL) + return FAIL; + + outfile.open(fname.c_str(), ios_base::out); + if (outfile.is_open()) { + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + + if (detectors[i]) { + n = detectors[i]->getTotalNumberOfChannels(); + if (nch_left < n) + n = nch_left; + +#ifdef VERBOSE + cout << " write " << i << " position " << off << " offset " << choff << endl; +#endif + //detectors[i]->writeDataFile(outfile,n, data+off, pe, pa, dataformat, choff); + fileIOStatic::writeDataFile(outfile, n, data + off, pe, pa, dataformat, choff); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + + nch_left -= n; + + choff += detectors[i]->getMaxNumberOfChannels(); + + off += n; + + if (pe) + pe = err + off; + + if (pa) + pa = ang + off; + } + } + outfile.close(); + return OK; + } else { + std::cout << "Could not open file " << fname << "for writing" << std::endl; + return FAIL; + } +} + +int multiSlsDetector::writeDataFile(string fname, int* data) +{ + ofstream outfile; + int choff = 0, off = 0; + +#ifdef VERBOSE + cout << "using overloaded multiSlsDetector function to write raw data file " << endl; +#endif + + if (data == NULL) + return FAIL; + + outfile.open(fname.c_str(), ios_base::out); + if (outfile.is_open()) { + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { +#ifdef VERBOSE + cout << " write " << i << " position " << off << " offset " << choff << endl; +#endif + detectors[i]->writeDataFile(outfile, detectors[i]->getTotalNumberOfChannels(), data + off, choff); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + choff += detectors[i]->getMaxNumberOfChannels(); + off += detectors[i]->getTotalNumberOfChannels(); + } + } + + outfile.close(); + return OK; + } else { + std::cout << "Could not open file " << fname << "for writing" << std::endl; + return FAIL; + } +} + +int multiSlsDetector::readDataFile(string fname, double* data, double* err, double* ang, char dataformat) +{ + +#ifdef VERBOSE + cout << "using overloaded multiSlsDetector function to read formatted data file " << endl; +#endif + + ifstream infile; + int iline = 0; //ichan, + //int interrupt=0; + string str; + int choff = 0, off = 0; + double *pe = err, *pa = ang; + +#ifdef VERBOSE + std::cout << "Opening file " << fname << std::endl; +#endif + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + iline += detectors[i]->readDataFile(detectors[i]->getTotalNumberOfChannels(), infile, data + off, pe, pa, dataformat, choff); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + choff += detectors[i]->getMaxNumberOfChannels(); + off += detectors[i]->getTotalNumberOfChannels(); + if (pe) + pe = pe + off; + if (pa) + pa = pa + off; + } + } + + infile.close(); + } else { + std::cout << "Could not read file " << fname << std::endl; + return -1; + } + return iline; +} + +int multiSlsDetector::readDataFile(string fname, int* data) +{ + +#ifdef VERBOSE + cout << "using overloaded multiSlsDetector function to read raw data file " << endl; +#endif + + ifstream infile; + int iline = 0; //ichan, + //int interrupt=0; + string str; + int choff = 0, off = 0; + +#ifdef VERBOSE + std::cout << "Opening file " << fname << std::endl; +#endif + infile.open(fname.c_str(), ios_base::in); + if (infile.is_open()) { + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + iline += detectors[i]->readDataFile(infile, data + off, detectors[i]->getTotalNumberOfChannels(), choff); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + choff += detectors[i]->getMaxNumberOfChannels(); + off += detectors[i]->getTotalNumberOfChannels(); + } + } + infile.close(); + } else { + std::cout << "Could not read file " << fname << std::endl; + return -1; + } + return iline; +} //receiver +int multiSlsDetector::setReceiverOnline(int off) +{ -int multiSlsDetector::setReceiverOnline(int off) { - - if (off != GET_ONLINE_FLAG) { - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setReceiverOnline, - detectors[idet],off,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<receiverOnlineFlag=ret; - } - return thisMultiDetector->receiverOnlineFlag; -} - - - -string multiSlsDetector::checkReceiverOnline() { - string retval1 = "",retval; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - retval=detectors[idet]->checkReceiverOnline(); - if(!retval.empty()){ - retval1.append(retval); - retval1.append("+"); - } + if (off != GET_ONLINE_FLAG) { + 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(&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 retval1; + return thisMultiDetector->receiverOnlineFlag; } - - - -string multiSlsDetector::setFilePath(string s) { - - string ret="errorerror", ret1; - //if the sls file paths are different, it should be realized by always using setfilepath even if string empty - //if(!s.empty()){ - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setFilePath(s); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + retval = detectors[idet]->checkReceiverOnline(); + if (!retval.empty()) { + retval1.append(retval); + retval1.append("+"); + } + } + } + return retval1; } +string multiSlsDetector::setFilePath(string s) +{ + string ret = "errorerror", ret1; + //if the sls file paths are different, it should be realized by always using setfilepath even if string empty + //if(!s.empty()){ -string multiSlsDetector::setFileName(string s) { + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setFilePath(s); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == "errorerror") + ret = ret1; + else if (ret != ret1) + ret = ""; + } + } + fileIO::setFilePath(ret); + //} - string ret = "error"; - int posmax = thisMultiDetector->numberOfDetectors; + return fileIO::getFilePath(); +} - if(!s.empty()){ - fileIO::setFileName(s); - if (thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) - s=createReceiverFilePrefix(); - } +string multiSlsDetector::setFileName(string s) +{ - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return string(""); - } else { - string* sret[thisMultiDetector->numberOfDetectors]; - for(int idet=0; idet(&slsDetector::setFileName, - detectors[idet],s,sret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - if ((thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) && ((ret != "error") || (ret != ""))) { + if (!s.empty()) { + fileIO::setFileName(s); + if (thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) + s = createReceiverFilePrefix(); + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return string(""); + } else { + string* sret[thisMultiDetector->numberOfDetectors]; + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + sret[idet] = new string("error"); + Task* task = new Task(new func1_t(&slsDetector::setFileName, + detectors[idet], s, sret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (sret[idet] != NULL) { + if (ret == "error") + ret = *sret[idet]; + else if (ret != *sret[idet]) + ret = ""; + delete sret[idet]; + } else + ret = ""; + //doing nothing with the return values + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + if ((thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) && ((ret != "error") || (ret != ""))) { #ifdef VERBOSE - std::cout << "Complete file prefix from receiver: " << ret << std::endl; + std::cout << "Complete file prefix from receiver: " << ret << std::endl; #endif - fileIO::setFileName(getNameFromReceiverFilePrefix(ret)); - } - - return ret; -} - - - -int multiSlsDetector::setReceiverFramesPerFile(int f) { - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setReceiverFramesPerFile, - detectors[idet],f,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=(int)detectors[idet]->setFileFormat(f); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setFileIndex, - detectors[idet],i,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax-posmin]; - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startReceiver, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->startReceiver(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - i=thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret1=detectors[i]->stopReceiver(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::stopReceiver, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - }else ret = FAIL; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - s1=detectors[i]->startReceiverReadout(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) { - if (detectors[i]) { - s=detectors[i]->startReceiverReadout(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - i=thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition>=0) { - if (detectors[i]) { - ret=detectors[i]->getReceiverStatus(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition) && (detectors[idet])){ - iret[idet]= new runStatus(ERROR); - Task* task = new Task(new func0_t(&slsDetector::getReceiverStatus, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=posmin; idetmasterPosition) && (detectors[idet])){ - if(iret[idet] != NULL){ - if(*iret[idet] == (int)ERROR) - ret = ERROR; - if(*iret[idet] != IDLE) - ret = *iret[idet]; - delete iret[idet]; - }else ret = ERROR; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<masterPosition; - - if (i >=0 ) { - if (detectors[i]){ - ret=detectors[i]->getFramesCaughtByReceiver(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++i) - if (detectors[i]){ - ret=detectors[i]->getFramesCaughtByReceiver(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - }else{ - int* iret[posmax]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(0); - Task* task = new Task(new func0_t(&slsDetector::getFramesCaughtByReceiver, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for(int idet=0; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors) || (ret == -1)) - return ret; - - ret=(int)(ret1/thisMultiDetector->numberOfDetectors); - return ret; -} - - - -int multiSlsDetector::getReceiverCurrentFrameIndex() { - int ret=0,ret1=0; - for (int i=0; inumberOfDetectors; ++i) - if (detectors[i]){ - ret1+=detectors[i]->getReceiverCurrentFrameIndex(); - if(detectors[i]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors) - return ret; - ret=(int)(ret1/thisMultiDetector->numberOfDetectors); - return ret; + return ret; } - - -int multiSlsDetector::resetFramesCaught() { - - int ret=OK; - int posmax = thisMultiDetector->numberOfDetectors; - - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - }else{ - int* iret[posmax]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(OK); - Task* task = new Task(new func0_t(&slsDetector::resetFramesCaught, - detectors[idet],iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for(int idet=0; idetgetErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func1_t(&slsDetector::setReceiverFramesPerFile, + detectors[idet], f, 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; } +slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) +{ + int ret = -100, ret1; - -int multiSlsDetector::createReceivingDataSockets(const bool destroy){ - - //number of sockets - int numSockets = thisMultiDetector->numberOfDetectors; - int numSocketsPerDetector = 1; - if(getDetectorsType() == EIGER){ - numSocketsPerDetector = 2; - } - numSockets *= numSocketsPerDetector; - - if(destroy){ - cprintf(MAGENTA,"Going to destroy data sockets\n"); - //close socket - for(int i=0;igetClientStreamingPort().c_str(),"%d",&portnum); - portnum += (i%numSocketsPerDetector); - //cout<<"ip to be set to :"<getClientStreamingIP().c_str()<getClientStreamingIP().c_str(), portnum); - } catch(...) { - cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum); - createReceivingDataSockets(true); - return FAIL; - } - printf("Zmq Client[%d] at %s\n",i, zmqSocket[i]->GetZmqServerAddress()); - } - - client_downstream = true; - cout << "Receiving Data Socket(s) created" << endl; - return OK; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = (int)detectors[idet]->setFileFormat(f); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + return (fileFormat)ret; } +int multiSlsDetector::setFileIndex(int i) +{ + 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(&slsDetector::setFileIndex, + detectors[idet], i, 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::startReceiver() +{ + int i = 0; + int ret = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; -void multiSlsDetector::readFrameFromReceiver(){ + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::startReceiver, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } - int nX = thisMultiDetector->numberOfDetector[X]; // to copy data in multi module - int nY = thisMultiDetector->numberOfDetector[Y]; // for eiger, to reverse the data - int numSockets = thisMultiDetector->numberOfDetectors; + //master + int ret1 = OK; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->startReceiver(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + return ret; +} + +int multiSlsDetector::stopReceiver() +{ + int i = 0; + int ret = OK, ret1 = OK; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret1 = detectors[i]->stopReceiver(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (ret1 != OK) + ret = FAIL; + } + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::stopReceiver, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + return ret; +} + +slsDetectorDefs::runStatus multiSlsDetector::startReceiverReadout() +{ + int i = 0; + runStatus s = IDLE, s1 = IDLE; + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + s1 = detectors[i]->startReceiverReadout(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + } + } + for (i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { + if (detectors[i]) { + s = detectors[i]->startReceiverReadout(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + if (s == ERROR) + s1 = ERROR; + /*if(s1 != s) + s1 = ERROR;*/ + if (s != IDLE) + s1 = s; + } + } + + /**stoppedFlag=1;*/ + return s1; +} + +slsDetectorDefs::runStatus multiSlsDetector::getReceiverStatus() +{ + int i = 0; + runStatus ret = IDLE; + int posmin = 0, posmax = thisMultiDetector->numberOfDetectors; + + i = thisMultiDetector->masterPosition; + if (thisMultiDetector->masterPosition >= 0) { + if (detectors[i]) { + ret = detectors[i]->getReceiverStatus(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + return ret; + } + } + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return ERROR; + } else { + runStatus* iret[posmax - posmin]; + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + iret[idet] = new runStatus(ERROR); + Task* task = new Task(new func0_t(&slsDetector::getReceiverStatus, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + for (int idet = posmin; idet < posmax; ++idet) { + if ((idet != thisMultiDetector->masterPosition) && (detectors[idet])) { + if (iret[idet] != NULL) { + if (*iret[idet] == (int)ERROR) + ret = ERROR; + if (*iret[idet] != IDLE) + ret = *iret[idet]; + delete iret[idet]; + } else + ret = ERROR; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + return ret; +} + +int multiSlsDetector::getFramesCaughtByAnyReceiver() +{ + + int ret = 0; + int i = thisMultiDetector->masterPosition; + + if (i >= 0) { + if (detectors[i]) { + ret = detectors[i]->getFramesCaughtByReceiver(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + // return master receivers frames caught + return ret; + } + } + + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) + if (detectors[i]) { + ret = detectors[i]->getFramesCaughtByReceiver(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + // return the first one that works + return ret; + } + + return -1; +} + +int multiSlsDetector::getFramesCaughtByReceiver() +{ + + int ret = 0, ret1 = 0; + int posmax = thisMultiDetector->numberOfDetectors; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + int* iret[posmax]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(0); + Task* task = new Task(new func0_t(&slsDetector::getFramesCaughtByReceiver, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (*iret[idet] == -1) // could not connect + ret = -1; + else + ret1 += (*iret[idet]); + delete iret[idet]; + } else + ret = -1; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + if ((!thisMultiDetector->numberOfDetectors) || (ret == -1)) + return ret; + + ret = (int)(ret1 / thisMultiDetector->numberOfDetectors); + return ret; +} + +int multiSlsDetector::getReceiverCurrentFrameIndex() +{ + int ret = 0, ret1 = 0; + for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) + if (detectors[i]) { + ret1 += detectors[i]->getReceiverCurrentFrameIndex(); + if (detectors[i]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << i)); + } + if (!thisMultiDetector->numberOfDetectors) + return ret; + ret = (int)(ret1 / thisMultiDetector->numberOfDetectors); + + return ret; +} + +int multiSlsDetector::resetFramesCaught() +{ + + int ret = OK; + int posmax = thisMultiDetector->numberOfDetectors; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return FAIL; + } else { + int* iret[posmax]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(OK); + Task* task = new Task(new func0_t(&slsDetector::resetFramesCaught, + detectors[idet], iret[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + + for (int idet = 0; idet < posmax; ++idet) { + if (detectors[idet]) { + if (iret[idet] != NULL) { + if (*iret[idet] != OK) + ret = FAIL; + delete iret[idet]; + } else + ret = FAIL; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + return ret; +} + +int multiSlsDetector::createReceivingDataSockets(const bool destroy) +{ + + //number of sockets + int numSockets = thisMultiDetector->numberOfDetectors; + int numSocketsPerDetector = 1; + if (getDetectorsType() == EIGER) { + numSocketsPerDetector = 2; + } + numSockets *= numSocketsPerDetector; + + if (destroy) { + cprintf(MAGENTA, "Going to destroy data sockets\n"); + //close socket + for (int i = 0; i < MAXDET; ++i) { + if (zmqSocket[i]) { + delete zmqSocket[i]; + zmqSocket[i] = 0; + } + } + client_downstream = false; + cout << "Destroyed Receiving Data Socket(s)" << endl; + return OK; + } + + cprintf(MAGENTA, "Going to create data sockets\n"); + + for (int i = 0; i < numSockets; ++i) { + uint32_t portnum = 0; + sscanf(detectors[i / numSocketsPerDetector]->getClientStreamingPort().c_str(), "%d", &portnum); + portnum += (i % numSocketsPerDetector); + //cout<<"ip to be set to :"<getClientStreamingIP().c_str()<getClientStreamingIP().c_str(), portnum); + } catch (...) { + cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum); + createReceivingDataSockets(true); + return FAIL; + } + printf("Zmq Client[%d] at %s\n", i, zmqSocket[i]->GetZmqServerAddress()); + } + + client_downstream = true; + cout << "Receiving Data Socket(s) created" << endl; + return OK; +} + +void multiSlsDetector::readFrameFromReceiver() +{ + + int nX = thisMultiDetector->numberOfDetector[X]; // to copy data in multi module + int nY = thisMultiDetector->numberOfDetector[Y]; // for eiger, to reverse the data + int numSockets = thisMultiDetector->numberOfDetectors; bool gappixelsenable = false; - bool eiger = false; + bool eiger = false; if (getDetectorsType() == EIGER) { eiger = true; nX *= 2; numSockets *= 2; - gappixelsenable = detectors[0]->enableGapPixels(-1) >= 1 ? true: false; + gappixelsenable = detectors[0]->enableGapPixels(-1) >= 1 ? true : false; } bool runningList[numSockets], connectList[numSockets]; int numRunning = 0; - for(int i = 0; i < numSockets; ++i) { - if(!zmqSocket[i]->Connect()) { + for (int i = 0; i < numSockets; ++i) { + if (!zmqSocket[i]->Connect()) { connectList[i] = true; runningList[i] = true; ++numRunning; } else { // to remember the list it connected to, to disconnect later connectList[i] = false; - cprintf(RED,"Error: Could not connect to socket %s\n",zmqSocket[i]->GetZmqServerAddress()); + cprintf(RED, "Error: Could not connect to socket %s\n", zmqSocket[i]->GetZmqServerAddress()); runningList[i] = false; } } - int numConnected = numRunning; - bool data = false; - char* image = NULL; - char* multiframe = NULL; + int numConnected = numRunning; + bool data = false; + char* image = NULL; + char* multiframe = NULL; char* multigappixels = NULL; - int multisize = 0; + int multisize = 0; // only first message header uint32_t size = 0, nPixelsX = 0, nPixelsY = 0, dynamicRange = 0; float bytesPerPixel = 0; // header info every header - string currentFileName = ""; + string currentFileName = ""; uint64_t currentAcquisitionIndex = -1, currentFrameIndex = -1, currentFileIndex = -1; uint32_t currentSubFrameIndex = -1, coordX = -1, coordY = -1, flippedDataX = -1; //wait for real time acquisition to start bool running = true; sem_wait(&sem_newRTAcquisition); - if(checkJoinThread()) + if (checkJoinThread()) running = false; //exit when checkJoinThread() (all sockets done) - while(running){ + while (running) { // reset data data = false; @@ -6074,7 +5776,7 @@ void multiSlsDetector::readFrameFromReceiver(){ memset(multiframe, 0xFF, multisize); //get each frame - for(int isocket=0; isocketReceiveHeader(isocket, doc, SLS_DETECTOR_JSON_HEADER_VERSION)){ + if (!zmqSocket[isocket]->ReceiveHeader(isocket, doc, SLS_DETECTOR_JSON_HEADER_VERSION)) { zmqSocket[isocket]->CloseHeaderMessage(); // parse error, version error or end of acquisition for socket runningList[isocket] = false; @@ -6093,88 +5795,86 @@ void multiSlsDetector::readFrameFromReceiver(){ // if first message, allocate (all one time stuff) if (image == NULL) { // allocate - size = doc["size"].GetUint(); - multisize = size * numSockets; - image = new char[size]; + size = doc["size"].GetUint(); + multisize = size * numSockets; + image = new char[size]; multiframe = new char[multisize]; memset(multiframe, 0xFF, multisize); // dynamic range - dynamicRange = doc["bitmode"].GetUint(); + dynamicRange = doc["bitmode"].GetUint(); bytesPerPixel = (float)dynamicRange / 8; // shape nPixelsX = doc["shape"][0].GetUint(); nPixelsY = doc["shape"][1].GetUint(); #ifdef VERBOSE - cprintf(BLUE,"(Debug) One Time Header Info:\n" - "size: %u\n" - "multisize: %u\n" - "dynamicRange: %u\n" - "bytesPerPixel: %f\n" - "nPixelsX: %u\n" - "nPixelsY: %u\n", - size, multisize, dynamicRange, bytesPerPixel, nPixelsX, nPixelsY); + cprintf(BLUE, "(Debug) One Time Header Info:\n" + "size: %u\n" + "multisize: %u\n" + "dynamicRange: %u\n" + "bytesPerPixel: %f\n" + "nPixelsX: %u\n" + "nPixelsY: %u\n", + size, multisize, dynamicRange, bytesPerPixel, nPixelsX, nPixelsY); #endif } // each time, parse rest of header - currentFileName = doc["fname"].GetString(); + currentFileName = doc["fname"].GetString(); currentAcquisitionIndex = doc["acqIndex"].GetUint64(); - currentFrameIndex = doc["fIndex"].GetUint64(); - currentFileIndex = doc["fileIndex"].GetUint64(); - currentSubFrameIndex = doc["expLength"].GetUint(); - coordX = doc["xCoord"].GetUint(); - coordY = doc["yCoord"].GetUint(); + currentFrameIndex = doc["fIndex"].GetUint64(); + currentFileIndex = doc["fileIndex"].GetUint64(); + currentSubFrameIndex = doc["expLength"].GetUint(); + coordX = doc["xCoord"].GetUint(); + coordY = doc["yCoord"].GetUint(); if (eiger) coordY = (nY - 1) - coordY; //cout << "X:" << doc["xCoord"].GetUint() <<" Y:"<CloseHeaderMessage(); } - // DATA data = true; zmqSocket[isocket]->ReceiveData(isocket, image, size); // creating multi image { - uint32_t xoffset = coordX * nPixelsX * bytesPerPixel; - uint32_t yoffset = coordY * nPixelsY; + uint32_t xoffset = coordX * nPixelsX * bytesPerPixel; + uint32_t yoffset = coordY * nPixelsY; uint32_t singledetrowoffset = nPixelsX * bytesPerPixel; - uint32_t rowoffset = nX * singledetrowoffset; + uint32_t rowoffset = nX * singledetrowoffset; #ifdef VERBOSE - cprintf(BLUE,"(Debug) Multi Image Info:\n" - "xoffset: %u\n" - "yoffset: %u\n" - "singledetrowoffset: %u\n" - "rowoffset: %u\n", - xoffset, yoffset, singledetrowoffset, rowoffset); + cprintf(BLUE, "(Debug) Multi Image Info:\n" + "xoffset: %u\n" + "yoffset: %u\n" + "singledetrowoffset: %u\n" + "rowoffset: %u\n", + xoffset, yoffset, singledetrowoffset, rowoffset); #endif if (eiger && flippedDataX) { for (uint32_t i = 0; i < nPixelsY; ++i) { - memcpy( ((char*)multiframe) + ((yoffset + (nPixelsY - 1 - i) ) * rowoffset) + xoffset, - (char*)image + (i * singledetrowoffset), - singledetrowoffset); + memcpy(((char*)multiframe) + ((yoffset + (nPixelsY - 1 - i)) * rowoffset) + xoffset, + (char*)image + (i * singledetrowoffset), + singledetrowoffset); } - } - else { + } else { for (uint32_t i = 0; i < nPixelsY; ++i) { - memcpy( ((char*)multiframe) + ((yoffset + i ) * rowoffset) + xoffset, - (char*)image + (i * singledetrowoffset), - singledetrowoffset); + memcpy(((char*)multiframe) + ((yoffset + i) * rowoffset) + xoffset, + (char*)image + (i * singledetrowoffset), + singledetrowoffset); } } } @@ -6182,15 +5882,15 @@ void multiSlsDetector::readFrameFromReceiver(){ } //send data to callback - if(data){ + if (data) { // 4bit gap pixels if (dynamicRange == 4 && gappixelsenable) { - int n = processImageWithGapPixels(multiframe, multigappixels); + int n = processImageWithGapPixels(multiframe, multigappixels); nPixelsX = thisMultiDetector->numberOfChannelInclGapPixels[X]; nPixelsY = thisMultiDetector->numberOfChannelInclGapPixels[Y]; - thisData = new detectorData(NULL,NULL,NULL,getCurrentProgress(), - currentFileName.c_str(), nPixelsX, nPixelsY, - multigappixels, n, dynamicRange, currentFileIndex); + thisData = new detectorData(NULL, NULL, NULL, getCurrentProgress(), + currentFileName.c_str(), nPixelsX, nPixelsY, + multigappixels, n, dynamicRange, currentFileIndex); } // normal pixels else { @@ -6199,30 +5899,29 @@ void multiSlsDetector::readFrameFromReceiver(){ multiframe, multisize, dynamicRange, currentFileIndex); } dataReady(thisData, currentFrameIndex, - ((dynamicRange == 32) ? currentSubFrameIndex : -1), - pCallbackArg); + ((dynamicRange == 32) ? currentSubFrameIndex : -1), + pCallbackArg); delete thisData; setCurrentProgress(currentAcquisitionIndex + 1); } //all done - if(!numRunning){ + if (!numRunning) { // let main thread know that all dummy packets have been received (also from external process), // main thread can now proceed to measurement finished call back sem_post(&sem_endRTAcquisition); // wait for next scan/measurement, else join thread sem_wait(&sem_newRTAcquisition); //done with complete acquisition - if(checkJoinThread()) + if (checkJoinThread()) running = false; - else{ + else { //starting a new scan/measurement (got dummy data) - for(int i = 0; i < numSockets; ++i) + for (int i = 0; i < numSockets; ++i) runningList[i] = connectList[i]; numRunning = numConnected; } } - } // Disconnect resources @@ -6231,758 +5930,725 @@ void multiSlsDetector::readFrameFromReceiver(){ zmqSocket[i]->Disconnect(); //free resources - if (image != NULL) delete [] image; - if (multiframe != NULL) delete [] multiframe; - if (multigappixels != NULL) delete [] multigappixels; + if (image != NULL) + delete[] image; + if (multiframe != NULL) + delete[] multiframe; + if (multigappixels != NULL) + delete[] multigappixels; } - /** eiger 4 bit mode */ -int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) { - int nxb = thisMultiDetector->numberOfDetector[X] * (512 + 3); - int nyb = thisMultiDetector->numberOfDetector[Y] * (256 + 1); - int gapdatabytes = nxb * nyb; +int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) +{ + int nxb = thisMultiDetector->numberOfDetector[X] * (512 + 3); + int nyb = thisMultiDetector->numberOfDetector[Y] * (256 + 1); + int gapdatabytes = nxb * nyb; - int nxchip = thisMultiDetector->numberOfDetector[X] * 4; - int nychip = thisMultiDetector->numberOfDetector[Y] * 1; + int nxchip = thisMultiDetector->numberOfDetector[X] * 4; + int nychip = thisMultiDetector->numberOfDetector[Y] * 1; - // allocate - if (gpImage == NULL) - gpImage = new char[gapdatabytes]; - // fill value - memset(gpImage, 0xFF, gapdatabytes); + // allocate + if (gpImage == NULL) + gpImage = new char[gapdatabytes]; + // fill value + memset(gpImage, 0xFF, gapdatabytes); + const int b1chipx = 128; + const int b1chipy = 256; + char* src = 0; + char* dst = 0; - const int b1chipx = 128; - const int b1chipy = 256; - char* src = 0; - char* dst = 0; + // copying line by line + src = image; + dst = gpImage; + for (int row = 0; row < nychip; ++row) { // for each chip in a row + for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { //for each row in a chip + for (int col = 0; col < nxchip; ++col) { + memcpy(dst, src, b1chipx); + src += b1chipx; + dst += b1chipx; + if ((col + 1) % 4) + ++dst; + } + } - - // copying line by line - src = image; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { //for each row in a chip - for (int col = 0; col < nxchip; ++col) { - memcpy(dst, src, b1chipx); - src += b1chipx; - dst += b1chipx; - if ((col+1)%4) - ++dst; - } - } - - dst += (2 * nxb); - } - - - - // vertical filling of values - { - uint8_t temp, g1, g2; - int mod; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { //for each row in a chip - for (int col = 0; col < nxchip; ++col) { - dst += b1chipx; - mod = (col+1)%4; - // copy gap pixel(chip 0, 1, 2) - if (mod) { - // neighbouring gap pixels to left - temp = (*((uint8_t*)(dst-1))); - g1 = ((temp & 0xF) / 2); - (*((uint8_t*)(dst-1))) = (temp & 0xF0) + g1; - - // neighbouring gap pixels to right - temp = (*((uint8_t*)(dst+1))); - g2 = ((temp >> 4) / 2); - (*((uint8_t*)(dst+1))) = (g2 << 4) + (temp & 0x0F); - - // gap pixels - (*((uint8_t*)dst)) = (g1 << 4) + g2; - - // increment to point to proper chip destination - ++dst; - } - } - } - - dst += (2 * nxb); - } - } - - //return gapdatabytes; - // horizontal filling - { - uint8_t temp, g1, g2; - char* dst_prevline = 0; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - dst += (b1chipy * nxb); - // horizontal copying of gap pixels from neighboring past line (bottom parts) - if (row < nychip-1) { - dst_prevline = dst - nxb; - for (int gapline = 0; gapline < nxb; ++gapline) { - temp = (*((uint8_t*)dst_prevline)); - g1 = ((temp >> 4) / 2); - g2 = ((temp & 0xF) / 2); - (*((uint8_t*)dst_prevline)) = (g1 << 4) + g2; - (*((uint8_t*)dst)) = (*((uint8_t*)dst_prevline)); - ++dst; - ++dst_prevline; - } - } - - // horizontal copying of gap pixels from neihboring future line (top part) - if (row > 0) { - dst -= ((b1chipy + 1) * nxb); - dst_prevline = dst + nxb; - for (int gapline = 0; gapline < nxb; ++gapline) { - temp = (*((uint8_t*)dst_prevline)); - g1 = ((temp >> 4) / 2); - g2 = ((temp & 0xF) / 2); - temp = (g1 << 4) + g2; - (*((uint8_t*)dst_prevline)) = temp; - (*((uint8_t*)dst)) = temp; - ++dst; - ++dst_prevline; - } - dst += ((b1chipy + 1) * nxb); - } - - dst += nxb; - } - } - - - - - - - return gapdatabytes; -} - - - - - -int multiSlsDetector::lockReceiver(int lock) { - - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->lockReceiver(lock); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<> 4) / 2); + (*((uint8_t*)(dst + 1))) = (g2 << 4) + (temp & 0x0F); + // gap pixels + (*((uint8_t*)dst)) = (g1 << 4) + g2; + // increment to point to proper chip destination + ++dst; + } + } + } - - -string multiSlsDetector::getReceiverLastClientIP() { - string s0="", s1="",s ; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - s=detectors[idet]->getReceiverLastClientIP(); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<> 4) / 2); + g2 = ((temp & 0xF) / 2); + (*((uint8_t*)dst_prevline)) = (g1 << 4) + g2; + (*((uint8_t*)dst)) = (*((uint8_t*)dst_prevline)); + ++dst; + ++dst_prevline; + } + } + // horizontal copying of gap pixels from neihboring future line (top part) + if (row > 0) { + dst -= ((b1chipy + 1) * nxb); + dst_prevline = dst + nxb; + for (int gapline = 0; gapline < nxb; ++gapline) { + temp = (*((uint8_t*)dst_prevline)); + g1 = ((temp >> 4) / 2); + g2 = ((temp & 0xF) / 2); + temp = (g1 << 4) + g2; + (*((uint8_t*)dst_prevline)) = temp; + (*((uint8_t*)dst)) = temp; + ++dst; + ++dst_prevline; + } + dst += ((b1chipy + 1) * nxb); + } - -int multiSlsDetector::exitReceiver() { - - int ival=FAIL, iv; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - iv=detectors[idet]->exitReceiver(); - if (iv==OK) - ival=iv; + dst += nxb; + } } - } - return ival; + + return gapdatabytes; } +int multiSlsDetector::lockReceiver(int lock) +{ + int ret = -100, ret1; -int multiSlsDetector::enableWriteToFile(int enable){ - int ret=-100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->lockReceiver(lock); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->enableWriteToFile(enable); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + s = detectors[idet]->getReceiverLastClientIP(); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); -int multiSlsDetector::overwriteFile(int enable){ - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->overwriteFile(enable); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + iv = detectors[idet]->exitReceiver(); + if (iv == OK) + ival = iv; + } + } + return ival; +} +int multiSlsDetector::enableWriteToFile(int enable) +{ + int ret = -100, ret1; -string multiSlsDetector::getErrorMessage(int &critical){ + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->enableWriteToFile(enable); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } - int64_t multiMask,slsMask=0; - string retval=""; - char sNumber[100]; - critical=0; + return ret; +} - multiMask = getErrorMask(); - if(multiMask){ - if(multiMask & MULTI_DETECTORS_NOT_ADDED) { - retval.append("Detectors not added:\n"+string(getNotAddedList())+string("\n")); - critical = 1; - } - if(multiMask & MULTI_HAVE_DIFFERENT_VALUES) { - retval.append("A previous multi detector command gave different values\n" - "Please check the console\n"); - critical = 0; - } - if(multiMask & MULTI_CONFIG_FILE_ERROR) { - retval.append("Could not load Config File\n"); - critical = 0; - } +int multiSlsDetector::overwriteFile(int enable) +{ + int ret = -100, ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - //if the detector has error - if(multiMask&(1<getErrorMask(); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->overwriteFile(enable); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } + + return ret; +} + +string multiSlsDetector::getErrorMessage(int& critical) +{ + + int64_t multiMask, slsMask = 0; + string retval = ""; + char sNumber[100]; + critical = 0; + + multiMask = getErrorMask(); + if (multiMask) { + if (multiMask & MULTI_DETECTORS_NOT_ADDED) { + retval.append("Detectors not added:\n" + string(getNotAddedList()) + string("\n")); + critical = 1; + } + if (multiMask & MULTI_HAVE_DIFFERENT_VALUES) { + retval.append("A previous multi detector command gave different values\n" + "Please check the console\n"); + critical = 0; + } + if (multiMask & MULTI_CONFIG_FILE_ERROR) { + retval.append("Could not load Config File\n"); + critical = 0; + } + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + //if the detector has error + if (multiMask & (1 << idet)) { + //append detector id + sprintf(sNumber, "%d", idet); + retval.append("Detector " + string(sNumber) + string(":\n")); + //get sls det error mask + slsMask = detectors[idet]->getErrorMask(); #ifdef VERYVERBOSE - //append sls det error mask - sprintf(sNumber,"0x%lx",slsMask); - retval.append("Error Mask " + string(sNumber)+string("\n")); + //append sls det error mask + sprintf(sNumber, "0x%lx", slsMask); + retval.append("Error Mask " + string(sNumber) + string("\n")); #endif - //get the error critical level - if((slsMask>0xFFFFFFFF)|critical) - critical = 1; - //append error message - retval.append(errorDefs::getErrorMessage(slsMask)); - - } - } - } - } - return retval; + //get the error critical level + if ((slsMask > 0xFFFFFFFF) | critical) + critical = 1; + //append error message + retval.append(errorDefs::getErrorMessage(slsMask)); + } + } + } + } + return retval; } +int64_t multiSlsDetector::clearAllErrorMask() +{ + clearErrorMask(); + clearNotAddedList(); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) + detectors[idet]->clearErrorMask(); -int64_t multiSlsDetector::clearAllErrorMask(){ - clearErrorMask(); - clearNotAddedList(); - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]) - detectors[idet]->clearErrorMask(); - - return getErrorMask(); + return getErrorMask(); } +int multiSlsDetector::calibratePedestal(int frames) +{ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->calibratePedestal(frames); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } -int multiSlsDetector::calibratePedestal(int frames){ - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->calibratePedestal(frames); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setReadReceiverFrequency(freq); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setReadReceiverFrequency(freq); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } - return ret; + return ret; } +int multiSlsDetector::setReceiverReadTimer(int time_in_ms) +{ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + ret1 = detectors[idet]->setReceiverReadTimer(time_in_ms); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + } -int multiSlsDetector::setReceiverReadTimer(int time_in_ms){ - int ret=-100, ret1; - - for (int idet=0; idetnumberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1=detectors[idet]->setReceiverReadTimer(time_in_ms); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<= 0){ +int multiSlsDetector::enableDataStreamingToClient(int enable) +{ + if (enable >= 0) { - //destroy data threads - if (!enable) - createReceivingDataSockets(true); + //destroy data threads + if (!enable) + createReceivingDataSockets(true); - //create data threads - else { - if(createReceivingDataSockets() == FAIL){ - std::cout << "Could not create data threads in client." << std::endl; - //only for the first det as theres no general one - setErrorMask(getErrorMask()|(1<<0)); - detectors[0]->setErrorMask((detectors[0]->getErrorMask())|(DATA_STREAMING)); - } - } - } - return client_downstream; + //create data threads + else { + if (createReceivingDataSockets() == FAIL) { + std::cout << "Could not create data threads in client." << std::endl; + //only for the first det as theres no general one + setErrorMask(getErrorMask() | (1 << 0)); + detectors[0]->setErrorMask((detectors[0]->getErrorMask()) | (DATA_STREAMING)); + } + } + } + return client_downstream; } -int multiSlsDetector::enableDataStreamingFromReceiver(int enable){ - if(enable >= 0){ - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::enableDataStreamingFromReceiver, - detectors[idet],enable,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<receiver_upstream = ret; - } +int multiSlsDetector::enableDataStreamingFromReceiver(int enable) +{ + if (enable >= 0) { + 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(&slsDetector::enableDataStreamingFromReceiver, + detectors[idet], enable, 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->receiver_upstream = ret; + } - return thisMultiDetector->receiver_upstream; + return thisMultiDetector->receiver_upstream; } -int multiSlsDetector::enableReceiverCompression(int i){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->enableReceiverCompression(i); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->enableReceiverCompression(i); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - - -int multiSlsDetector::enableTenGigabitEthernet(int i){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->enableTenGigabitEthernet(i); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->enableTenGigabitEthernet(i); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - - -int multiSlsDetector::setReceiverFifoDepth(int i){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setReceiverFifoDepth(i); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setReceiverFifoDepth(i); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - -int multiSlsDetector::setReceiverSilentMode(int i){ - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setReceiverSilentMode(i); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setReceiverSilentMode(i); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - - - - /** opens pattern file and sends pattern to CTB +/** opens pattern file and sends pattern to CTB @param fname pattern file to open @returns OK/FAIL */ -int multiSlsDetector::setCTBPattern(string fname) { +int multiSlsDetector::setCTBPattern(string fname) +{ - uint64_t word; + uint64_t word; - int addr=0; + int addr = 0; - FILE *fd=fopen(fname.c_str(),"r"); - if (fd>0) { - while (fread(&word, sizeof(word), 1,fd)) { - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - detectors[idet]->setCTBWord(addr,word); - } - // cout << hex << addr << " " << word << dec << endl; - ++addr; - } + FILE* fd = fopen(fname.c_str(), "r"); + if (fd > 0) { + while (fread(&word, sizeof(word), 1, fd)) { + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + detectors[idet]->setCTBWord(addr, word); + } + // cout << hex << addr << " " << word << dec << endl; + ++addr; + } - fclose(fd); - } else - return -1; - - - - - - return addr; + fclose(fd); + } else + return -1; + return addr; } - - /** Writes a pattern word to the CTB +/** Writes a pattern word to the CTB @param addr address of the word, -1 is I/O control register, -2 is clk control register @param word 64bit word to be written, -1 gets @returns actual value */ -uint64_t multiSlsDetector::setCTBWord(int addr,uint64_t word) { - uint64_t ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setCTBWord(addr, word); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setCTBWord(addr, word); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == (long long unsigned int)-100) + ret = ret1; + else if (ret != ret1) + ret = (long long unsigned int)-1; + } + return ret; } - - - - /** Sets the pattern or loop limits in the CTB +/** Sets the pattern or loop limits in the CTB @param level -1 complete pattern, 0,1,2, loop level @param start start address if >=0 @param stop stop address if >=0 @param n number of loops (if level >=0) @returns OK/FAIL */ -int multiSlsDetector::setCTBPatLoops(int level,int &start, int &stop, int &n) { - - - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setCTBPatLoops(level, start, stop, n); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setCTBPatLoops(level, start, stop, n); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - - /** Sets the wait address in the CTB +/** Sets the wait address in the CTB @param level 0,1,2, wait level @param addr wait address, -1 gets @returns actual value */ -int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) { - - - - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setCTBPatWaitAddr(level, addr); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setCTBPatWaitAddr(level, addr); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } - /** Sets the wait time in the CTB +/** Sets the wait time in the CTB @param level 0,1,2, wait level @param t wait time, -1 gets @returns actual value */ -int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t) { - - - int ret=-100,ret1; - for (int idet=0; idetnumberOfDetectors; ++idet) - if (detectors[idet]){ - ret1=detectors[idet]->setCTBPatWaitTime(level,t); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors; ++idet) + if (detectors[idet]) { + ret1 = detectors[idet]->setCTBPatWaitTime(level, t); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; } +int multiSlsDetector::pulsePixel(int n, int x, int y) +{ + int ret = -100; -int multiSlsDetector::pulsePixel(int n,int x,int y) { - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func3_t(&slsDetector::pulsePixel, - detectors[idet],n,x,y,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func3_t(&slsDetector::pulsePixel, + detectors[idet], n, x, y, 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::pulsePixelNMove(int n, int x, int y) +{ + int ret = -100; -int multiSlsDetector::pulsePixelNMove(int n,int x,int y) { - 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; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func3_t(&slsDetector::pulsePixelNMove, - detectors[idet],n,x,y,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<numberOfDetectors]; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + iret[idet] = new int(-1); + Task* task = new Task(new func3_t(&slsDetector::pulsePixelNMove, + detectors[idet], n, x, y, 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::pulseChip(int n) +{ + int ret = -100; -int multiSlsDetector::pulseChip(int n) { - 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(&slsDetector::pulseChip, + detectors[idet], n, 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)); + } + } + } - if(!threadpool){ - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - }else{ - //return storage values - int* iret[thisMultiDetector->numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int(-1); - Task* task = new Task(new func1_t(&slsDetector::pulseChip, - detectors[idet],n,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++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<acquiringFlag = b; +void multiSlsDetector::setAcquiringFlag(bool b) +{ + thisMultiDetector->acquiringFlag = b; } -bool multiSlsDetector::getAcquiringFlag(){ - return thisMultiDetector->acquiringFlag; +bool multiSlsDetector::getAcquiringFlag() +{ + return thisMultiDetector->acquiringFlag; } +bool multiSlsDetector::isAcquireReady() +{ + if (thisMultiDetector->acquiringFlag) { + std::cout << "Acquire has already started. If previous acquisition terminated unexpectedly, reset busy flag to restart.(sls_detector_put busy 0)" << std::endl; + return FAIL; + } -bool multiSlsDetector::isAcquireReady() { - if (thisMultiDetector->acquiringFlag) { - std::cout << "Acquire has already started. If previous acquisition terminated unexpectedly, reset busy flag to restart.(sls_detector_put busy 0)" << std::endl; - return FAIL; - } - - thisMultiDetector->acquiringFlag = true; - return OK; + thisMultiDetector->acquiringFlag = true; + return OK; } From 228d624d8f87d23e0db67e2e37629ae2c48ccf37 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 10:01:51 +0200 Subject: [PATCH 04/24] general function for returning first or concatenated string --- .../multiSlsDetector/multiSlsDetector.cpp | 61 +++++++++++++------ .../multiSlsDetector/multiSlsDetector.h | 2 +- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 678a28e0d..936e18cf9 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -639,7 +639,6 @@ string multiSlsDetector::sgetDetectorsType(int pos) int multiSlsDetector::getDetectorId(int pos) { - #ifdef VERBOSE cout << "Getting detector ID " << pos << endl; #endif @@ -653,7 +652,6 @@ int multiSlsDetector::getDetectorId(int pos) int multiSlsDetector::setDetectorId(int ival, int pos) { - if (pos >= 0) { addSlsDetector(ival, pos); if (detectors[pos]) @@ -666,7 +664,6 @@ int multiSlsDetector::setDetectorId(int ival, int pos) int multiSlsDetector::addSlsDetector(const char* name, int pos) { - detectorType t = getDetectorType(string(name)); int online = 0; slsDetector* s = NULL; @@ -3426,34 +3423,58 @@ int multiSlsDetector::exitServer() return ival; } -/** returns the detector trimbit/settings directory */ -string multiSlsDetector::getSettingsDir() +std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc)()) { - - string concatenatedDir, firstDir; - bool dirNotSame = false; - + string concatenatedValue, firstValue; + bool valueNotSame = false; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - string thisDir = detectors[idet]->getSettingsDir(); + string thisValue = (detectors[idet]->*somefunc)();; if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); - if (firstDir.empty()) { - concatenatedDir = thisDir; - firstDir = thisDir; + if (firstValue.empty()) { + concatenatedValue = thisValue; + firstValue = thisValue; } else { - concatenatedDir += "+" + thisDir; + concatenatedValue += "+" + thisValue; } - - if (firstDir != thisDir) - dirNotSame = true; + if (firstValue != thisValue) + valueNotSame = true; } } - if (dirNotSame) - return concatenatedDir; + if (valueNotSame) + return concatenatedValue; else - return firstDir; + return firstValue; +} +/** returns the detector trimbit/settings directory */ +string multiSlsDetector::getSettingsDir() +{ + return callDetectors(&slsDetector::getSettingsDir); + // string concatenatedDir, firstDir; + // bool dirNotSame = false; + + // for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + // if (detectors[idet]) { + // string thisDir = detectors[idet]->getSettingsDir(); + // if (detectors[idet]->getErrorMask()) + // setErrorMask(getErrorMask() | (1 << idet)); + + // if (firstDir.empty()) { + // concatenatedDir = thisDir; + // firstDir = thisDir; + // } else { + // concatenatedDir += "+" + thisDir; + // } + // if (firstDir != thisDir) + // dirNotSame = true; + // } + // } + // if (dirNotSame) + // return concatenatedDir; + // else + // return firstDir; } /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 311e89bdf..2f8ec3a9b 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1044,7 +1044,7 @@ class multiSlsDetector : public slsDetectorUtils { - + std::string callDetectors(std::string(slsDetector::*somefunc)()); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From abdf4b1ada50ba510f8f3ddeae3fab74a148747d Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 10:19:09 +0200 Subject: [PATCH 05/24] converting to Qstring --- slsDetectorGui/src/qDetectorMain.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index 766dac696..e28a30e04 100644 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -521,7 +521,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action){ } } else if(action==actionLoadTrimbits){ - QString fName = QString(myDet->getSettingsDir()); + QString fName = QString( (myDet->getSettingsDir()).c_str()); qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); //gotthard if(actionLoadTrimbits->text().contains("Settings")){ @@ -568,7 +568,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action){ cout << "Saving Settings" << endl; #endif //different output directory so as not to overwrite - QString fName = QString(myDet->getSettingsDir()); + QString fName = QString( (myDet->getSettingsDir()).c_str() ); qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); fName = QFileDialog::getSaveFileName(this, tr("Save Current Detector Settings"),fName, @@ -585,7 +585,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action){ #ifdef VERBOSE cout << "Saving Trimbits" << endl; #endif//different output directory so as not to overwrite - QString fName = QString(myDet->getSettingsDir()); + QString fName = QString( (myDet->getSettingsDir()).c_str() ); qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); fName = QFileDialog::getSaveFileName(this, tr("Save Current Detector Trimbits"),fName, From f45e2b4ab93aa21a960343611fb13f80fed7a28b Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 10:30:02 +0200 Subject: [PATCH 06/24] changed type of getCalDir to std::string --- slsDetectorGui/src/qDetectorMain.cpp | 4 +- .../multiSlsDetector/multiSlsDetector.cpp | 49 ++++++++++--------- .../multiSlsDetector/multiSlsDetector.h | 4 +- slsDetectorSoftware/slsDetector/slsDetector.h | 4 +- .../slsDetector/slsDetectorCommand.cpp | 4 +- .../slsDetector/slsDetectorUtils.h | 4 +- 6 files changed, 35 insertions(+), 34 deletions(-) diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp index e28a30e04..c2f6013a3 100644 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ b/slsDetectorGui/src/qDetectorMain.cpp @@ -603,7 +603,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action){ #ifdef VERBOSE cout << "Loading Calibration Data" << endl; #endif - QString fName = QString(myDet->getCalDir()); + QString fName = QString( (myDet->getCalDir()).c_str() ); qDefs::checkErrorMessage(myDet); //so that even nonexisting files can be selected @@ -626,7 +626,7 @@ void qDetectorMain::ExecuteUtilities(QAction *action){ #ifdef VERBOSE cout << "Saving Calibration Data" << endl; #endif//different output directory so as not to overwrite - QString fName = QString(myDet->getCalDir()); + QString fName = QString( (myDet->getCalDir()).c_str() ); qDefs::checkErrorMessage(myDet); fName = QFileDialog::getSaveFileName(this, tr("Save Current Detector Calibration Data"),fName, diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 936e18cf9..f20188409 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3552,38 +3552,39 @@ int multiSlsDetector::getTrimEn(int* ene) returns the location of the calibration files \sa sharedSlsDetector */ -char* multiSlsDetector::getCalDir() +string multiSlsDetector::getCalDir() { - string s0 = "", s1 = "", s; - //char ans[1000]; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - s = detectors[idet]->getCalDir(); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); + return callDetectors(&slsDetector::getCalDir); + // string s0 = "", s1 = "", s; + // //char ans[1000]; + // for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + // if (detectors[idet]) { + // s = detectors[idet]->getCalDir(); + // if (detectors[idet]->getErrorMask()) + // setErrorMask(getErrorMask() | (1 << idet)); - if (s0 == "") - s0 = s; - else - s0 += string("+") + s; - if (s1 == "") - s1 = s; - else if (s1 != s) - s1 = "bad"; - } - } - if (s1 == "bad") - strcpy(ans, s0.c_str()); - else - strcpy(ans, s1.c_str()); - return ans; + // if (s0 == "") + // s0 = s; + // else + // s0 += string("+") + s; + // if (s1 == "") + // s1 = s; + // else if (s1 != s) + // s1 = "bad"; + // } + // } + // if (s1 == "bad") + // strcpy(ans, s0.c_str()); + // else + // strcpy(ans, s1.c_str()); + // return ans; } /** sets the location of the calibration files \sa sharedSlsDetector */ -char* multiSlsDetector::setCalDir(string s) +string multiSlsDetector::setCalDir(string s) { if (s.find('+') == string::npos) { diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 2f8ec3a9b..d1daf1857 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1054,12 +1054,12 @@ class multiSlsDetector : public slsDetectorUtils { returns the location of the calibration files \sa sharedSlsDetector */ - char* getCalDir(); + std::string getCalDir(); /** sets the location of the calibration files \sa sharedSlsDetector */ - char* setCalDir(std::string s); + std::string setCalDir(std::string s); std::string getNetworkParameter(networkParameter); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 95cd47f4a..db6798c24 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -493,12 +493,12 @@ class slsDetector : public slsDetectorUtils, public energyConversion { returns the location of the calibration files \sa sharedSlsDetector */ - char* getCalDir() {return thisDetector->calDir;}; + std::string getCalDir() {return thisDetector->calDir;}; /** sets the location of the calibration files \sa sharedSlsDetector */ - char* setCalDir(string s) {sprintf(thisDetector->calDir, s.c_str()); return thisDetector->calDir;}; + std::string setCalDir(string s) {sprintf(thisDetector->calDir, s.c_str()); return thisDetector->calDir;}; diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index cda0752f1..bada96b0b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -3061,9 +3061,9 @@ string slsDetectorCommand::cmdCalDir(int narg, char *args[], int action){ if (action==PUT_ACTION) { myDet->setCalDir(string(args[1])); } - if (myDet->getCalDir()==NULL) + if ( (myDet->getCalDir()).empty() ) return string("undefined"); - return string(myDet->getCalDir()); + return myDet->getCalDir(); } diff --git a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h index e96aeb65f..3a0de545b 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorUtils.h +++ b/slsDetectorSoftware/slsDetector/slsDetectorUtils.h @@ -413,12 +413,12 @@ class slsDetectorUtils : public slsDetectorActions, public postProcessing { /** returns the location of the calibration files */ - virtual char* getCalDir()=0; + virtual std::string getCalDir()=0; /** sets the location of the calibration files */ - virtual char* setCalDir(std::string s)=0; + virtual std::string setCalDir(std::string s)=0; /** Frees the shared memory - should not be used except for debugging*/ virtual int freeSharedMemory()=0; From 8ed67119b9a4a00b835dd956d03cd90ce9436a41 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 10:39:34 +0200 Subject: [PATCH 07/24] replacing logic in getLastClientIP and getReceiverLastClientIP with generic function --- .../multiSlsDetector/multiSlsDetector.cpp | 76 ++----------------- 1 file changed, 6 insertions(+), 70 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f20188409..0feaa01f0 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3429,7 +3429,8 @@ std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc) bool valueNotSame = false; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - string thisValue = (detectors[idet]->*somefunc)();; + string thisValue = (detectors[idet]->*somefunc)(); + ; if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); @@ -3451,7 +3452,7 @@ std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc) /** returns the detector trimbit/settings directory */ string multiSlsDetector::getSettingsDir() { - return callDetectors(&slsDetector::getSettingsDir); + return callDetectors(&slsDetector::getSettingsDir); // string concatenatedDir, firstDir; // bool dirNotSame = false; @@ -3554,30 +3555,7 @@ int multiSlsDetector::getTrimEn(int* ene) */ string multiSlsDetector::getCalDir() { - return callDetectors(&slsDetector::getCalDir); - // string s0 = "", s1 = "", s; - // //char ans[1000]; - // for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - // if (detectors[idet]) { - // s = detectors[idet]->getCalDir(); - // if (detectors[idet]->getErrorMask()) - // setErrorMask(getErrorMask() | (1 << idet)); - - // if (s0 == "") - // s0 = s; - // else - // s0 += string("+") + s; - // if (s1 == "") - // s1 = s; - // else if (s1 != s) - // s1 = "bad"; - // } - // } - // if (s1 == "bad") - // strcpy(ans, s0.c_str()); - // else - // strcpy(ans, s1.c_str()); - // return ans; + return callDetectors(&slsDetector::getCalDir); } /** @@ -3751,28 +3729,7 @@ int multiSlsDetector::lockServer(int p) string multiSlsDetector::getLastClientIP() { - string s0 = "", s1 = "", s; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - s = detectors[idet]->getLastClientIP(); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - if (s0 == "") - s0 = s; - else - s0 += string("+") + s; - if (s1 == "") - s1 = s; - else if (s1 != s) - s1 = "bad"; - } - } - if (s1 == "bad") - return s0; - else - return s1; + return callDetectors(&slsDetector::getLastClientIP); } int multiSlsDetector::setReadOutFlags(readOutFlags flag) @@ -6101,28 +6058,7 @@ int multiSlsDetector::lockReceiver(int lock) string multiSlsDetector::getReceiverLastClientIP() { - string s0 = "", s1 = "", s; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - s = detectors[idet]->getReceiverLastClientIP(); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - if (s0 == "") - s0 = s; - else - s0 += string("+") + s; - if (s1 == "") - s1 = s; - else if (s1 != s) - s1 = "bad"; - } - } - if (s1 == "bad") - return s0; - else - return s1; + return callDetectors(&slsDetector::getReceiverLastClientIP); } int multiSlsDetector::exitReceiver() From 883317dd280993b214918d531aa6a966d2c18459 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 10:46:36 +0200 Subject: [PATCH 08/24] replaced logic in getSettingsFile --- .../multiSlsDetector/multiSlsDetector.cpp | 49 +------------------ 1 file changed, 2 insertions(+), 47 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 0feaa01f0..95e7af3df 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -24,7 +24,7 @@ ID: $Id$ #include #include -char ans[MAX_STR_LENGTH]; +// char ans[MAX_STR_LENGTH]; int multiSlsDetector::freeSharedMemory() { @@ -3453,29 +3453,6 @@ std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc) string multiSlsDetector::getSettingsDir() { return callDetectors(&slsDetector::getSettingsDir); - // string concatenatedDir, firstDir; - // bool dirNotSame = false; - - // for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - // if (detectors[idet]) { - // string thisDir = detectors[idet]->getSettingsDir(); - // if (detectors[idet]->getErrorMask()) - // setErrorMask(getErrorMask() | (1 << idet)); - - // if (firstDir.empty()) { - // concatenatedDir = thisDir; - // firstDir = thisDir; - // } else { - // concatenatedDir += "+" + thisDir; - // } - // if (firstDir != thisDir) - // dirNotSame = true; - // } - // } - // if (dirNotSame) - // return concatenatedDir; - // else - // return firstDir; } /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ @@ -3804,29 +3781,7 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext string multiSlsDetector::getSettingsFile() { - - string s0 = "", s1 = "", s; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - s = detectors[idet]->getSettingsFile(); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - if (s0 == "") - s0 = s; - else - s0 += string("+") + s; - if (s1 == "") - s1 = s; - else if (s1 != s) - s1 = "bad"; - } - } - if (s1 == "bad") - return s0; - else - return s1; + return callDetectors(&slsDetector::getSettingsFile); } int multiSlsDetector::configureMAC() From 2f8c1b453e21ff07fcd7b7bd5f3e4d505c98c62d Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 11:06:33 +0200 Subject: [PATCH 09/24] renaming generic call --- .../multiSlsDetector/multiSlsDetector.cpp | 14 ++++++++------ .../multiSlsDetector/multiSlsDetector.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 95e7af3df..085966642 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3423,10 +3423,11 @@ int multiSlsDetector::exitServer() return ival; } -std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc)()) +string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) { string concatenatedValue, firstValue; bool valueNotSame = false; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { string thisValue = (detectors[idet]->*somefunc)(); @@ -3449,10 +3450,11 @@ std::string multiSlsDetector::callDetectors(std::string (slsDetector::*somefunc) else return firstValue; } + /** returns the detector trimbit/settings directory */ string multiSlsDetector::getSettingsDir() { - return callDetectors(&slsDetector::getSettingsDir); + return callDetectorMemeber(&slsDetector::getSettingsDir); } /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ @@ -3532,7 +3534,7 @@ int multiSlsDetector::getTrimEn(int* ene) */ string multiSlsDetector::getCalDir() { - return callDetectors(&slsDetector::getCalDir); + return callDetectorMemeber(&slsDetector::getCalDir); } /** @@ -3706,7 +3708,7 @@ int multiSlsDetector::lockServer(int p) string multiSlsDetector::getLastClientIP() { - return callDetectors(&slsDetector::getLastClientIP); + return callDetectorMemeber(&slsDetector::getLastClientIP); } int multiSlsDetector::setReadOutFlags(readOutFlags flag) @@ -3781,7 +3783,7 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext string multiSlsDetector::getSettingsFile() { - return callDetectors(&slsDetector::getSettingsFile); + return callDetectorMemeber(&slsDetector::getSettingsFile); } int multiSlsDetector::configureMAC() @@ -6013,7 +6015,7 @@ int multiSlsDetector::lockReceiver(int lock) string multiSlsDetector::getReceiverLastClientIP() { - return callDetectors(&slsDetector::getReceiverLastClientIP); + return callDetectorMemeber(&slsDetector::getReceiverLastClientIP); } int multiSlsDetector::exitReceiver() diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index d1daf1857..9473ab7d5 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1044,7 +1044,7 @@ class multiSlsDetector : public slsDetectorUtils { - std::string callDetectors(std::string(slsDetector::*somefunc)()); + std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From 77028654095461afc3af368f994b564e54e4bd48 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 11:38:59 +0200 Subject: [PATCH 10/24] replacing slsDetectorMember calls with generic function --- .../multiSlsDetector/multiSlsDetector.cpp | 70 ++++++------------- .../multiSlsDetector/multiSlsDetector.h | 1 + 2 files changed, 23 insertions(+), 48 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 085966642..1391eae6e 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3423,6 +3423,24 @@ int multiSlsDetector::exitServer() return ival; } +int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value){ + int ret = -100, ret1; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + // ret1 = detectors[idet]->setReceiverSilentMode(i); + ret1 = (detectors[idet]->*somefunc)(value); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + if (ret == -100) + ret = ret1; + else if (ret != ret1) + ret = -1; + } + return ret; +} + + + string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) { string concatenatedValue, firstValue; @@ -6252,66 +6270,22 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable) int multiSlsDetector::enableReceiverCompression(int i) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->enableReceiverCompression(i); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMemeber(&slsDetector::enableReceiverCompression, i); } int multiSlsDetector::enableTenGigabitEthernet(int i) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->enableTenGigabitEthernet(i); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMemeber(&slsDetector::enableTenGigabitEthernet, i); } int multiSlsDetector::setReceiverFifoDepth(int i) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setReceiverFifoDepth(i); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMemeber(&slsDetector::setReceiverFifoDepth, i); } int multiSlsDetector::setReceiverSilentMode(int i) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setReceiverSilentMode(i); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMemeber(&slsDetector::setReceiverSilentMode, i); } /** opens pattern file and sends pattern to CTB diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 9473ab7d5..8969329c5 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1045,6 +1045,7 @@ class multiSlsDetector : public slsDetectorUtils { std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); + int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From ad14381ab4010224a95f3844c6c2e162ae1661ee Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 11:44:39 +0200 Subject: [PATCH 11/24] replacing ReceiverReadTimer, Frequency calibratePedestal --- .../multiSlsDetector/multiSlsDetector.cpp | 67 ++++--------------- 1 file changed, 12 insertions(+), 55 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 1391eae6e..5b7c9e739 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3423,12 +3423,13 @@ int multiSlsDetector::exitServer() return ival; } -int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value){ - int ret = -100, ret1; +int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value) +{ + int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { // ret1 = detectors[idet]->setReceiverSilentMode(i); - ret1 = (detectors[idet]->*somefunc)(value); + ret1 = (detectors[idet]->*somefunc)(value); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); if (ret == -100) @@ -3439,8 +3440,6 @@ int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int return ret; } - - string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) { string concatenatedValue, firstValue; @@ -3801,7 +3800,7 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext string multiSlsDetector::getSettingsFile() { - return callDetectorMemeber(&slsDetector::getSettingsFile); + return callDetectorMemeber(&slsDetector::getSettingsFile); } int multiSlsDetector::configureMAC() @@ -6151,59 +6150,17 @@ int64_t multiSlsDetector::clearAllErrorMask() int multiSlsDetector::calibratePedestal(int frames) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->calibratePedestal(frames); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::calibratePedestal, frames); } int multiSlsDetector::setReadReceiverFrequency(int freq) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->setReadReceiverFrequency(freq); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::setReadReceiverFrequency, freq); } int multiSlsDetector::setReceiverReadTimer(int time_in_ms) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->setReceiverReadTimer(time_in_ms); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::setReceiverReadTimer, time_in_ms); } int multiSlsDetector::enableDataStreamingToClient(int enable) @@ -6270,22 +6227,22 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable) int multiSlsDetector::enableReceiverCompression(int i) { - return callDetectorMemeber(&slsDetector::enableReceiverCompression, i); + return callDetectorMemeber(&slsDetector::enableReceiverCompression, i); } int multiSlsDetector::enableTenGigabitEthernet(int i) { - return callDetectorMemeber(&slsDetector::enableTenGigabitEthernet, i); + return callDetectorMemeber(&slsDetector::enableTenGigabitEthernet, i); } int multiSlsDetector::setReceiverFifoDepth(int i) { - return callDetectorMemeber(&slsDetector::setReceiverFifoDepth, i); + return callDetectorMemeber(&slsDetector::setReceiverFifoDepth, i); } int multiSlsDetector::setReceiverSilentMode(int i) { - return callDetectorMemeber(&slsDetector::setReceiverSilentMode, i); + return callDetectorMemeber(&slsDetector::setReceiverSilentMode, i); } /** opens pattern file and sends pattern to CTB From f735baf9d72f1776c745801e863c4f8d859fe6b8 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 12:21:36 +0200 Subject: [PATCH 12/24] more cleaning --- .../multiSlsDetector/multiSlsDetector.cpp | 124 +----------------- 1 file changed, 7 insertions(+), 117 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 5b7c9e739..41f5f2f69 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1047,21 +1047,7 @@ string multiSlsDetector::checkOnline() int multiSlsDetector::activate(int const enable) { - int ret1 = -100, ret; - - for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) { - if (detectors[i]) { - ret = detectors[i]->activate(enable); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else if (ret != ret1) - ret1 = -1; - } - } - - return ret1; + return callDetectorMemeber(&slsDetector::activate, enable); } int multiSlsDetector::exists() @@ -2799,11 +2785,9 @@ double multiSlsDetector::getRateCorrectionTau() int multiSlsDetector::getRateCorrection() { - if (getDetectorsType() == EIGER) { return getRateCorrectionTau(); } - if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { return 1; } else @@ -3509,9 +3493,7 @@ string multiSlsDetector::setSettingsDir(string s) int multiSlsDetector::setTrimEn(int ne, int* ene) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { ret1 = detectors[idet]->setTrimEn(ne, ene); @@ -3528,9 +3510,7 @@ int multiSlsDetector::setTrimEn(int ne, int* ene) int multiSlsDetector::getTrimEn(int* ene) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { ret1 = detectors[idet]->getTrimEn(ene); @@ -3598,7 +3578,6 @@ string multiSlsDetector::getNetworkParameter(networkParameter p) { string s0 = "", s1 = "", s; string ans = ""; - //char ans[1000]; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { s = detectors[idet]->getNetworkParameter(p); @@ -3618,10 +3597,8 @@ string multiSlsDetector::getNetworkParameter(networkParameter p) } if (s1 == "bad") ans = s0; - // strcpy(ans,s0.c_str()); else ans = s1; - // strcpy(ans,s1.c_str()); return ans; } @@ -3705,22 +3682,7 @@ int multiSlsDetector::setPort(portType t, int p) int multiSlsDetector::lockServer(int p) { - - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->lockServer(p); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::lockServer, p); } string multiSlsDetector::getLastClientIP() @@ -3730,7 +3692,6 @@ string multiSlsDetector::getLastClientIP() int multiSlsDetector::setReadOutFlags(readOutFlags flag) { - int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { @@ -3750,7 +3711,6 @@ int multiSlsDetector::setReadOutFlags(readOutFlags flag) slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunicationMode(externalCommunicationMode pol) { - externalCommunicationMode ret, ret1; if (detectors[0]) @@ -3805,9 +3765,7 @@ string multiSlsDetector::getSettingsFile() int multiSlsDetector::configureMAC() { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { ret1 = detectors[idet]->configureMAC(); @@ -3819,7 +3777,6 @@ int multiSlsDetector::configureMAC() ret = -1; } } - return ret; } @@ -3901,36 +3858,12 @@ int multiSlsDetector::writeCounterBlockFile(string const fname, int startACQ) int multiSlsDetector::resetCounterBlock(int startACQ) { - - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->resetCounterBlock(startACQ); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - return ret; + return callDetectorMemeber(&slsDetector::resetCounterBlock, startACQ); } int multiSlsDetector::setCounterBit(int i) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setCounterBit(i); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMemeber(&slsDetector::setCounterBit, i); } int multiSlsDetector::setDynamicRange(int p) @@ -6012,22 +5945,7 @@ int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) int multiSlsDetector::lockReceiver(int lock) { - - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->lockReceiver(lock); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::lockReceiver, lock); } string multiSlsDetector::getReceiverLastClientIP() @@ -6051,40 +5969,12 @@ int multiSlsDetector::exitReceiver() int multiSlsDetector::enableWriteToFile(int enable) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->enableWriteToFile(enable); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::enableWriteToFile, enable); } int multiSlsDetector::overwriteFile(int enable) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->overwriteFile(enable); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - - return ret; + return callDetectorMemeber(&slsDetector::overwriteFile, enable); } string multiSlsDetector::getErrorMessage(int& critical) From bbd7e7906a5391fe31aac21ae9daf14822f5a25e Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 15:10:57 +0200 Subject: [PATCH 13/24] replacing pulsechip with a generic algorithm --- .../multiSlsDetector/multiSlsDetector.cpp | 80 ++++++++++--------- .../multiSlsDetector/multiSlsDetector.h | 2 + .../slsDetector/slsDetector.cpp | 2 +- 3 files changed, 45 insertions(+), 39 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 41f5f2f69..f182cf267 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -24,6 +24,7 @@ ID: $Id$ #include #include +#include // char ans[MAX_STR_LENGTH]; int multiSlsDetector::freeSharedMemory() @@ -1047,7 +1048,7 @@ string multiSlsDetector::checkOnline() int multiSlsDetector::activate(int const enable) { - return callDetectorMemeber(&slsDetector::activate, enable); + return callDetectorMemeber(&slsDetector::activate, enable); } int multiSlsDetector::exists() @@ -3412,7 +3413,6 @@ int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { - // ret1 = detectors[idet]->setReceiverSilentMode(i); ret1 = (detectors[idet]->*somefunc)(value); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); @@ -3452,6 +3452,42 @@ string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) return firstValue; } +int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value) +{ + int ret = -100; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + Task* task = new Task(new func1_t(somefunc, + detectors[idet], value, &return_values[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + cout << return_values[idet] << "\n"; + if (detectors[idet]) { + if (ret == -100) + ret = return_values[idet]; + else if (ret != return_values[idet]) + ret = -1; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + return ret; +} + + /** returns the detector trimbit/settings directory */ string multiSlsDetector::getSettingsDir() { @@ -3682,7 +3718,7 @@ int multiSlsDetector::setPort(portType t, int p) int multiSlsDetector::lockServer(int p) { - return callDetectorMemeber(&slsDetector::lockServer, p); + return callDetectorMemeber(&slsDetector::lockServer, p); } string multiSlsDetector::getLastClientIP() @@ -6329,43 +6365,11 @@ int multiSlsDetector::pulsePixelNMove(int n, int x, int y) return ret; } + + int multiSlsDetector::pulseChip(int n) { - 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(&slsDetector::pulseChip, - detectors[idet], n, 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; + return parallelCallDetectorMember(&slsDetector::pulseChip, n); } void multiSlsDetector::setAcquiringFlag(bool b) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 8969329c5..0e41ea029 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1046,6 +1046,8 @@ class multiSlsDetector : public slsDetectorUtils { std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); + int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated + /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 0d883a39f..bc3d93a73 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1310,7 +1310,7 @@ int slsDetector::setOnline(int off) { string slsDetector::checkOnline() { - string retval = string(""); + string retval; if(!controlSocket){ //this already sets the online/offline flag setTCPSocket(); From 4b72d685f357e04e352fa5676ec1c58d63c8666e Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 15:39:28 +0200 Subject: [PATCH 14/24] migrating more multiSlsDetector calls to the generic function --- .../multiSlsDetector/multiSlsDetector.cpp | 180 ++++-------------- .../multiSlsDetector/multiSlsDetector.h | 2 +- 2 files changed, 39 insertions(+), 143 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f182cf267..8484e2981 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3472,7 +3472,6 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in threadpool->wait_for_tasks_to_complete(); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - cout << return_values[idet] << "\n"; if (detectors[idet]) { if (ret == -100) ret = return_values[idet]; @@ -3487,6 +3486,39 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in return ret; } +int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) +{ + int ret = -100; + + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + Task* task = new Task(new func0_t(somefunc, + detectors[idet], &return_values[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 (ret == -100) + ret = return_values[idet]; + else if (ret != return_values[idet]) + ret = -1; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + } + + return ret; +} /** returns the detector trimbit/settings directory */ string multiSlsDetector::getSettingsDir() @@ -5194,39 +5226,7 @@ string multiSlsDetector::setFileName(string s) int multiSlsDetector::setReceiverFramesPerFile(int f) { - 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(&slsDetector::setReceiverFramesPerFile, - detectors[idet], f, 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; + return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); } slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) @@ -5249,42 +5249,7 @@ slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) int multiSlsDetector::setFileIndex(int i) { - - 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(&slsDetector::setFileIndex, - detectors[idet], i, 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; + return parallelCallDetectorMember(&slsDetector::setFileIndex, i); } int multiSlsDetector::startReceiver() @@ -5556,41 +5521,7 @@ int multiSlsDetector::getReceiverCurrentFrameIndex() int multiSlsDetector::resetFramesCaught() { - - int ret = OK; - int posmax = thisMultiDetector->numberOfDetectors; - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax]; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::resetFramesCaught, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for (int idet = 0; idet < posmax; ++idet) { - if (detectors[idet]) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - return ret; + return parallelCallDetectorMember(&slsDetector::resetFramesCaught); } int multiSlsDetector::createReceivingDataSockets(const bool destroy) @@ -6113,41 +6044,8 @@ int multiSlsDetector::enableDataStreamingToClient(int enable) int multiSlsDetector::enableDataStreamingFromReceiver(int enable) { if (enable >= 0) { - 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(&slsDetector::enableDataStreamingFromReceiver, - detectors[idet], enable, 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->receiver_upstream = ret; + thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable); } - return thisMultiDetector->receiver_upstream; } @@ -6365,11 +6263,9 @@ int multiSlsDetector::pulsePixelNMove(int n, int x, int y) return ret; } - - int multiSlsDetector::pulseChip(int n) { - return parallelCallDetectorMember(&slsDetector::pulseChip, n); + return parallelCallDetectorMember(&slsDetector::pulseChip, n); } void multiSlsDetector::setAcquiringFlag(bool b) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 0e41ea029..5c1dbcdd7 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1047,7 +1047,7 @@ class multiSlsDetector : public slsDetectorUtils { std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated - + int parallelCallDetectorMember(int (slsDetector::*somefunc)()); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From 4f600f3129daa9243bb3919f23b12dc1d9c1ded0 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 16:32:40 +0200 Subject: [PATCH 15/24] even more --- .../multiSlsDetector/multiSlsDetector.cpp | 225 +++--------------- .../multiSlsDetector/multiSlsDetector.h | 1 + 2 files changed, 31 insertions(+), 195 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 8484e2981..7e2902663 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -991,45 +991,8 @@ slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchr int multiSlsDetector::setOnline(int off) { - - if (off != GET_ONLINE_FLAG) { - 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(&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; - } + if (off != GET_ONLINE_FLAG) + thisMultiDetector->onlineFlag = parallelCallDetectorMember(&slsDetector::setOnline, off); return thisMultiDetector->onlineFlag; }; @@ -1057,7 +1020,6 @@ int multiSlsDetector::exists() } // Initialization functions - int multiSlsDetector::getThresholdEnergy(int pos) { @@ -1244,16 +1206,12 @@ int multiSlsDetector::getChanRegs(double* retval, bool fromDetector) for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - // cout << "det " << idet << endl; nChansDet = detectors[idet]->getChanRegs(retval1, fromDetector); - // cout << "returned" << endl; if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); - // cout << "memcopy "<< currentNumChans << " " << nChansDet << "(" << n << ")" << endl; memcpy(retval + (currentNumChans), retval1, nChansDet * sizeof(double)); currentNumChans += nChansDet; - // cout << "Done" << endl; } } return n; @@ -1899,40 +1857,7 @@ int64_t multiSlsDetector::getTimeLeft(timerIndex index) int multiSlsDetector::setStoragecellStart(int pos) { - 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(&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; + parallelCallDetectorMember(&slsDetector::setStoragecellStart, pos); } int multiSlsDetector::setSpeed(speedVariable index, int value) @@ -2384,21 +2309,6 @@ double* multiSlsDetector::decodeData(int* datain, int& nn, double* fdata) } //Correction -/* - enum correctionFlags { - DISCARD_BAD_CHANNELS, - AVERAGE_NEIGHBOURS_FOR_BAD_CHANNELS, - FLAT_FIELD_CORRECTION, - RATE_CORRECTION, - ANGULAR_CONVERSION - } -*/ - -/////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////////////////////////////////// - int multiSlsDetector::setFlatFieldCorrection(string fname) { double* data = new double[thisMultiDetector->numberOfChannels]; // xmed[thisMultiDetector->numberOfChannels]; @@ -2544,10 +2454,6 @@ int multiSlsDetector::getNMods() nm += detectors[idet]->getNMods(); } } -#ifdef VERBOSE - cout << "total number of modules is " << nm << endl; -#endif - return nm; } @@ -2559,19 +2465,12 @@ int multiSlsDetector::getNMod(dimension d) nm += detectors[idet]->getNMod(d); } } -#ifdef VERBOSE - cout << "total number of modules in dimension " << d << " is " << nm << endl; -#endif - return nm; } int multiSlsDetector::getChansPerMod(int imod) { int id = -1, im = -1; -#ifdef VERBOSE - cout << "get chans per mod " << imod << endl; -#endif decodeNMod(imod, id, im); if (id >= 0) { if (detectors[id]) { @@ -2708,7 +2607,6 @@ int multiSlsDetector::setRateCorrection(double t) int multiSlsDetector::getRateCorrection(double& t) { - if (getDetectorsType() == EIGER) { t = getRateCorrectionTau(); return t; @@ -2797,7 +2695,6 @@ int multiSlsDetector::getRateCorrection() int multiSlsDetector::rateCorrect(double* datain, double* errin, double* dataout, double* errout) { - int ichdet = 0; double* perr = errin; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { @@ -3408,6 +3305,22 @@ int multiSlsDetector::exitServer() 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 ret = -100, ret1; @@ -3455,7 +3368,6 @@ string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value) { int ret = -100; - if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; @@ -3482,14 +3394,12 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } } } - return ret; } int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) { int ret = -100; - if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; @@ -3516,7 +3426,6 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) } } } - return ret; } @@ -3795,7 +3704,6 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic ret = GET_EXTERNAL_COMMUNICATION_MODE; } } - setMaster(); setSynchronization(); return ret; @@ -3803,7 +3711,6 @@ slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunic slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(externalSignalFlag pol, int signalindex) { - externalSignalFlag ret, ret1; if (detectors[0]) @@ -3820,7 +3727,6 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext ret = GET_EXTERNAL_SIGNAL_FLAG; } } - setMaster(); setSynchronization(); return ret; @@ -3833,19 +3739,7 @@ string multiSlsDetector::getSettingsFile() int multiSlsDetector::configureMAC() { - int ret = -100, ret1; - 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; + return callDetectorMemeber(&slsDetector::configureMAC); } 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 ret = OK, ret1 = OK; short int arg[thisMultiDetector->numberOfChannels]; ofstream outfile; @@ -3994,22 +3887,11 @@ int multiSlsDetector::setDynamicRange(int p) int multiSlsDetector::getMaxMods() { - - int ret = 0, ret1; - + int ret = 0; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = detectors[idet]->getMaxMods(); -#ifdef VERBOSE - cout << "detector " << idet << " maxmods " << ret1 << endl; -#endif - ret += ret1; - } + if (detectors[idet]) + ret += detectors[idet]->getMaxMods(); } -#ifdef VERBOSE - cout << "max mods is " << ret << endl; -#endif - return ret; } @@ -4062,7 +3944,6 @@ int multiSlsDetector::getMaxMod(dimension d) int multiSlsDetector::getMaxNumberOfModules(dimension d) { - int ret = 0, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { @@ -4145,21 +4026,11 @@ int multiSlsDetector::setFlippedData(dimension d, int value) int multiSlsDetector::enableGapPixels(int val) { - if (val > 0 && getDetectorsType() != EIGER) { std::cout << "Not implemented for this detector" << std::endl; val = -1; } - - 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; - } + int ret = callDetectorMemeber(&slsDetector::enableGapPixels, val); if (val != -1) { // update data bytes incl gap pixels @@ -4168,11 +4039,9 @@ int multiSlsDetector::enableGapPixels(int val) if (detectors[i]) thisMultiDetector->dataBytesInclGapPixels += detectors[i]->getDataBytesInclGapPixels(); } - // update offsets and number of channels incl gap pixels in multi level updateOffsets(); } - return ret; } @@ -4696,12 +4565,11 @@ uint32_t multiSlsDetector::clearBit(uint32_t addr, int n) int multiSlsDetector::printReceiverConfiguration() { - int i; int ret, ret1 = -100; 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]) { std::cout << std::endl << "#Detector " << i << ":" << std::endl; @@ -5092,41 +4960,8 @@ int multiSlsDetector::readDataFile(string fname, int* data) int multiSlsDetector::setReceiverOnline(int off) { - if (off != GET_ONLINE_FLAG) { - 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(&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; + thisMultiDetector->receiverOnlineFlag = parallelCallDetectorMember(&slsDetector::setReceiverOnline, off); } return thisMultiDetector->receiverOnlineFlag; } @@ -5226,7 +5061,7 @@ string multiSlsDetector::setFileName(string s) int multiSlsDetector::setReceiverFramesPerFile(int f) { - return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); + return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); } slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) @@ -5249,7 +5084,7 @@ slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) int multiSlsDetector::setFileIndex(int i) { - return parallelCallDetectorMember(&slsDetector::setFileIndex, i); + return parallelCallDetectorMember(&slsDetector::setFileIndex, i); } int multiSlsDetector::startReceiver() @@ -5521,7 +5356,7 @@ int multiSlsDetector::getReceiverCurrentFrameIndex() int multiSlsDetector::resetFramesCaught() { - return parallelCallDetectorMember(&slsDetector::resetFramesCaught); + return parallelCallDetectorMember(&slsDetector::resetFramesCaught); } int multiSlsDetector::createReceivingDataSockets(const bool destroy) @@ -6044,7 +5879,7 @@ int multiSlsDetector::enableDataStreamingToClient(int enable) int multiSlsDetector::enableDataStreamingFromReceiver(int enable) { if (enable >= 0) { - thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable); + thisMultiDetector->receiver_upstream = parallelCallDetectorMember(&slsDetector::enableDataStreamingFromReceiver, enable); } return thisMultiDetector->receiver_upstream; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 5c1dbcdd7..3328fc1a9 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1046,6 +1046,7 @@ class multiSlsDetector : public slsDetectorUtils { std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); 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)()); From 05ed8dca4ef6b3bafe0af304aa362288684315ae Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 17:02:01 +0200 Subject: [PATCH 16/24] more cleanup --- .../multiSlsDetector/multiSlsDetector.cpp | 130 +++++------------- .../multiSlsDetector/multiSlsDetector.h | 4 +- 2 files changed, 39 insertions(+), 95 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 7e2902663..253cb2e96 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1857,7 +1857,7 @@ int64_t multiSlsDetector::getTimeLeft(timerIndex index) int multiSlsDetector::setStoragecellStart(int pos) { - parallelCallDetectorMember(&slsDetector::setStoragecellStart, pos); + parallelCallDetectorMember(&slsDetector::setStoragecellStart, pos); } int multiSlsDetector::setSpeed(speedVariable index, int value) @@ -3305,6 +3305,22 @@ int multiSlsDetector::exitServer() return ival; } +int multiSlsDetector::compareReturnValues(const std::vector& return_values) +{ + int ret = -100; + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (ret == -100) + ret = return_values[idet]; + else if (ret != return_values[idet]) + ret = -1; + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } + return ret; +} + int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)()) { int ret = -100, ret1; @@ -3367,7 +3383,6 @@ string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value) { - int ret = -100; if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; @@ -3382,24 +3397,32 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); + return compareReturnValues(return_values); + } +} +int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2) +{ + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - if (ret == -100) - ret = return_values[idet]; - else if (ret != return_values[idet]) - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); + Task* task = new Task(new func3_t(somefunc, + detectors[idet], v0, v1, v2, &return_values[idet])); + threadpool->add_task(task); } } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + return compareReturnValues(return_values); } - return ret; } int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) { - int ret = -100; if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; @@ -3414,19 +3437,8 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - if (ret == -100) - ret = return_values[idet]; - else if (ret != return_values[idet]) - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } + return compareReturnValues(return_values); } - return ret; } /** returns the detector trimbit/settings directory */ @@ -5963,7 +5975,6 @@ uint64_t multiSlsDetector::setCTBWord(int addr, uint64_t word) */ int multiSlsDetector::setCTBPatLoops(int level, int& start, int& stop, int& n) { - int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { @@ -5985,7 +5996,6 @@ int multiSlsDetector::setCTBPatLoops(int level, int& start, int& stop, int& n) */ int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) { - int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { @@ -6007,7 +6017,6 @@ int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) */ int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t) { - int ret = -100, ret1; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { @@ -6024,78 +6033,12 @@ int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t) int multiSlsDetector::pulsePixel(int n, int x, int y) { - 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 func3_t(&slsDetector::pulsePixel, - detectors[idet], n, x, y, 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; + return parallelCallDetectorMember(&slsDetector::pulsePixel, n, x, y); } int multiSlsDetector::pulsePixelNMove(int n, int x, int y) { - 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 func3_t(&slsDetector::pulsePixelNMove, - detectors[idet], n, x, y, 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; + return parallelCallDetectorMember(&slsDetector::pulsePixelNMove, n, x, y); } int multiSlsDetector::pulseChip(int n) @@ -6119,7 +6062,6 @@ bool multiSlsDetector::isAcquireReady() std::cout << "Acquire has already started. If previous acquisition terminated unexpectedly, reset busy flag to restart.(sls_detector_put busy 0)" << std::endl; return FAIL; } - thisMultiDetector->acquiringFlag = true; return OK; } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 3328fc1a9..7cff4fc47 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1047,8 +1047,10 @@ class multiSlsDetector : public slsDetectorUtils { std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); 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 parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated + int parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2); //Should probably be templated + int compareReturnValues(const std::vector&); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From 476584961327a758d1db852aa1d67b44e9a40628 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 25 May 2018 17:09:23 +0200 Subject: [PATCH 17/24] minor --- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 253cb2e96..1cebcbff1 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5280,10 +5280,8 @@ slsDetectorDefs::runStatus multiSlsDetector::getReceiverStatus() int multiSlsDetector::getFramesCaughtByAnyReceiver() { - int ret = 0; int i = thisMultiDetector->masterPosition; - if (i >= 0) { if (detectors[i]) { ret = detectors[i]->getFramesCaughtByReceiver(); @@ -5293,7 +5291,6 @@ int multiSlsDetector::getFramesCaughtByAnyReceiver() return ret; } } - for (int i = 0; i < thisMultiDetector->numberOfDetectors; ++i) if (detectors[i]) { ret = detectors[i]->getFramesCaughtByReceiver(); @@ -5870,11 +5867,9 @@ int multiSlsDetector::setReceiverReadTimer(int time_in_ms) int multiSlsDetector::enableDataStreamingToClient(int enable) { if (enable >= 0) { - //destroy data threads if (!enable) createReceivingDataSockets(true); - //create data threads else { if (createReceivingDataSockets() == FAIL) { @@ -5922,11 +5917,8 @@ int multiSlsDetector::setReceiverSilentMode(int i) */ int multiSlsDetector::setCTBPattern(string fname) { - uint64_t word; - int addr = 0; - FILE* fd = fopen(fname.c_str(), "r"); if (fd > 0) { while (fread(&word, sizeof(word), 1, fd)) { From 5be2979fff529d59a7769533d116c033e0158704 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 28 May 2018 11:18:13 +0200 Subject: [PATCH 18/24] slsReceiver: fix to default number of frames per file, also set to 10k --- slsReceiverSoftware/include/GeneralData.h | 2 +- slsReceiverSoftware/include/sls_receiver_defs.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h index 7f9b000ad..83acda63c 100644 --- a/slsReceiverSoftware/include/GeneralData.h +++ b/slsReceiverSoftware/include/GeneralData.h @@ -519,7 +519,7 @@ class EigerData : public GeneralData { packetSize = headerSizeinPacket + dataSize; packetsPerFrame = 256; imageSize = dataSize*packetsPerFrame; - maxFramesPerFile = 5;//EIGER_MAX_FRAMES_PER_FILE; + maxFramesPerFile = EIGER_MAX_FRAMES_PER_FILE; fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsReceiverDefs::sls_detector_header); defaultFifoDepth = 100; threadsPerReceiver = 2; diff --git a/slsReceiverSoftware/include/sls_receiver_defs.h b/slsReceiverSoftware/include/sls_receiver_defs.h index 5108fe304..f9f46891c 100755 --- a/slsReceiverSoftware/include/sls_receiver_defs.h +++ b/slsReceiverSoftware/include/sls_receiver_defs.h @@ -22,7 +22,7 @@ typedef int int32_t; #define MAX_FRAMES_PER_FILE 20000 #define SHORT_MAX_FRAMES_PER_FILE 100000 #define MOENCH_MAX_FRAMES_PER_FILE 1000 -#define EIGER_MAX_FRAMES_PER_FILE 2000 +#define EIGER_MAX_FRAMES_PER_FILE 10000 #define JFRAU_MAX_FRAMES_PER_FILE 10000 #define JFCTB_MAX_FRAMES_PER_FILE 100000 From a970bacbe5c695a43e5a46e89811c72b7bc05fac Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 28 May 2018 11:29:35 +0200 Subject: [PATCH 19/24] slsDetectorGui: JCTB does not kill itself for wrong settings anymore --- slsDetectorGui/src/qTabSettings.cpp | 62 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp index 4a4dcea3d..ff31e780c 100644 --- a/slsDetectorGui/src/qTabSettings.cpp +++ b/slsDetectorGui/src/qTabSettings.cpp @@ -38,7 +38,10 @@ void qTabSettings::SetupWidgetWindow(){ detType=myDet->getDetectorsType(); // Settings - SetupDetectorSettings(); + if (detType != slsReceiverDefs::JUNGFRAUCTB) { + SetupDetectorSettings(); + } else + comboSettings->setEnabled(false); //threshold if((detType == slsDetectorDefs::MYTHEN) || (detType == slsDetectorDefs::EIGER)) @@ -104,8 +107,7 @@ void qTabSettings::SetupDetectorSettings(){ int sett = (int)myDet->getSettings();cout<<"sett:"< slsDetectorDefs::UNDEFINED) sett = Uninitialized; - else if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; + if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; // To be able to index items on a combo box model = qobject_cast(comboSettings->model()); @@ -167,7 +169,6 @@ void qTabSettings::SetupDetectorSettings(){ item[(int)VeryLowGain]->setEnabled(false); break; case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: item[(int)Standard]->setEnabled(false); item[(int)Fast]->setEnabled(false); item[(int)HighGain]->setEnabled(false); @@ -208,7 +209,8 @@ void qTabSettings::SetupDetectorSettings(){ void qTabSettings::Initialization(){ // Settings - connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); + if (detType != slsReceiverDefs::JUNGFRAUCTB) + connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); // Number of Modules connect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); // Dynamic Range @@ -226,8 +228,7 @@ void qTabSettings::setSettings(int index){ disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); int sett = (int)myDet->getSettings(); if(sett==-1) sett = Undefined; - if(detType == slsDetectorDefs::JUNGFRAUCTB && sett > slsDetectorDefs::UNDEFINED) sett = Uninitialized; - else if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; + if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; comboSettings->setCurrentIndex(sett); connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); @@ -320,7 +321,8 @@ void qTabSettings::Refresh(){ cout << endl << "**Updating Settings Tab" << endl; #endif - disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); + if (detType != slsReceiverDefs::JUNGFRAUCTB) + disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); disconnect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); disconnect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); @@ -339,35 +341,35 @@ void qTabSettings::Refresh(){ GetDynamicRange(); // Settings + if (detType != slsReceiverDefs::JUNGFRAUCTB) { #ifdef VERBOSE - cout << "Getting settings" << endl; + cout << "Getting settings" << endl; #endif - int sett = (int)myDet->getSettings(); - if(sett==-1) sett = Undefined;//slsDetectorDefs::UNDEFINED; - if(detType == slsDetectorDefs::JUNGFRAUCTB && sett > slsDetectorDefs::UNDEFINED) sett = Uninitialized; - else if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; - else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; - comboSettings->setCurrentIndex(sett); + int sett = (int)myDet->getSettings(); + if(sett==-1) sett = Undefined;//slsDetectorDefs::UNDEFINED; + if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; + else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; + comboSettings->setCurrentIndex(sett); - - //threshold - sett = comboSettings->currentIndex(); - if((detType==slsDetectorDefs::MYTHEN)||(detType==slsDetectorDefs::EIGER)){ - if((sett==Undefined)||(sett==Uninitialized)){ - lblThreshold->setEnabled(false); - spinThreshold->setEnabled(false); - }else{ - lblThreshold->setEnabled(true); - spinThreshold->setEnabled(true); + //threshold + sett = comboSettings->currentIndex(); + if((detType==slsDetectorDefs::MYTHEN)||(detType==slsDetectorDefs::EIGER)){ + if((sett==Undefined)||(sett==Uninitialized)){ + lblThreshold->setEnabled(false); + spinThreshold->setEnabled(false); + }else{ + lblThreshold->setEnabled(true); + spinThreshold->setEnabled(true); #ifdef VERBOSE - cout << "Getting threshold energy" << endl; + cout << "Getting threshold energy" << endl; #endif - spinThreshold->setValue(myDet->getThresholdEnergy()); + spinThreshold->setValue(myDet->getThresholdEnergy()); + } } - } +} - - connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); + if (detType != slsReceiverDefs::JUNGFRAUCTB) + connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); connect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); From 06f84585af79cc64c367b9b8300dd86b5ea97ed2 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Mon, 28 May 2018 11:55:11 +0200 Subject: [PATCH 20/24] compareRetrun.. to minusOneIf.. --- .../multiSlsDetector/multiSlsDetector.cpp | 10 ++++++---- .../multiSlsDetector/multiSlsDetector.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 1cebcbff1..cee469cbb 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -17,6 +17,8 @@ ID: $Id$ #include "slsDetector.h" #include "usersFunctions.h" + + #include #include //json header in zmq stream #include @@ -3305,7 +3307,7 @@ int multiSlsDetector::exitServer() return ival; } -int multiSlsDetector::compareReturnValues(const std::vector& return_values) +int multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) { int ret = -100; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { @@ -3397,7 +3399,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return compareReturnValues(return_values); + return minusOneIfDifferent(return_values); } } @@ -3417,7 +3419,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return compareReturnValues(return_values); + return minusOneIfDifferent(return_values); } } @@ -3437,7 +3439,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return compareReturnValues(return_values); + return minusOneIfDifferent(return_values); } } diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 7cff4fc47..75901676c 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1050,7 +1050,7 @@ class multiSlsDetector : public slsDetectorUtils { int parallelCallDetectorMember(int (slsDetector::*somefunc)()); int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated int parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2); //Should probably be templated - int compareReturnValues(const std::vector&); + int minusOneIfDifferent(const std::vector&); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From 9d3fdaaadc9dadedf847b2abe4a49aaea35bc348 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Mon, 28 May 2018 12:22:25 +0200 Subject: [PATCH 21/24] minor clean --- .../multiSlsDetector/multiSlsDetector.cpp | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index cee469cbb..ca7013a29 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -17,8 +17,6 @@ ID: $Id$ #include "slsDetector.h" #include "usersFunctions.h" - - #include #include //json header in zmq stream #include @@ -642,10 +640,6 @@ string multiSlsDetector::sgetDetectorsType(int pos) int multiSlsDetector::getDetectorId(int pos) { -#ifdef VERBOSE - cout << "Getting detector ID " << pos << endl; -#endif - if (pos >= 0) { if (detectors[pos]) return detectors[pos]->getDetectorId(); @@ -3307,9 +3301,10 @@ int multiSlsDetector::exitServer() return ival; } +/* utility function to check a range of return values*/ int multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) { - int ret = -100; + int ret = -100; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { if (ret == -100) @@ -3323,36 +3318,43 @@ int multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) return ret; } +// 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 ret = -100, ret1; + std::vector values(thisMultiDetector->numberOfDetectors, -1); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { - ret1 = (detectors[idet]->*somefunc)(); + values[idet] = (detectors[idet]->*somefunc)(); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; } - return ret; + return minusOneIfDifferent(values); } int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value) { - int ret = -100, ret1; + std::vector values(thisMultiDetector->numberOfDetectors, -1); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { - ret1 = (detectors[idet]->*somefunc)(value); + values[idet] = (detectors[idet]->*somefunc)(value); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; } - return ret; + return minusOneIfDifferent(values); } string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) @@ -3399,7 +3401,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); + return minusOneIfDifferent(return_values); } } @@ -3419,7 +3421,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); + return minusOneIfDifferent(return_values); } } @@ -3439,7 +3441,7 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) } threadpool->startExecuting(); threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); + return minusOneIfDifferent(return_values); } } From 49d6dcb6e20ed1c760a9074dae9f859de20dcb01 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Mon, 28 May 2018 13:23:30 +0200 Subject: [PATCH 22/24] templated functions in multi --- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 5 +++-- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index ca7013a29..fcb29aa8e 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -3302,9 +3302,10 @@ int multiSlsDetector::exitServer() } /* utility function to check a range of return values*/ -int multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) +template +T multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) { - int ret = -100; + T ret = -100; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { if (ret == -100) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 75901676c..b4f5d6024 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1050,7 +1050,9 @@ class multiSlsDetector : public slsDetectorUtils { int parallelCallDetectorMember(int (slsDetector::*somefunc)()); int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated int parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2); //Should probably be templated - int minusOneIfDifferent(const std::vector&); + + template + T minusOneIfDifferent(const std::vector&); /** returns the detector trimbit/settings directory \sa sharedSlsDetector */ std::string getSettingsDir(); From da1b6ad62d50ea2db24b65a3aee6d4c48ba3fa33 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Mon, 28 May 2018 17:12:19 +0200 Subject: [PATCH 23/24] more generalization in multi --- .../multiSlsDetector/multiSlsDetector.cpp | 365 +++++++++--------- .../multiSlsDetector/multiSlsDetector.h | 33 +- 2 files changed, 203 insertions(+), 195 deletions(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index fcb29aa8e..ff7d9ae47 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1007,7 +1007,7 @@ string multiSlsDetector::checkOnline() int multiSlsDetector::activate(int const enable) { - return callDetectorMemeber(&slsDetector::activate, enable); + return callDetectorMember(&slsDetector::activate, enable); } int multiSlsDetector::exists() @@ -1779,50 +1779,58 @@ void multiSlsDetector::resetFinalDataQueue() } } +// int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t) +// { + +// int64_t ret = -100; + +// if (!threadpool) { +// cout << "Error in creating threadpool. Exiting" << endl; +// return -1; +// } else { +// //return storage values +// int64_t* iret[thisMultiDetector->numberOfDetectors]; +// for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { +// if (detectors[idet]) { +// iret[idet] = new int64_t(-1); +// Task* task = new Task(new func2_t(&slsDetector::setTimer, +// detectors[idet], index, t, 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)); +// } +// } +// } + +// if (index == SAMPLES_JCTB) +// setDynamicRange(); + +// thisMultiDetector->timerValue[index] = ret; +// return ret; +// } int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t) { - - int64_t ret = -100; - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - //return storage values - int64_t* iret[thisMultiDetector->numberOfDetectors]; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - iret[idet] = new int64_t(-1); - Task* task = new Task(new func2_t(&slsDetector::setTimer, - detectors[idet], index, t, 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)); - } - } - } - + int64_t ret = parallelCallDetectorMember(&slsDetector::setTimer, index, t); if (index == SAMPLES_JCTB) setDynamicRange(); thisMultiDetector->timerValue[index] = ret; return ret; } - int64_t multiSlsDetector::getTimeLeft(timerIndex index) { int i; @@ -3302,16 +3310,16 @@ int multiSlsDetector::exitServer() } /* utility function to check a range of return values*/ -template +template T multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) { - T ret = -100; + T ret = static_cast(-100); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - if (ret == -100) + if (ret == static_cast(-100)) ret = return_values[idet]; else if (ret != return_values[idet]) - ret = -1; + ret = static_cast(-1); if (detectors[idet]->getErrorMask()) setErrorMask(getErrorMask() | (1 << idet)); } @@ -3319,24 +3327,36 @@ T multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) return ret; } -// 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)()) +void multiSlsDetector::setErrorMaskFromAllDetectors() { - std::vector values(thisMultiDetector->numberOfDetectors, -1); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + } +} + +template +bool allElementsEqual(const std::vector& v) +{ + if (v.empty()) + return true; + + const T& first = v[0]; + for (int i = 1; i != v.size(); ++i) { + if (v[i] != first) + return false; + } + return true; +} + +template +T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)()) +{ + //(Erik) to handle enums, probably a bad idea but follow previous code + T defaultValue = static_cast(-1); + std::vector values(thisMultiDetector->numberOfDetectors, defaultValue); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { values[idet] = (detectors[idet]->*somefunc)(); @@ -3346,9 +3366,12 @@ int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)()) return minusOneIfDifferent(values); } -int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int value) +template +T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)(V), V value) { - std::vector values(thisMultiDetector->numberOfDetectors, -1); + //(Erik) to handle enums, probably a bad idea but follow previous code + T defaultValue = static_cast(-1); + std::vector values(thisMultiDetector->numberOfDetectors, defaultValue); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) if (detectors[idet]) { values[idet] = (detectors[idet]->*somefunc)(value); @@ -3358,7 +3381,22 @@ int multiSlsDetector::callDetectorMemeber(int (slsDetector::*somefunc)(int), int return minusOneIfDifferent(values); } -string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) +template +T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2) +{ + //(Erik) to handle enums, probably a bad idea but follow previous code + T defaultValue = static_cast(-1); + std::vector values(thisMultiDetector->numberOfDetectors, defaultValue); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) + if (detectors[idet]) { + values[idet] = (detectors[idet]->*somefunc)(par1, par2); + if (detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask() | (1 << idet)); + } + return minusOneIfDifferent(values); +} + +std::string multiSlsDetector::callDetectorMember(string (slsDetector::*somefunc)()) { string concatenatedValue, firstValue; bool valueNotSame = false; @@ -3386,16 +3424,38 @@ string multiSlsDetector::callDetectorMemeber(string (slsDetector::*somefunc)()) return firstValue; } -int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value) +template +T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)()) { if (!threadpool) { cout << "Error in creating threadpool. Exiting" << endl; return -1; } else { - std::vector return_values(thisMultiDetector->numberOfDetectors, -1); + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) { - Task* task = new Task(new func1_t(somefunc, + Task* task = new Task(new func0_t(somefunc, + detectors[idet], &return_values[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + return minusOneIfDifferent(return_values); + } +} + +template +T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)(P1), P1 value) +{ + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + Task* task = new Task(new func1_t(somefunc, detectors[idet], value, &return_values[idet])); threadpool->add_task(task); } @@ -3406,6 +3466,27 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } } +template +T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2) +{ + if (!threadpool) { + cout << "Error in creating threadpool. Exiting" << endl; + return -1; + } else { + std::vector return_values(thisMultiDetector->numberOfDetectors, -1); + for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { + if (detectors[idet]) { + Task* task = new Task(new func2_t(somefunc, + detectors[idet], par1, par2, &return_values[idet])); + threadpool->add_task(task); + } + } + threadpool->startExecuting(); + threadpool->wait_for_tasks_to_complete(); + return minusOneIfDifferent(return_values); + } +} + int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2) { if (!threadpool) { @@ -3426,30 +3507,10 @@ int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(in } } -int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)()) -{ - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - std::vector return_values(thisMultiDetector->numberOfDetectors, -1); - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - Task* task = new Task(new func0_t(somefunc, - detectors[idet], &return_values[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); - } -} - /** returns the detector trimbit/settings directory */ string multiSlsDetector::getSettingsDir() { - return callDetectorMemeber(&slsDetector::getSettingsDir); + return callDetectorMember(&slsDetector::getSettingsDir); } /** sets the detector trimbit/settings directory \sa sharedSlsDetector */ @@ -3525,7 +3586,7 @@ int multiSlsDetector::getTrimEn(int* ene) */ string multiSlsDetector::getCalDir() { - return callDetectorMemeber(&slsDetector::getCalDir); + return callDetectorMember(&slsDetector::getCalDir); } /** @@ -3676,12 +3737,12 @@ int multiSlsDetector::setPort(portType t, int p) int multiSlsDetector::lockServer(int p) { - return callDetectorMemeber(&slsDetector::lockServer, p); + return callDetectorMember(&slsDetector::lockServer, p); } string multiSlsDetector::getLastClientIP() { - return callDetectorMemeber(&slsDetector::getLastClientIP); + return callDetectorMember(&slsDetector::getLastClientIP); } int multiSlsDetector::setReadOutFlags(readOutFlags flag) @@ -3751,12 +3812,12 @@ slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags(ext string multiSlsDetector::getSettingsFile() { - return callDetectorMemeber(&slsDetector::getSettingsFile); + return callDetectorMember(&slsDetector::getSettingsFile); } int multiSlsDetector::configureMAC() { - return callDetectorMemeber(&slsDetector::configureMAC); + return callDetectorMember(&slsDetector::configureMAC); } int multiSlsDetector::loadImageToDetector(imageType index, string const fname) @@ -3836,12 +3897,12 @@ int multiSlsDetector::writeCounterBlockFile(string const fname, int startACQ) int multiSlsDetector::resetCounterBlock(int startACQ) { - return callDetectorMemeber(&slsDetector::resetCounterBlock, startACQ); + return callDetectorMember(&slsDetector::resetCounterBlock, startACQ); } int multiSlsDetector::setCounterBit(int i) { - return callDetectorMemeber(&slsDetector::setCounterBit, i); + return callDetectorMember(&slsDetector::setCounterBit, i); } int multiSlsDetector::setDynamicRange(int p) @@ -3972,20 +4033,6 @@ int multiSlsDetector::getMaxNumberOfModules(dimension d) return ret; } -int multiSlsDetector::getFlippedData(dimension d) -{ - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->getFlippedData(d); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; -} - int multiSlsDetector::setNumberOfModules(int p, dimension d) { @@ -4027,18 +4074,14 @@ int multiSlsDetector::setNumberOfModules(int p, dimension d) return ret; } +int multiSlsDetector::getFlippedData(dimension d) +{ + return callDetectorMember(&slsDetector::getFlippedData, d); +} + int multiSlsDetector::setFlippedData(dimension d, int value) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setFlippedData(d, value); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMember(&slsDetector::setFlippedData, d, value); } int multiSlsDetector::enableGapPixels(int val) @@ -4047,7 +4090,7 @@ int multiSlsDetector::enableGapPixels(int val) std::cout << "Not implemented for this detector" << std::endl; val = -1; } - int ret = callDetectorMemeber(&slsDetector::enableGapPixels, val); + int ret = callDetectorMember(&slsDetector::enableGapPixels, val); if (val != -1) { // update data bytes incl gap pixels @@ -4118,18 +4161,6 @@ int64_t multiSlsDetector::getId(idMode mode, int imod) } } - ret = -100; - int64_t ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->getId(mode, imod); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; - return -1; } @@ -5083,20 +5114,7 @@ int multiSlsDetector::setReceiverFramesPerFile(int f) slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) { - int ret = -100, ret1; - - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { - if (detectors[idet]) { - ret1 = (int)detectors[idet]->setFileFormat(f); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - } - return (fileFormat)ret; + return callDetectorMember(&slsDetector::setFileFormat, f); } int multiSlsDetector::setFileIndex(int i) @@ -5761,12 +5779,12 @@ int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) int multiSlsDetector::lockReceiver(int lock) { - return callDetectorMemeber(&slsDetector::lockReceiver, lock); + return callDetectorMember(&slsDetector::lockReceiver, lock); } string multiSlsDetector::getReceiverLastClientIP() { - return callDetectorMemeber(&slsDetector::getReceiverLastClientIP); + return callDetectorMember(&slsDetector::getReceiverLastClientIP); } int multiSlsDetector::exitReceiver() @@ -5785,12 +5803,12 @@ int multiSlsDetector::exitReceiver() int multiSlsDetector::enableWriteToFile(int enable) { - return callDetectorMemeber(&slsDetector::enableWriteToFile, enable); + return callDetectorMember(&slsDetector::enableWriteToFile, enable); } int multiSlsDetector::overwriteFile(int enable) { - return callDetectorMemeber(&slsDetector::overwriteFile, enable); + return callDetectorMember(&slsDetector::overwriteFile, enable); } string multiSlsDetector::getErrorMessage(int& critical) @@ -5856,17 +5874,17 @@ int64_t multiSlsDetector::clearAllErrorMask() int multiSlsDetector::calibratePedestal(int frames) { - return callDetectorMemeber(&slsDetector::calibratePedestal, frames); + return callDetectorMember(&slsDetector::calibratePedestal, frames); } int multiSlsDetector::setReadReceiverFrequency(int freq) { - return callDetectorMemeber(&slsDetector::setReadReceiverFrequency, freq); + return callDetectorMember(&slsDetector::setReadReceiverFrequency, freq); } int multiSlsDetector::setReceiverReadTimer(int time_in_ms) { - return callDetectorMemeber(&slsDetector::setReceiverReadTimer, time_in_ms); + return callDetectorMember(&slsDetector::setReceiverReadTimer, time_in_ms); } int multiSlsDetector::enableDataStreamingToClient(int enable) @@ -5898,22 +5916,22 @@ int multiSlsDetector::enableDataStreamingFromReceiver(int enable) int multiSlsDetector::enableReceiverCompression(int i) { - return callDetectorMemeber(&slsDetector::enableReceiverCompression, i); + return callDetectorMember(&slsDetector::enableReceiverCompression, i); } int multiSlsDetector::enableTenGigabitEthernet(int i) { - return callDetectorMemeber(&slsDetector::enableTenGigabitEthernet, i); + return callDetectorMember(&slsDetector::enableTenGigabitEthernet, i); } int multiSlsDetector::setReceiverFifoDepth(int i) { - return callDetectorMemeber(&slsDetector::setReceiverFifoDepth, i); + return callDetectorMember(&slsDetector::setReceiverFifoDepth, i); } int multiSlsDetector::setReceiverSilentMode(int i) { - return callDetectorMemeber(&slsDetector::setReceiverSilentMode, i); + return callDetectorMember(&slsDetector::setReceiverSilentMode, i); } /** opens pattern file and sends pattern to CTB @@ -5949,18 +5967,7 @@ int multiSlsDetector::setCTBPattern(string fname) */ uint64_t multiSlsDetector::setCTBWord(int addr, uint64_t word) { - uint64_t ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setCTBWord(addr, word); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == (long long unsigned int)-100) - ret = ret1; - else if (ret != ret1) - ret = (long long unsigned int)-1; - } - return ret; + return callDetectorMember(&slsDetector::setCTBWord, addr, word); } /** Sets the pattern or loop limits in the CTB @@ -5993,18 +6000,7 @@ int multiSlsDetector::setCTBPatLoops(int level, int& start, int& stop, int& n) */ int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setCTBPatWaitAddr(level, addr); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMember(&slsDetector::setCTBPatWaitAddr, level, addr); } /** Sets the wait time in the CTB @@ -6014,18 +6010,7 @@ int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) */ int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t) { - int ret = -100, ret1; - for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) - if (detectors[idet]) { - ret1 = detectors[idet]->setCTBPatWaitTime(level, t); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; + return callDetectorMember(&slsDetector::setCTBPatWaitTime, level, t); } int multiSlsDetector::pulsePixel(int n, int x, int y) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index b4f5d6024..4359afd61 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1042,13 +1042,36 @@ class multiSlsDetector : public slsDetectorUtils { //virtual runStatus getRunStatus()=0; runStatus getRunStatus(); +void setErrorMaskFromAllDetectors(); + +template + bool allElemetsEqual(const std::vector&); + + template + T callDetectorMember(T (slsDetector::*somefunc)()); + + std::string callDetectorMember(std::string(slsDetector::*somefunc)()); + + template + T callDetectorMember(T (slsDetector::*somefunc)(V), V value); + + template + T callDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2); - std::string callDetectorMemeber(std::string(slsDetector::*somefunc)()); - int callDetectorMemeber(int (slsDetector::*somefunc)(int), int value); - int callDetectorMemeber(int (slsDetector::*somefunc)()); - int parallelCallDetectorMember(int (slsDetector::*somefunc)()); - int parallelCallDetectorMember(int (slsDetector::*somefunc)(int), int value); //Should probably be templated +//func0_t + template + T parallelCallDetectorMember(T (slsDetector::*somefunc)()); + +//func1_t + template + T parallelCallDetectorMember(T (slsDetector::*somefunc)(P1), P1 value); //Should probably be templated + + //func2_t + template + T parallelCallDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2); + + int parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), int v0, int v1, int v2); //Should probably be templated template From 32c1a45e11bb072d7813e4dad6ac516f10e3eb34 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Mon, 28 May 2018 18:46:08 +0200 Subject: [PATCH 24/24] minor --- slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index ff7d9ae47..8d34487f1 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -5789,7 +5789,7 @@ string multiSlsDetector::getReceiverLastClientIP() int multiSlsDetector::exitReceiver() { - + //(Erik) logic is flawed should return fail if any fails int ival = FAIL, iv; for (int idet = 0; idet < thisMultiDetector->numberOfDetectors; ++idet) { if (detectors[idet]) {