00001
00005 #include <bpm/bpm_messages.h>
00006 #include <bpm/bpm_orbit.h>
00007
00008 int generate_corr_scan( bpmconf_t* bpm, beamconf_t* beam, int num_evts,
00009 int num_steps, double angle_range, double angle,
00010 double z_pos ) {
00011
00012 if ( ! bpm ) {
00013 bpm_error( "Invalid pointer arguments in generate_corr_scan(...)",
00014 __FILE__, __LINE__ );
00015 return BPM_FAILURE;
00016 }
00017
00018 if ( ! beam ) {
00019 bpm_error( "Invalid pointer arguments in generate_corr_scan(...)",
00020 __FILE__, __LINE__ );
00021 return BPM_FAILURE;
00022 }
00023
00024 if ( num_evts == 0 ) {
00025 bpm_warning( "Zero events given as an argument to generate_corr_scan(...)",
00026 __FILE__, __LINE__ );
00027 return BPM_FAILURE;
00028 }
00029
00030 if ( num_steps == 0 ) {
00031 bpm_error( "Zero steps given as an argument to generate_corr_scan(...)",
00032 __FILE__, __LINE__ );
00033 return BPM_FAILURE;
00034 }
00035
00036 double step = 0;
00037 int evt = 0;
00038 double z_diff = bpm->geom_pos[2] - z_pos;
00039 angle *= 1.e-6;
00040 z_diff *= 1.e6;
00041
00042
00043 for (evt = 0; evt < num_evts * num_steps; evt++ ) {
00044
00045 double curr_angle = -angle_range / 2. + step * angle_range / (double) (num_steps - 1);
00046 curr_angle *= 1.e-6;
00047
00048 beam[evt].beampos[0] += cos( angle ) * z_diff * tan( curr_angle );
00049 beam[evt].beampos[1] += sin( angle ) * z_diff * tan( curr_angle );
00050 beam[evt].beamslope[0] += curr_angle * 1.e6;
00051 beam[evt].beamslope[1] += angle * 1.e6;
00052
00053 if ( (( evt % num_evts ) == 0) && ( evt > 0 )) step++;
00054
00055 }
00056
00057 return BPM_SUCCESS;
00058 }