00001
00006 #include <bpm/bpm_simulation.h>
00007 #include <bpm/bpm_wf.h>
00008
00009 int generate_bpmsignal( bpmconf_t *bpm, bpmmode_t *mode, beamconf_t *beam, doublewf_t *rf ) {
00010
00011 int j,k = 0;
00012 int shift = 0;
00013 static char msg[80];
00014
00015
00016 if ( ! bpm || !mode || ! beam || ! rf ) {
00017 bpm_error( "Invalid pointer arguments in generate_bpmsignal(...)",
00018 __FILE__, __LINE__ );
00019 return BPM_FAILURE;
00020 }
00021
00022 if ( ! mode->response ) {
00023 bpm_error( "Mode response is not defined in generate_bpmsignal(...)",
00024 __FILE__, __LINE__ );
00025 return BPM_FAILURE;
00026 }
00027
00028
00029
00030 if ( ! mode->buffer ) {
00031 mode->buffer = doublewf( mode->response->ns, mode->response->fs );
00032 }
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 for ( j=0;j<beam->nbunches;j++ ) {
00044
00045
00046
00047 doublewf_reset( mode->buffer );
00048
00049 if ( add_mode_response( bpm, mode, &( beam->bunch[j] ), mode->buffer ) ) {
00050 sprintf( msg, "Cannot add response for mode %s in generate_bpmsignal",
00051 mode->name );
00052 bpm_error( msg, __FILE__, __LINE__ );
00053 return BPM_FAILURE;
00054 }
00055
00056
00057
00058
00059
00060 if ( beam->bunch[j].arrival_time == 0. ) {
00061 shift = 0;
00062 } else {
00063 shift = floor( beam->bunch[j].arrival_time * rf->fs ) + 1;
00064 }
00065
00066 if ( shift < 0 || shift > rf->ns ) {
00067 bpm_error( "Sorry, but I've gone mad in generate_bpmsignal(...)",
00068 __FILE__, __LINE__ );
00069 return BPM_FAILURE;
00070 }
00071
00072
00073
00074 k = 0;
00075
00076
00077
00078 while ( shift+k <= rf->ns && k/rf->fs < mode->buffer->ns/mode->buffer->fs ) {
00079
00080 rf->wf[shift+k] += doublewf_getvalue( mode->buffer,
00081 (shift+k)/rf->fs - beam->bunch[j].arrival_time,
00082 WF_QUADRATIC );
00083
00084
00085
00086 k++;
00087
00088 }
00089
00090
00091
00092
00093
00094 }
00095
00096
00097
00098
00099
00100
00101
00102 return BPM_SUCCESS;
00103 }