subroutine take_chrom (data_or_ref, u, err_flag) use cesrv_struct use cesrv_interface use phase_mod implicit none type (universe_struct), target :: u type (cesr_freq_struct) freq, freq0 real(rp) mom_comp, rev_freq, freq0_rf, rval, master_freq, fact real(rp) chrom_x, chrom_y, aa, bb, sig_a, sig_b, chi2, q real(rp), allocatable :: tune_x(:), tune_y(:), r_tune_x(:), r_tune_y(:), del_freq(:) real :: rate = 4 ! single precision integer data_or_ref integer, save :: rf_range = 800, n_read = 2, n_pt = 7 integer i, ival logical err_flag, slow_meas character(80) line ! Init mom_comp = u%global_design%synch_int(1) / u%ring%param%total_length rev_freq = c_light / u%ring%param%total_length if (u%ring%a%tune > pi) freq%x%reflection = .true. if (u%ring%b%tune > pi) freq%y%reflection = .true. ! Setup write (*, '(a, f6.1, a)', advance = 'no') & ' Modulation rate (Hz/sec at 12 MHz) [0=>No Meas, = ', rate, ' ] ' read (*, '(a)') line if (line /= '') then read (line, *) rval if (rval <= 0) return rate = rval endif call slew_master_rate(rate) ! Setup... slow_meas = .false. ival = in4get1 ('Number of frequency averages @', n_read) do write (*, '(a, i0, a)', advance = 'no') & ' Range of rffm to use? [ = ', rf_range, ' Hz, 0 => Halt measurement] ' read (*, '(a)') line if (line /= '') then read (line, *) ival if (ival <= 0) return if ((ival > 5000) .or. ival < 50) then print *, 'value rejected, [50-5000 Hz allowed].' cycle endif rf_range = ival endif exit enddo call slew_master_rate(rate) call get_master_synth(master_freq) ! Synthesizer frequency freq0_rf = 42 * master_freq ! Multiplier by 42 for 500MHz master allocate (tune_x(n_pt), tune_y(n_pt), r_tune_x(n_pt), r_tune_y(n_pt)) allocate (del_freq(n_pt)) call set_500mhz_ref(freq0_rf) call get_freq (freq0, n_read, slow_meas) ! Loop over all measurements. print *, ' d_freq tune_x tune_y' do i = 1, n_pt del_freq(i) = -rf_range + 2 * rf_range * (i - 1) / (n_pt - 1) call set_500mhz_ref(freq0_rf + del_freq(i)) call csr_sleep(500) if (i == 1) call csr_sleep(1000) call get_freq (freq, n_read, slow_meas) tune_x(i) = 1e3 * (freq%x%tune - freq0%x%tune) tune_y(i) = 1e3 * (freq%y%tune - freq0%y%tune) print '(3f14.3)', del_freq(i), tune_x(i), tune_y(i) enddo ! end energy scan call set_500mhz_ref(freq0_rf) call slew_master_synth(master_freq) ! Restore original 12MHz Osc. Frequency fact = mom_comp * freq0_rf / rev_freq print * print *, ' Xi Sig_Xi' call fit (del_freq, tune_x, aa, bb, sig_a, sig_b, chi2, q) chrom_x = -bb * fact print '(a, 2x, 2f10.3)', 'X:', chrom_x, abs(sig_b * fact) call fit (del_freq, tune_y, aa, bb, sig_a, sig_b, chi2, q) chrom_y = -bb * fact print '(a, 2x, 2f10.3)', 'Y:', chrom_y, abs(sig_b * fact) !--------------------------------------------- ! Data if (data_or_ref == data_file$) then u%chrom%measured = .true. u%chrom%x%d(1)%meas = chrom_x u%chrom%y%d(1)%meas = chrom_y u%chrom%x%d(1)%good_dat = .true. u%chrom%y%d(1)%good_dat = .true. !--------------------------------------------- ! Ref else u%chrom%ref_measured = .true. u%chrom%x%d(1)%ref = chrom_x u%chrom%y%d(1)%ref = chrom_y u%chrom%x%d(1)%good_ref = .true. u%chrom%y%d(1)%good_ref = .true. endif end subroutine