From f0c4a4a7e433c1fa1924c0e014236529ef5033b5 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 8 Feb 2016 15:20:19 +0100 Subject: [PATCH] almost done --- slsDetectorSoftware/commonFiles/error_defs.h | 5 + .../eigerDetectorServer/FebControl.c | 242 ++++++++++-------- .../eigerDetectorServer/FebControl.h | 10 +- .../slsDetectorFunctionList.c | 33 ++- .../multiSlsDetector/multiSlsDetector.cpp | 35 ++- .../slsDetector/slsDetector.cpp | 74 ++++-- 6 files changed, 250 insertions(+), 149 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index c3509a44a..c7f2b01b3 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -56,6 +56,7 @@ using namespace std; #define COULD_NOT_PULSE_PIXEL 0x0000000000040000ULL #define COULD_NOT_PULSE_PIXEL_NMOVE 0x0000000000080000ULL #define COULD_NOT_PULSE_CHIP 0x0000000000100000ULL +#define COULD_NOT_SET_RATE_CORRECTION 0x0000000000200000ULL // 0x00000000FFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -177,6 +178,10 @@ public: if(slsErrorMask&COULD_NOT_PULSE_CHIP) retval.append("Could not pulse chip\n"); + if(slsErrorMask&COULD_NOT_SET_RATE_CORRECTION) + retval.append("Could not set rate correction\n"); + + return retval; } diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index 74b4dd047..958b692c7 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -43,11 +43,15 @@ unsigned int Feb_Control_triggerMode; //internal timer, external start, unsigned int Feb_Control_externalEnableMode; //external enabling engaged and it's polarity unsigned int Feb_Control_subFrameMode; + unsigned int Feb_Control_nimages; 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; + unsigned int Feb_Control_trimbit_size; unsigned int* Feb_Control_last_downloaded_trimbits; @@ -1382,7 +1386,7 @@ int Feb_Control_SetSubFrameExposureTime(int the_subframe_exposure_time_in_10nsec printf("Sub Frame Exposure time set to: %d\n",Feb_Control_subframe_exposure_time_in_10nsec); return 1; } -int Feb_Control_GetSubFrameExposureTime(){return Feb_Control_subframe_exposure_time_in_10nsec;} +int Feb_Control_GetSubFrameExposureTime(){return Feb_Control_subframe_exposure_time_in_10nsec*10;} int Feb_Control_SetExposurePeriod(double the_exposure_period_in_sec){ Feb_Control_exposure_period_in_sec = the_exposure_period_in_sec; @@ -1792,35 +1796,110 @@ int Feb_Control_PulseChip(int npulses){ } -int Feb_Control_PrintCorrectedValues(){ - int i; - int delta, slope, base, lsb, corr; - for (i=0; i < 4096; i++) - { - lsb = i&3; - base = Feb_Control_rate_correction_table[i>>2] & 0x3fff; - slope = ((Feb_Control_rate_correction_table[i>>2] & 0x3c000) >> 14); - delta = slope*lsb; - corr = delta+base; - printf("Readout Input: %d,\tBase:%d,\tSlope:%d,\tLSB:%d,\tDelta:%d\tResult:%d\tReal:%f\n", - i, base, slope, lsb, delta, corr, Feb_Control_rate_meas[i]); + +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;} + +int Feb_Control_SetRateCorrectionTau(int 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; + unsigned int np = 16384; //max slope 16 * 1024 + double b0[1024]; + double m[1024]; + + + if(tau_in_sec<0||sub_expure_time_in_sec<0){ + printf("Error tau %f and sub_expure_time %f must be greater than 0.\n", tau_in_sec, sub_expure_time_in_sec); + return 0; } - return 1; + + printf("\tCalculating table for tau of %f ns.\n", tau_in_Nsec); + + for(int i=0;i memory address --> memory + data_in( 1..0) -> lsb + + mem_data_out(13.. 0) -> base + mem_data_out(17..14) -> slope + + delta = slope*lsb + corr = base+delta + */ + + int next_i=0; + + b0[0] = 0; + m[0] = 1; + + for(int b=1;b<1024;b++){ + if(m[b-1]<14.5){ + double s=0,sx=0,sy=0,sxx=0,sxy=0; + for(;;next_i++){ + if(next_i>=np){ + cprintf(BG_RED,"Error bin problem ???\n"); + return 0; + } + + 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 " + "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]); + + if(x < -0.5) continue; + if(x > 3.5) break; + s += 1; + sx += x; + 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 " + "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]); + } + double delta = s*sxx - sx*sx; + b0[b] = (sxx*sy - sx*sxy)/delta; + m[b] = (s*sxy - sx*sy) /delta; + + 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 " + "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]); + // cout<>2] & 0x3fff; + slope = ((Feb_Control_rate_correction_table[i>>2] & 0x3c000) >> 14); + delta = slope*lsb; + corr = delta+base; + printf("Readout Input: %d,\tBase:%d,\tSlope:%d,\tLSB:%d,\tDelta:%d\tResult:%d\tReal:%f\n", + i, base, slope, lsb, delta, corr, Feb_Control_rate_meas[i]); } - - printf("\tCalculating table for tau of %f ns.\n", tau*1e9); - - // Basic rate correction table - for(int i=0;i memory address --> memory - // data_in( 1..0) -> lsb - // - // mem_data_out(13.. 0) -> base - // mem_data_out(17..14) -> slope - // - // delta = slope*lsb - // corr = base+delta - - int next_i=0; - - b0[0] = 0; - m[0] = 1; - - for(int b=1;b<1024;b++) - { - if(m[b-1]<14.5) - { - double s=0,sx=0,sy=0,sxx=0,sxy=0; - for(;;next_i++) - { - if(next_i>=np) - { - printf("Error bin problem ???????\n"); - return 0; - } - - double x = 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 next_i: %d,\t b: %d,\t meas[next_i]: %f\n", x, y, s, sx, sy, sxx, sxy, next_i, b, meas[next_i]); - - if(x < -0.5) continue; - if(x > 3.5) break; - s += 1; - sx += x; - 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 next_i: %d,\t b: %d,\t meas[next_i]: %f\n", x, y, s, sx, sy, sxx, sxy, next_i, b, meas[next_i]); - } - double delta = s*sxx - sx*sx; - b0[b] = (sxx*sy - sx*sxy)/delta; - m[b] = (s*sxy - sx*sy) /delta; - - 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 next_i: %d,\t b: %d,\t meas[next_i]: %f\n", s, sx, sy, sxx, sxy, next_i, b, meas[next_i]); - // cout<=0){ -; - Feb_Control_PrintCorrectedValues(); + 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); + } } - 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; } @@ -788,7 +811,7 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ printf(" Setting sub exp time: %dns\n",(int)val/10); Feb_Control_SetSubFrameExposureTime(val/10); } - return (Feb_Control_GetSubFrameExposureTime()*10); + return (Feb_Control_GetSubFrameExposureTime()); case FRAME_PERIOD: diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 9b081ac12..1c25da38c 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -2416,27 +2416,44 @@ int multiSlsDetector::flatFieldCorrect(double* datain, double *errin, double* da int multiSlsDetector::setRateCorrection(double t){ // double tdead[]=defaultTDead; - if (t==0) { - thisMultiDetector->correctionMask&=~(1<correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<correctionMask|=(1<numberOfDetectors; idet++) { - if (detectors[idet]) { - detectors[idet]->setRateCorrection(t); + ret=detectors[idet]->setRateCorrection(t); if(detectors[idet]->getErrorMask()) setErrorMask(getErrorMask()|(1<tDead << std::endl; + if(getDetectorsType() == MYTHEN) + std::cout<< "Setting rate correction with dead time "<< thisMultiDetector->tDead << std::endl; #endif + //mismatch between detectors + if(ret1 == -1) + return ret1; + + if (getDetectorsType() != MYTHEN){ + if (ret1==0) { + thisMultiDetector->correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<correctionMask&(1<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; - } + 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; + std::cout<< "Setting rate correction with dead time "<< thisDetector->tDead << std::endl; #endif - } - return thisDetector->correctionMask&(1<correctionMask&(1<onlineFlag==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) + thisDetector->correctionMask&=~(1<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; + thisDetector->correctionMask&=~(1<tDead = 0; + } + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } + return thisDetector->correctionMask&(1<