diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index 958b692c7..930689f78 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -49,8 +49,8 @@ double Feb_Control_exposure_time_in_sec; int Feb_Control_subframe_exposure_time_in_10nsec; double Feb_Control_exposure_period_in_sec; -int Feb_Control_RateTable_Tau_in_nsec = -1; -int Feb_Control_RateTable_Subexptime_in_nsec = -1; +int64_t Feb_Control_RateTable_Tau_in_nsec = -1; +int64_t Feb_Control_RateTable_Subexptime_in_nsec = -1; unsigned int Feb_Control_trimbit_size; unsigned int* Feb_Control_last_downloaded_trimbits; @@ -1797,10 +1797,11 @@ int Feb_Control_PulseChip(int npulses){ -int Feb_Control_Get_RateTable_Tau_in_nsec(){ return Feb_Control_RateTable_Tau_in_nsec;} -int Feb_Control_Get_RateTable_Subexptime_in_nsec(){ return Feb_Control_RateTable_Subexptime_in_nsec;} +int64_t Feb_Control_Get_RateTable_Tau_in_nsec(){ return Feb_Control_RateTable_Tau_in_nsec;} +int64_t Feb_Control_Get_RateTable_Subexptime_in_nsec(){ return Feb_Control_RateTable_Subexptime_in_nsec;} -int Feb_Control_SetRateCorrectionTau(int tau_in_Nsec){ +//returns -1 if slope is too high +int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec){ double sub_expure_time_in_sec = (double)(Feb_Control_GetSubFrameExposureTime())/(double)1e9; double tau_in_sec = (double)tau_in_Nsec/(double)1e9; @@ -1814,9 +1815,9 @@ int Feb_Control_SetRateCorrectionTau(int tau_in_Nsec){ return 0; } - printf("\tCalculating table for tau of %f ns.\n", tau_in_Nsec); - - for(int i=0;i=np){ - cprintf(BG_RED,"Error bin problem ???\n"); - return 0; + cprintf(RED,"Error: (tau/subexptime) must be < 0.0015 \n"); + return -1; } double x = Feb_Control_rate_meas[next_i] - b*4; double y = next_i; - printf("Start Loop x: %f,\t y: %f,\t s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " + /*printf("Start Loop x: %f,\t y: %f,\t s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " "next_i: %d,\t b: %d,\t Feb_Control_rate_meas[next_i]: %f\n", - x, y, s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]); + x, y, s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]);*/ if(x < -0.5) continue; if(x > 3.5) break; @@ -1862,9 +1863,9 @@ int Feb_Control_SetRateCorrectionTau(int tau_in_Nsec){ sy += y; sxx += x*x; sxy += x*y; - printf("End Loop x: %f,\t y: %f,\t s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " + /*printf("End Loop x: %f,\t y: %f,\t s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " "next_i: %d,\t b: %d,\t Feb_Control_rate_meas[next_i]: %f\n", - x, y, s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]); + x, y, s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]);*/ } double delta = s*sxx - sx*sx; b0[b] = (sxx*sy - sx*sxy)/delta; @@ -1872,20 +1873,20 @@ int Feb_Control_SetRateCorrectionTau(int tau_in_Nsec){ if(m[b]<0||m[b]>15) m[b]=15; - printf("After Loop s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " + /*printf("After Loop s: %f,\t sx: %f,\t sy: %f,\t sxx: %f,\t sxy: %f,\t " "next_i: %d,\t b: %d,\t Feb_Control_rate_meas[next_i]: %f\n", - s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]); + s, sx, sy, sxx, sxy, next_i, b, Feb_Control_rate_meas[next_i]);*/ // cout<=0){ - if(n>0){ - int tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec(); - int subexp_in_nsec = Feb_Control_Get_RateTable_Subexptime_in_nsec(); - //same setting - if(tau_in_nsec == n) && (subexp_in_nsec == Feb_Control_GetSubFrameExposureTime()){ - printf("Same Tau %dns, Same subexptime %dns = Same setting, not rewriting rate correction table\n"); - } - //different setting, calculate table - else if(!Feb_Control_SetRateCorrectionTau(n)){ - cprintf(RED,"Rate correction failed. Deactivating rate correction\n"); - SetRateCorrectionVariable(0); - return 0; - } - //activating rate correction - SetRateCorrectionVariable(1); - Feb_Control_PrintCorrectedValues(); - }else{ - //deactivating rate correction - SetRateCorrectionVariable(0); - } +int setRateCorrection(int64_t custom_tau_in_nsec){//in nanosec (will never be -1) + + //deactivating rate correction + if(custom_tau_in_nsec==0){ + Feb_Control_SetRateCorrectionVariable(0); + return 0; } - //return tau if it is a valid value (written to memory properly) - int tau_in_nsec = Feb_Control_GetTau_in_nsec(); - if(tau_in_nsec>=0) - return tau_in_nsec; - else - return 0; + int64_t tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec(); + int64_t subexp_in_nsec = Feb_Control_Get_RateTable_Subexptime_in_nsec(); + //same setting + if((tau_in_nsec == custom_tau_in_nsec) && (subexp_in_nsec == Feb_Control_GetSubFrameExposureTime())){ + printf("Rate Table already created before: Same Tau %lldns, Same subexptime %lldns\n", + tau_in_nsec,subexp_in_nsec); + } + //different setting, calculate table + else{ + int ret = Feb_Control_SetRateCorrectionTau(custom_tau_in_nsec); + if(ret<=0){ + cprintf(RED,"Rate correction failed. Deactivating rate correction\n"); + Feb_Control_SetRateCorrectionVariable(0); + return ret;//-1 is for tau/subexptime error, 0 for all other errors + } + } + //activating rate correction + Feb_Control_SetRateCorrectionVariable(1); +#ifdef VERBOSE + Feb_Control_PrintCorrectedValues(); +#endif + + return Feb_Control_Get_RateTable_Tau_in_nsec(); } @@ -576,6 +577,7 @@ int setModule(sls_detector_module myMod, int* gain, int* offset){ return FAIL; } + return 0; } diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index efed927c6..c41e5cdbf 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -40,4 +40,12 @@ 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/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 1c25da38c..4c72a5293 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1143,6 +1143,7 @@ slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings } thisMultiDetector->currentSettings=ret1; + return ret1; } @@ -1629,6 +1630,15 @@ int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t){ 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; }; @@ -2417,6 +2427,9 @@ 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; +#endif if (t==0) { thisMultiDetector->correctionMask&=~(1<correctionMask&(1<tDead << std::endl; -#endif - - //mismatch between detectors - if(ret1 == -1) - return ret1; - if (getDetectorsType() != MYTHEN){ - if (ret1==0) { + if (ret1<=0) thisMultiDetector->correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<correctionMask&(1<tDead << std::endl; #endif + + if (getDetectorsType() != MYTHEN) + t = getRateCorrectionTau(); + return 1; } else t=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 4f28e5e9c..0d22aaedd 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -2771,6 +2771,11 @@ int slsDetector::setModule(sls_detector_module module, int* gainval, int* offset } } + if(ret == FAIL && thisDetector->myDetectorType == EIGER && strcasestr(mess,"tau")){ + setErrorMask((getErrorMask())|(COULD_NOT_SET_RATE_CORRECTION)); + thisDetector->correctionMask&=~(1<tDead = 0; + } if (ret!=FAIL) { if (detectorModules) { @@ -5005,25 +5010,27 @@ int slsDetector::setRateCorrection(double t){ #ifdef VERBOSE std::cout<< "Setting Rate Correction to " << arg << endl; #endif - if (thisDetector->onlineFlag==ONLINE_FLAG) { + 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(&retval,sizeof(retval)); - if(retval<0) + if(retval<0){ thisDetector->correctionMask&=~(1<0) - thisDetector->correctionMask|=(1<correctionMask&=~(1<tDead = (double)retval/(double)1e9; - + thisDetector->tDead = 0; + }else{ + if(retval>0) + thisDetector->correctionMask|=(1<correctionMask&=~(1<tDead = (double)retval/(double)1e9; + } } else { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(COULD_NOT_SET_RATE_CORRECTION)); thisDetector->correctionMask&=~(1<tDead = 0; } @@ -5032,6 +5039,7 @@ int slsDetector::setRateCorrection(double t){ updateDetector(); } } + return thisDetector->correctionMask&(1<getRateCorrection(t)) { - sprintf(answer,"%f",t); + sprintf(answer,"%0.9f",t); } else { sprintf(answer,"%f",0.); } @@ -1954,7 +1954,7 @@ string slsDetectorCommand::helpRateCorr(int narg, char *args[], int action){ if (action==GET_ACTION || action==HELP_ACTION) os << string("ratecorr \t returns the dead time used for rate correections in ns \n"); if (action==PUT_ACTION || action==HELP_ACTION) - os << string("ratecorr ns \t sets the deadtime correction constant in ns\n"); + os << string("ratecorr ns \t sets the deadtime correction constant in ns, -1 in Eiger will set it to default tau of that settings\n"); return os.str(); } @@ -3053,7 +3053,7 @@ string slsDetectorCommand::cmdSettings(int narg, char *args[], int action) { myDet->setOnline(ONLINE_FLAG); if (cmd=="settings") { - if (action==PUT_ACTION) + if (action==PUT_ACTION) myDet->setSettings(myDet->getDetectorSettings(string(args[1]))); return myDet->getDetectorSettings(myDet->getSettings()); } else if (cmd=="threshold") { diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index c3e820d91..e4025db45 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -51,7 +51,7 @@ int setCounterBit(int val); int pulsePixel(int n, int x, int y); int pulsePixelNMove(int n, int x, int y); int pulseChip(int n); -int setRateCorrection(int n); +int setRateCorrection(int64_t custom_tau_in_nsec); #endif #if defined(MYTHEND) || defined(GOTTHARDD) diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index f47c43e09..305746e4f 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -32,6 +32,7 @@ const enum detectorType myDetectorType=PICASSO; const enum detectorType myDetectorType=GENERIC; #endif +extern enum detectorSettings thisSettings; //global variables for optimized readout char mess[MAX_STR_LENGTH]; @@ -1792,8 +1793,13 @@ int get_chip(int file_des) { } + + + + + int set_module(int file_des) { - int retval, n,i; + int retval, n; int ret=OK,ret1=OK; #ifdef SLS_DETECTOR_FUNCTION_LIST @@ -1862,15 +1868,28 @@ int set_module(int file_des) { ret=FAIL; -//#ifdef VERBOSE +#ifdef VERBOSE printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); #ifdef EIGERD + int i; for(i=0;i= 0) && (retval != tau_ns)){ + 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; }