00001 00005 #include <bpm/bpm_messages.h> 00006 #include <bpm/bpm_calibration.h> 00007 #include <bpm/bpm_nr.h> 00008 00009 int calibrate( bpmconf_t *bpm, bunchconf_t *bunch, bpmproc_t *proc, int npulses, 00010 bpmcalib_t *cal ) { 00011 00012 if ( ! cal || ! proc || ! bunch ) { 00013 bpm_error( "Invalid pointer arguments in calibrate(...)", 00014 __FILE__, __LINE__ ); 00015 return BPM_FAILURE; 00016 } 00017 00018 // BM: 07-04-2008 00019 // this needs to be re-written.... 00020 00021 /* 00022 00023 // First, fit a staright line to the data to get the IQ phase 00024 double *ival = calloc( npulses, sizeof(double) ); 00025 double *qval = calloc( npulses, sizeof(double) ); 00026 int i; 00027 00028 for (i = 0; i < npulses; i++) { 00029 ival[i] = proc[i].ddc_I; 00030 qval[i] = proc[i].ddc_Q; 00031 } 00032 00033 double intercept, gradient, siga, sigb, chi2, q; 00034 if ( nr_fit( ival, qval, npulses, NULL, 0, &intercept, &gradient, 00035 &siga, &sigb, &chi2, &q ) == BPM_FAILURE ) { 00036 bpm_error( "Straight line fit failed in calibrate(...)", __FILE__, __LINE__ ); 00037 return BPM_FAILURE; 00038 } 00039 00040 cal->IQphase = gradient; 00041 00042 // Now calculate the scale 00043 double pos; 00044 double *scale = calloc( npulses, sizeof(double) ); 00045 00046 for (i = 0; i < npulses; i++) { 00047 00048 get_pos( proc[i].ddc_Q, proc[i].ddc_I, cal->IQphase, 1., &pos ); 00049 00050 if ( bpm->cav_polarisation == horiz ) { 00051 scale[i] = bunch[i].bpmposition[0] / pos; 00052 } else { 00053 scale[i] = bunch[i].bpmposition[1] / pos; 00054 } 00055 00056 } 00057 00058 cal->posscale = nr_median(npulses, scale); 00059 */ 00060 return BPM_SUCCESS; 00061 } 00062 00063