From 4939e4730504637a582659485165981e0cfbc814 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 14 Jul 2016 16:23:03 +0200 Subject: [PATCH] fixed dimensions, fixed rate corr bug, moved rate corr to server because config resets memory and ratecorr depends on client variables --- .../commonFiles/sls_detector_funcs.h | 3 +- ....3.11.2 => eigerDetectorServerv2.0.3.11.3} | Bin 268863 -> 269562 bytes .../eigerDetectorServer/gitInfo.txt | 8 +- .../eigerDetectorServer/gitInfoEiger.h | 8 +- .../slsDetectorFunctionList.c | 52 +-- .../slsDetectorServer_defs.h | 7 - slsDetectorSoftware/gitInfo.txt | 8 +- .../gotthardDetectorServer/gitInfo.txt | 8 +- .../gotthardDetectorServer/gitInfoGotthard.h | 8 +- .../moenchDetectorServer/gitInfo.txt | 8 +- .../moenchDetectorServer/gitInfoMoench.h | 8 +- .../multiSlsDetector/multiSlsDetector.cpp | 134 ++++--- .../mythenDetectorServer/gitInfo.txt | 8 +- .../mythenDetectorServer/gitInfoMythen.h | 8 +- slsDetectorSoftware/slsDetector/gitInfoLib.h | 8 +- .../slsDetector/slsDetector.cpp | 342 +++++++++--------- .../slsDetectorFunctionList.h | 5 +- .../slsDetectorServer_funcs.c | 144 +++++--- .../slsDetectorServer_funcs.h | 4 +- 19 files changed, 413 insertions(+), 358 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.0.3.11.2 => eigerDetectorServerv2.0.3.11.3} (55%) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index 8c4612339..b0c63f366 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -100,7 +100,8 @@ enum { F_PULSE_PIXEL_AND_MOVE, /** < pulse pixel n number of times and move relatively by x and y */ F_PULSE_CHIP, /** < pulse chip n number of times */ - F_SET_RATE_CORRECT /** < set/reset rate correction tau */ + F_SET_RATE_CORRECT, /** < set/reset rate correction tau */ + F_GET_RATE_CORRECT, /** < get rate correction tau */ /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.11.2 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.11.3 similarity index 55% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.11.2 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.11.3 index 045995ec4aeaf676f8d041e12bec448ccfe0c266..2ad0e4c9820ed5edf7f79d49d9bd5b46af8acb5a 100755 GIT binary patch delta 52748 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 -2){ - //set settings, with no tau in calib file - if(tau_ns == -1){ - tau_ns = getDefaultSettingsTau_in_nsec(); - //incorrect settings - if(tau_ns < 0) - return -1; - } - //set the tau for all - int64_t rate_retval = setRateCorrection(tau_ns); //tau_ns will not be -1 here - if(tau_ns != rate_retval){ - if(rate_retval == -1) - return -2; - else - return -3; - } - //set settings, with no tau in calib file : - //only setting tau, rate correction should be off - //(in previous "error" returns, its switched off anyway) - if(tau_ns == -1) - setRateCorrection(0); - }else cprintf(RED,"rate not changed\n"); - - //set the gains and offset variables locally for(i=0;i=0){ @@ -629,7 +610,7 @@ int setModule(sls_detector_module myMod, int* gain, int* offset,int* delay, int6 return FAIL; } - return 0; + return thisSettings; } @@ -728,6 +709,9 @@ enum detectorSettings setSettings(enum detectorSettings sett, int imod){ return thisSettings; } +enum detectorSettings getSettings(){ + return thisSettings; +} int startReceiver(int d){ printf("Going to prepare for acquisition with counter_bit:%d\n",Feb_Control_Get_Counter_Bit()); diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index c41e5cdbf..aa52415a8 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -40,12 +40,5 @@ enum detDacIndex{SVP,VTR,VRF,VRS,SVN,VTGSTV,VCMP_LL,VCMP_LR,CAL,VCMP_RL,RXB_RB,RXB_LB,VCMP_RR,VCP,VCN,VIS,VTHRESHOLD}; -enum defaultTauValues{ - HIGHGAIN_TAU=410, - STANDARD_TAU=290, - LOWGAIN_TAU=180}; - - - #endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt index ff4d07177..21995d17e 100644 --- a/slsDetectorSoftware/gitInfo.txt +++ b/slsDetectorSoftware/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 769ba51f2796ac8088f29a6cdb87955befbbdae2 -Revision: 1103 +Repsitory UUID: f65bc993ef8b3548b52e677b3f42ae6229611d73 +Revision: 1109 Branch: developer Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 1103 -Last Changed Date: 2016-07-05 17:24:44 +0200 +Last Changed Rev: 1109 +Last Changed Date: 2016-07-12 16:45:00 +0200 diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt b/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt index feecb2fe1..ccc7dba44 100644 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/gotthardDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git/gotthardDetectorServer Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 769ba51f2796ac8088f29a6cdb87955befbbdae2 -Revision: 193 +Repsitory UUID: f65bc993ef8b3548b52e677b3f42ae6229611d73 +Revision: 194 Branch: developer Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 326 -Last Changed Date: 2016-07-05 17:24:44 +0200 +Last Changed Rev: 327 +Last Changed Date: 2016-07-12 16:45:00 +0200 diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h index 703367eae..fe0441c2c 100644 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h +++ b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git/gotthardDetectorServer" //#define SVNREPPATH "" -#define SVNREPUUID "769ba51f2796ac8088f29a6cdb87955befbbdae2" -//#define SVNREV 0x326 +#define SVNREPUUID "f65bc993ef8b3548b52e677b3f42ae6229611d73" +//#define SVNREV 0x327 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x326 -#define SVNDATE 0x20160705 +#define SVNREV 0x327 +#define SVNDATE 0x20160712 // diff --git a/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt b/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt index f02addb2f..4124ace98 100644 --- a/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt +++ b/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt @@ -1,9 +1,9 @@ Path: slsDetectorsPackage/slsDetectorSoftware/moenchDetectorServer URL: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git/moenchDetectorServer Repository Root: origin git@git.psi.ch:sls_detectors_software/sls_detector_software.git -Repsitory UUID: 769ba51f2796ac8088f29a6cdb87955befbbdae2 -Revision: 76 +Repsitory UUID: f65bc993ef8b3548b52e677b3f42ae6229611d73 +Revision: 77 Branch: developer Last Changed Author: Dhanya_Maliakal -Last Changed Rev: 326 -Last Changed Date: 2016-07-05 17:24:44 +0200 +Last Changed Rev: 327 +Last Changed Date: 2016-07-12 16:45:00 +0200 diff --git a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h b/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h index 1830efbef..2370e9a5c 100644 --- a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h +++ b/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h @@ -1,11 +1,11 @@ //#define SVNPATH "" #define SVNURL "git@git.psi.ch:sls_detectors_software/sls_detector_software.git/moenchDetectorServer" //#define SVNREPPATH "" -#define SVNREPUUID "769ba51f2796ac8088f29a6cdb87955befbbdae2" -//#define SVNREV 0x326 +#define SVNREPUUID "f65bc993ef8b3548b52e677b3f42ae6229611d73" +//#define SVNREV 0x327 //#define SVNKIND "" //#define SVNSCHED "" #define SVNAUTH "Dhanya_Maliakal" -#define SVNREV 0x326 -#define SVNDATE 0x20160705 +#define SVNREV 0x327 +#define SVNDATE 0x20160712 // diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 16832ce3f..6acd95006 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -421,7 +421,8 @@ void multiSlsDetector::updateOffsets(){ for (int i=0; inumberOfDetectors; i++) { if (detectors[i]) { - cout<<"offsetY:"<getTotalNumberOfChannels(Y) <<" maxChanY:"<getTotalNumberOfChannels(Y) <<" maxChanY:"< 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; - prevChanY = 0; + prevChanY = detectors[i]->getTotalNumberOfChannels(Y);; numY = 0; //assuming symmetry with this statement. whats on 1st column should be on 2nd column maxY = 0; offsetX += prevChanX; @@ -1740,15 +1741,6 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t){ // check return values!!! thisMultiDetector->timerValue[index]=ret1; - - - if (getDetectorsType() == EIGER) { - //if subexptime set, update rate correction in server and update result in multi client - double r; - if((index == SUBFRAME_ACQUISITION_TIME) && (t>=0) && getRateCorrection(r)){ - setRateCorrection(r); - } - } return ret1; }; @@ -2547,19 +2539,31 @@ int multiSlsDetector::flatFieldCorrect(double* datain, double *errin, double* da int multiSlsDetector::setRateCorrection(double t){ - // double tdead[]=defaultTDead; - if (getDetectorsType() == MYTHEN){ #ifdef VERBOSE - std::cout<< "Setting rate correction with dead time "<< thisMultiDetector->tDead << std::endl; + std::cout<< "Setting rate correction with dead time "<< thisMultiDetector->tDead << std::endl; #endif - if (t==0) { - thisMultiDetector->correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<numberOfDetectors; idet++) { + if (detectors[idet]) { + ret=detectors[idet]->setRateCorrection(t); + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<numberOfDetectors; idet++) { @@ -2574,76 +2578,62 @@ int multiSlsDetector::setRateCorrection(double t){ } } - if (getDetectorsType() != MYTHEN){ - if (ret1==0) - thisMultiDetector->correctionMask&=~(1<correctionMask|=(1<correctionMask&(1<correctionMask&(1<correctionMask&(1<tDead << std::endl; + std::cout<< "Rate correction is enabled with dead time "<< thisMultiDetector->tDead << std::endl; #endif - return 1; - } else - t=0; + return 1; + } else + t=0; #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + std::cout<< "Rate correction is disabled " << std::endl; #endif - return 0; + return 0; }; double multiSlsDetector::getRateCorrectionTau(){ - double ret1=-100,ret; - for (int idet=0; idetnumberOfDetectors; idet++) { - if (detectors[idet]) { - ret=detectors[idet]->getRateCorrectionTau(); - if (ret1==-100) - ret1=ret; - else if (ret!=ret1){ - std::cout<< "Rate correction is different for different readouts " << std::endl; - if(getDetectorsType() == EIGER) - ret1=-2; - else - ret1=-1; //same settings also return -1 - } - } - } + double ret1=-100,ret; + for (int idet=0; idetnumberOfDetectors; idet++) { + if (detectors[idet]) { + ret=detectors[idet]->getRateCorrectionTau(); + if (ret1==-100) + ret1=ret; + else if (ret!=ret1){ + std::cout<< "Rate correction is different for different readouts " << std::endl; + ret1=-1; + } + } + } - if (getDetectorsType() != MYTHEN){ - //if set by the slsDetector - if(ret1 == 0) - thisMultiDetector->correctionMask&=~(1<correctionMask|=(1<correctionMask&(1<correctionMask&(1<tDead << std::endl; + std::cout<< "Rate correction is enabled with dead time "<< thisMultiDetector->tDead << std::endl; #endif - } else { + } else { #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + std::cout<< "Rate correction is disabled " << std::endl; #endif - ret1=0; - } - return ret1; + ret1=0; + } + return ret1; }; @@ -2651,6 +2641,10 @@ double multiSlsDetector::getRateCorrectionTau(){ int multiSlsDetector::getRateCorrection(){ + if (getDetectorsType() == EIGER){ + return getRateCorrectionTau(); + } + if (thisMultiDetector->correctionMask&(1<onlineFlag==ONLINE_FLAG) { - if (connectControl() == OK){ - controlSocket->SendDataOnly(&fnum,sizeof(fnum)); - sendModule(&module); + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + sendModule(&module); - //extra gain and offset - eiger - if((thisDetector->nGain) && (gainval)) - controlSocket->SendDataOnly(gainval,sizeof(int)*thisDetector->nGain); - if((thisDetector->nOffset) && (offsetval)) - controlSocket->SendDataOnly(offsetval,sizeof(int)*thisDetector->nOffset); - if(thisDetector->myDetectorType == EIGER) - controlSocket->SendDataOnly(iodelay,sizeof(int)); - if(thisDetector->myDetectorType == EIGER) - controlSocket->SendDataOnly(&tau,sizeof(tau)); + //extra gain and offset - eiger + if((thisDetector->nGain) && (gainval)) + controlSocket->SendDataOnly(gainval,sizeof(int)*thisDetector->nGain); + if((thisDetector->nOffset) && (offsetval)) + controlSocket->SendDataOnly(offsetval,sizeof(int)*thisDetector->nOffset); + if(thisDetector->myDetectorType == EIGER){ + controlSocket->SendDataOnly(iodelay,sizeof(int)); + controlSocket->SendDataOnly(&tau,sizeof(tau)); + } - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=FAIL) { - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - } else { - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - } - disconnectControl(); - if (ret==FORCE_UPDATE) - updateDetector(); - } - } + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=FAIL) + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + else { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + } + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } - if(ret == FAIL && thisDetector->myDetectorType == EIGER && strcasestr(mess,"Rate")){ - setErrorMask((getErrorMask())|(COULD_NOT_SET_RATE_CORRECTION)); - if(strcasestr(mess,"tau/subexptime")) - setErrorMask((getErrorMask())|(RATE_CORRECTION_TAU_SUBEXPOSURE)); - thisDetector->correctionMask&=~(1<tDead = 0; - } - if (ret!=FAIL) { - if (detectorModules) { - if (imod>=0 && imodnMod[X]*thisDetector->nMod[Y]) { - (detectorModules+imod)->nchan=module.nchan; - (detectorModules+imod)->nchip=module.nchip; - (detectorModules+imod)->ndac=module.ndac; - (detectorModules+imod)->nadc=module.nadc; - thisDetector->nChips=module.nchip; - thisDetector->nChans=module.nchan/module.nchip; - thisDetector->nDacs=module.ndac; - thisDetector->nAdcs=module.nadc; + if (ret!=FAIL) { + if (detectorModules) { + if (imod>=0 && imodnMod[X]*thisDetector->nMod[Y]) { + (detectorModules+imod)->nchan=module.nchan; + (detectorModules+imod)->nchip=module.nchip; + (detectorModules+imod)->ndac=module.ndac; + (detectorModules+imod)->nadc=module.nadc; + thisDetector->nChips=module.nchip; + thisDetector->nChans=module.nchan/module.nchip; + thisDetector->nDacs=module.ndac; + thisDetector->nAdcs=module.nadc; - if(thisDetector->myDetectorType != JUNGFRAU){ - for (int ichip=0; ichipnChips; ichip++) { - if (chipregs) - chipregs[ichip+thisDetector->nChips*imod]=module.chipregs[ichip]; + if(thisDetector->myDetectorType != JUNGFRAU){ + for (int ichip=0; ichipnChips; ichip++) { + if (chipregs) + chipregs[ichip+thisDetector->nChips*imod]=module.chipregs[ichip]; - if (chanregs) { - for (int i=0; inChans; i++) { - chanregs[i+ichip*thisDetector->nChans+thisDetector->nChips*thisDetector->nChans*imod]=module.chanregs[ichip*thisDetector->nChans+i]; + if (chanregs) { + for (int i=0; inChans; i++) { + chanregs[i+ichip*thisDetector->nChans+thisDetector->nChips*thisDetector->nChans*imod]=module.chanregs[ichip*thisDetector->nChans+i]; + } + } + } + if (adcs) { + for (int i=0; inAdcs; i++) + adcs[i+imod*thisDetector->nAdcs]=module.adcs[i]; + } } + + if (dacs) { + for (int i=0; inDacs; i++) + dacs[i+imod*thisDetector->nDacs]=module.dacs[i]; + } + + (detectorModules+imod)->gain=module.gain; + (detectorModules+imod)->offset=module.offset; + (detectorModules+imod)->serialnumber=module.serialnumber; + (detectorModules+imod)->reg=module.reg; } } - if (adcs) { - for (int i=0; inAdcs; i++) - adcs[i+imod*thisDetector->nAdcs]=module.adcs[i]; + + if ((thisDetector->nGain) && (gainval) && (gain)) { + for (int i=0; inGain; i++) + gain[i+imod*thisDetector->nGain]=gainval[i]; } - } - if (dacs) { - for (int i=0; inDacs; i++) - dacs[i+imod*thisDetector->nDacs]=module.dacs[i]; - } + if ((thisDetector->nOffset) && (offsetval) && (offset)) { + for (int i=0; inOffset; i++) + offset[i+imod*thisDetector->nOffset]=offsetval[i]; + } - (detectorModules+imod)->gain=module.gain; - (detectorModules+imod)->offset=module.offset; - (detectorModules+imod)->serialnumber=module.serialnumber; - (detectorModules+imod)->reg=module.reg; - } - } - - if ((thisDetector->nGain) && (gainval) && (gain)) { - for (int i=0; inGain; i++) - gain[i+imod*thisDetector->nGain]=gainval[i]; } - if ((thisDetector->nOffset) && (offsetval) && (offset)) { - for (int i=0; inOffset; i++) - offset[i+imod*thisDetector->nOffset]=offsetval[i]; - } - } - #ifdef VERBOSE - std::cout<< "Module register returned "<< retval << std::endl; + std::cout<< "Module register returned "<< retval << std::endl; #endif - return retval; + return retval; }; @@ -3956,7 +3950,10 @@ int64_t slsDetector::setTimer(timerIndex index, int64_t t){ setTotalProgress(); } - + double r; + if((index == SUBFRAME_ACQUISITION_TIME) && (thisDetector->myDetectorType == EIGER) && (t>=0) && getRateCorrection(r)){ + setRateCorrection(r); + } //send acquisiton period/frame number to receiver if((index==FRAME_NUMBER)||(index==FRAME_PERIOD)||(index==CYCLES_NUMBER)){ @@ -5001,110 +4998,126 @@ int slsDetector::flatFieldCorrect(double* datain, double *errin, double* dataout int slsDetector::setRateCorrection(double t){ - if (getDetectorsType() == MYTHEN){ - double tdead[]=defaultTDead; - if (t==0) { + if (getDetectorsType() == EIGER){ + int fnum=F_SET_RATE_CORRECT; + int ret=FAIL; + char mess[1000]=""; + int64_t arg = t; + int64_t retval = -1; #ifdef VERBOSE - std::cout<< "unsetting rate correction" << std::endl; + std::cout<< "Setting Rate Correction to " << arg << endl; #endif - thisDetector->correctionMask&=~(1<correctionMask|=(1<0) - thisDetector->tDead=t; - else { - if (thisDetector->currentSettings<3 && thisDetector->currentSettings>-1) - thisDetector->tDead=tdead[thisDetector->currentSettings]; - else - thisDetector->tDead=0; - } -#ifdef VERBOSE - std::cout<< "Setting rate correction with dead time "<< thisDetector->tDead << std::endl; -#endif - } - return thisDetector->correctionMask&(1<SendDataOnly(&fnum,sizeof(fnum)); - controlSocket->SendDataOnly(&arg,sizeof(arg)); - controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret!=FAIL) { - controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); - if(retval<0){ - thisDetector->correctionMask&=~(1<tDead = 0; - }else{ - if(retval>0){ - thisDetector->correctionMask|=(1<tDead = -1; - else - thisDetector->tDead = (double)retval; - } - else{ - thisDetector->correctionMask&=~(1<tDead = (double)retval; - } + if (setOnline(ONLINE_FLAG)==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&arg,sizeof(arg)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(COULD_NOT_SET_RATE_CORRECTION)); + if(strcasestr(mess,"tau/subexptime")) + setErrorMask((getErrorMask())|(RATE_CORRECTION_TAU_SUBEXPOSURE)); } - } else { - controlSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Detector returned error: " << mess << std::endl; - setErrorMask((getErrorMask())|(COULD_NOT_SET_RATE_CORRECTION)); - if(strcasestr(mess,"tau/subexptime")) - setErrorMask((getErrorMask())|(RATE_CORRECTION_TAU_SUBEXPOSURE)); - thisDetector->correctionMask&=~(1<tDead = 0; + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); } - disconnectControl(); - if (ret==FORCE_UPDATE) - updateDetector(); } + return ret; //only success/fail } + + //mythen + double tdead[]=defaultTDead; + if (t==0) { +#ifdef VERBOSE + std::cout<< "unsetting rate correction" << std::endl; +#endif + thisDetector->correctionMask&=~(1<correctionMask|=(1<0) + thisDetector->tDead=t; + else { + if (thisDetector->currentSettings<3 && thisDetector->currentSettings>-1) + thisDetector->tDead=tdead[thisDetector->currentSettings]; + else + thisDetector->tDead=0; + } +#ifdef VERBOSE + std::cout<< "Setting rate correction with dead time "<< thisDetector->tDead << std::endl; +#endif + } return thisDetector->correctionMask&(1<correctionMask&(1<myDetectorType == EIGER){ + t = getRateCorrectionTau(); + return t; + } + + if (thisDetector->correctionMask&(1<tDead << std::endl; + std::cout<< "Rate correction is enabled with dead time "<< thisDetector->tDead << std::endl; #endif - t=thisDetector->tDead; - return 1; - } else - t=0; + t=thisDetector->tDead; + return 1; + } else + t=0; #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + std::cout<< "Rate correction is disabled " << std::endl; #endif - return 0; + return 0; }; double slsDetector::getRateCorrectionTau(){ - if (thisDetector->correctionMask&(1<myDetectorType == EIGER){ + int fnum=F_GET_RATE_CORRECT; + int ret=FAIL; + char mess[1000]=""; + int64_t retval = -1; + #ifdef VERBOSE + std::cout<< "Setting Rate Correction to " << arg << endl; + #endif + if (setOnline(ONLINE_FLAG)==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret!=FAIL) + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + else { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + } + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + + return double(retval); + } + + + //mythen only + if (thisDetector->correctionMask&(1<tDead << std::endl; + std::cout<< "Rate correction is enabled with dead time "<< thisDetector->tDead << std::endl; #endif - return thisDetector->tDead; - //return 1; - } else + return thisDetector->tDead; + //return 1; + } else #ifdef VERBOSE - std::cout<< "Rate correction is disabled " << std::endl; + std::cout<< "Rate correction is disabled " << std::endl; #endif - return 0; + return 0; }; @@ -5113,6 +5126,11 @@ double slsDetector::getRateCorrectionTau(){ int slsDetector::getRateCorrection(){ + if (thisDetector->myDetectorType == EIGER){ + double t = getRateCorrectionTau(); + return (int)t; + } + if (thisDetector->correctionMask&(1< -2){ //ignore -2: from load settings) + + //set default tau value (-1 or a normal value) + setDefaultSettingsTau_in_nsec(myTau); + + //switch off rate correction: no value read from load calib/load settings) + if(myTau == -1){ + ret = FAIL; + if(getRateCorrectionEnable()){ + setRateCorrection(0); + strcat(mess," Cannot set Rate correction. No default tau provided. Deactivating Rate Correction\n"); + }else{ + strcat(mess," Cannot set Rate correction. No default tau provided\n"); + } + cprintf(RED,"%s",mess); + } + + + //normal tau value (only if enabled) + else if (getRateCorrectionEnable()){ + int64_t retvalTau = setRateCorrection(myTau); //myTau will not be -1 here + if(myTau != retvalTau){ + if(retvalTau == -1) + strcat(mess," Rate correction Deactivated, (tau/subexptime) must be < 0.0015\n"); + cprintf(RED,"%s",mess); + ret=FAIL; + } + } } + retval = getSettings(); + #else ret=setModule(myModule); -#endif retval = ret; +#endif } } #endif @@ -3863,10 +3880,9 @@ int pulse_chip(int file_des) { -int rate_correct(int file_des) { +int set_rate_correct(int file_des) { int64_t tau_ns=-1; int n; - int64_t retval=-1; int ret=OK,ret1=OK; sprintf(mess,"can't set/unset rate correction\n"); @@ -3886,30 +3902,39 @@ int rate_correct(int file_des) { #ifdef SLS_DETECTOR_FUNCTION_LIST - //tau = -1, use default tau of settings - if((ret==OK)&&(tau_ns<0)){ - tau_ns = getDefaultSettingsTau_in_nsec(); - if(tau_ns < 0){ - ret = FAIL; - sprintf(mess,"Cannot set rate correction. Settings %d not recognized by detector\n",thisSettings); - cprintf(RED,"%s",mess); - } - } - - if (ret==OK) { printf("Setting rate correction to %lld ns\n",tau_ns); - if (differentClients==1 && lockStatus==1 && tau_ns!=-1) { + if (differentClients==1 && lockStatus==1) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); } else { - retval = setRateCorrection(tau_ns); //tau_ns will not be -1 here - if(tau_ns != retval){ - if(retval == -1) - strcpy(mess,"Rate correction Deactivated, (tau/subexptime) must be < 0.0015\n"); + + //tau = -1, use default tau of settings + if((ret==OK)&&(tau_ns<0)){ + tau_ns = getDefaultSettingsTau_in_nsec(); + } + //still negative (not set) + if(tau_ns < 0){ + ret = FAIL; + if(getRateCorrectionEnable()){ + setRateCorrection(0); + strcpy(mess,"Cannot set rate correction as default tau not provided. Switching off Rate Correction\n"); + }else{ + strcpy(mess,"Cannot set rate correction as default tau not provided\n"); + } cprintf(RED,"%s",mess); - ret=FAIL; + } + + //set rate + else{ + int64_t retval = setRateCorrection(tau_ns); //tau_ns will not be -1 here + if(tau_ns != retval){ + if(retval == -1) + strcpy(mess,"Rate correction Deactivated, (tau/subexptime) must be < 0.0015\n"); + cprintf(RED,"%s",mess); + ret=FAIL; + } } } } @@ -3923,8 +3948,45 @@ int rate_correct(int file_des) { n = sendData(file_des,&ret1,sizeof(ret),INT32); if (ret==FAIL) { n = sendData(file_des,mess,sizeof(mess),OTHER); - } else { - n = sendData(file_des,&retval,sizeof(retval),INT64); + } + + return ret; +} + + + + +int get_rate_correct(int file_des) { + int64_t retval=-1; + int ret=OK,ret1=OK; + + sprintf(mess,"can't get rate correction\n"); + + +#ifndef EIGERD + sprintf(mess,"Rate Correction not implemented for this detector\n"); + cprintf(RED,"%s",mess); + ret=FAIL; +#endif + +#ifdef SLS_DETECTOR_FUNCTION_LIST + + if (ret==OK) { + retval = getCurrentTau(); + printf("Getting rate correction %lld\n",(long long int)retval); + } +#endif + if ((ret==OK) && (differentClients)) + ret=FORCE_UPDATE; + + + //ret could be swapped during sendData + ret1 = ret; + sendData(file_des,&ret1,sizeof(ret),INT32); + if (ret==FAIL) { + sendData(file_des,mess,sizeof(mess),OTHER); + } else { + sendData(file_des,&retval,sizeof(retval),INT64); } return ret; diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index c2fa38438..a1bd9a16b 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -87,7 +87,7 @@ int set_counter_bit(int); int pulse_pixel(int); int pulse_pixel_and_move(int); int pulse_chip(int); -int rate_correct(int); - +int set_rate_correct(int); +int get_rate_correct(int); #endif