From 07f1bd5c822aad8391ad8c49dbcc4db357583ef0 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 8 Feb 2016 10:40:54 +0100 Subject: [PATCH] mid way, had to change to fix bug --- .../commonFiles/sls_detector_funcs.h | 4 +- .../eigerDetectorServer/FebControl.c | 167 ++++++++++++++++-- .../eigerDetectorServer/FebInterface.h | 2 +- .../slsDetectorFunctionList.c | 9 + .../multiSlsDetector/multiSlsDetector.cpp | 40 +++-- .../slsDetectorAnalysis/postProcessing.cpp | 2 +- .../slsDetectorFunctionList.h | 1 + .../slsDetectorServer_funcs.c | 57 ++++++ .../slsDetectorServer_funcs.h | 1 + 9 files changed, 251 insertions(+), 32 deletions(-) diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index e61b5cf9c..8c4612339 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -98,7 +98,9 @@ enum { F_SET_COUNTER_BIT, /** < set/reset counter bit in detector for eiger */ F_PULSE_PIXEL, /** < pulse pixel n number of times in eiger at (x,y) */ 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_PULSE_CHIP, /** < pulse chip n number of times */ + + F_SET_RATE_CORRECT /** < set/reset rate correction tau */ /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index b4f505486..74b4dd047 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -55,7 +55,11 @@ unsigned int* Feb_Control_last_downloaded_trimbits; int Feb_Control_module_number; int Feb_Control_current_index; -int counter_bit = 1; +int Feb_Control_counter_bit = 1; + + +unsigned int Feb_Control_rate_correction_table[1024]; +double Feb_Control_rate_meas[16384]; void Module_Module(struct Module* mod,unsigned int number, unsigned int address_top){ @@ -1545,7 +1549,7 @@ int Feb_Control_PrepareForAcquisition(){//return 1; } int ret=0; - if(counter_bit) + if(Feb_Control_counter_bit) ret = Feb_Control_ResetChipCompletely(); else ret = Feb_Control_ResetChipPartially(); @@ -1648,11 +1652,11 @@ int Feb_Control_SaveAllTrimbitsTo(int value){ void Feb_Control_Set_Counter_Bit(int value){ - counter_bit = value; + Feb_Control_counter_bit = value; } int Feb_Control_Get_Counter_Bit(){ - return counter_bit; + return Feb_Control_counter_bit; } int Feb_Control_Pulse_Pixel(int npulses, int x, int y){ @@ -1777,8 +1781,8 @@ int Feb_Control_PulseChip(int npulses){ cprintf(RED,"some wait error\n"); } Feb_Control_SetExternalEnableMode(on,1); - counter_bit = (on?0:1); - printf("counter_bit:%d\n",counter_bit); + Feb_Control_counter_bit = (on?0:1); + printf("Feb_Control_counter_bit:%d\n",Feb_Control_counter_bit); if(on) printf("Pulse chip success\n\n"); @@ -1788,10 +1792,153 @@ 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]); + } + return 1; +} + + + +void Feb_Control_SetRateCorrectionVariable(int activate_rate_correction){ + if(activate_rate_correction){ + Feb_Control_subFrameMode |= DAQ_NEXPOSURERS_ACTIVATE_RATE_CORRECTION; + printf("Rate correction activated.\n"); + printf("Note, the rate correction will only be applied when the detector is run in auto summing 12 bit mode.\n"); + }else{ + Feb_Control_subFrameMode &= ~DAQ_NEXPOSURERS_ACTIVATE_RATE_CORRECTION; + printf("Rate correction deactivated.\n"); + } +} + + +int Feb_Control_SetRateCorrectionTable(unsigned int *table){ + if(!table){ + printf("Error: could not set rate correction table, point is zero.\n"); + Feb_Control_SetRateCorrectionVariable(0); + return 0; + } + + printf("Setting rate correction table. %d %d %d %d ....\n", + table[0],table[1],table[2],table[3]); + + if(Module_TopAddressIsValid(&modules[1])){ + if(!Feb_Interface_WriteMemoryInLoops(Module_GetTopLeftAddress(&modules[Feb_Control_current_index]),1,0,1024,Feb_Control_rate_correction_table)|| + !Feb_Interface_WriteMemoryInLoops(Module_GetTopRightAddress(&modules[Feb_Control_current_index]),1,0,1024,Feb_Control_rate_correction_table)|| + !Feb_Control_StartDAQOnlyNWaitForFinish(5000)){ + printf(" some errror!\n"); + return 0; + } + }else{ + if(!Feb_Interface_WriteMemoryInLoops(Module_GetBottomLeftAddress(&modules[Feb_Control_current_index]),1,0,1024,Feb_Control_rate_correction_table)|| + !Feb_Interface_WriteMemoryInLoops(Module_GetBottomRightAddress(&modules[Feb_Control_current_index]),1,0,1024,Feb_Control_rate_correction_table)|| + !Feb_Control_StartDAQOnlyNWaitForFinish(5000)){ + printf(" some errror!\n"); + return 0; + } + } + + + SetRateCorrectionVariable(1,print_info); + return 1; +} + + +int Feb_Control_SetRateCorrectionTau(double tau){ + //sub_expure_time should be known + + unsigned int np = 16384; //max slope 16 * 1024 + double b0[1024]; + double m[1024]; + + if(tau<0||sub_expure_time<0) + { + printf("Error tau %f and sub_expure_time %f must be greater than 0.\n", tau, sub_expure_time); + return 0; + } + + 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(); + } + + return 0; +} + int setModule(sls_detector_module myMod, int* gain, int* offset){ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index bfc2bd293..9b081ac12 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -2414,26 +2414,30 @@ int multiSlsDetector::flatFieldCorrect(double* datain, double *errin, double* da int multiSlsDetector::setRateCorrection(double t){ - // double tdead[]=defaultTDead; + // double tdead[]=defaultTDead; - if (t==0) { - thisMultiDetector->correctionMask&=~(1<correctionMask|=(1<numberOfDetectors; idet++) { - - if (detectors[idet]) { - detectors[idet]->setRateCorrection(t); - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<correctionMask&=~(1<correctionMask&(1<correctionMask|=(1<numberOfDetectors; idet++) { + + if (detectors[idet]) { + detectors[idet]->setRateCorrection(t); + if(detectors[idet]->getErrorMask()) + setErrorMask(getErrorMask()|(1<tDead << std::endl; + std::cout<< "Setting rate correction with dead time "<< thisMultiDetector->tDead << std::endl; #endif - } - return thisMultiDetector->correctionMask&(1<correctionMask&(1<tDead << std::endl; #endif - //which t should we return if they are all different? return 1; } else t=0; @@ -2460,7 +2463,6 @@ double multiSlsDetector::getRateCorrectionTau(){ #ifdef VERBOSE std::cout<< "Rate correction is enabled with dead time "<< thisMultiDetector->tDead << std::endl; #endif - //which t should we return if they are all different? for (int idet=0; idetnumberOfDetectors; idet++) { if (detectors[idet]) { diff --git a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp index b066f9435..8dbc0195e 100644 --- a/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp +++ b/slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp @@ -811,7 +811,7 @@ void postProcessing::initDataset(int r) { } double tdead; - if (*correctionMask&(1<= 0) && (retval != tau_ns)){ + cprintf(RED,"%s",mess); + ret=FAIL; + } + } + } +#endif + if ((ret==OK) && (differentClients)) + ret=FORCE_UPDATE; + + + //ret could be swapped during sendData + ret1 = ret; + 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; +} diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index c45da8b56..c2fa38438 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -87,6 +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); #endif