1+ """
2+ Launcher script to HTCondor for GPU - generate python scripts for tune scan
3+ """
4+ import fma_ions
5+ import os
6+ import pathlib
7+ import numpy as np
8+ import datetime
9+
10+ # Find path of script being run
11+ dir_path = pathlib .Path (__file__ ).parent .absolute ()
12+
13+ # Define run files and which parameters to change
14+ master_name = 'SPS_Ne_ions_sc_ibs_with_no_comp_50_150_300_600_Hz_ripple_130k_and_476k_turns_2025_07_07'
15+ num_turns = [130_000 , 476_000 ]
16+ Qx = 26.31
17+ Qy = 26.25
18+
19+ # Use measured 2025-06-17 O8+ SPS values
20+ run_files = ['sps_Ne_scan_run_{}.py' .format (i + 1 ) for i in range (len (num_turns ))]
21+
22+ # Define script and folder names
23+ script_names = run_files .copy ()
24+ folder_names = ['sps_Ne_Nb_scan_{}' .format (i ) for i in range (len (num_turns ))]
25+ string_array = ['SPS N case = {}' .format (i ) for i in range (len (num_turns ))]
26+
27+ # Generate the scripts to be submitted
28+ for i , run_file in enumerate (run_files ):
29+
30+ # Write run file for given tune
31+ print ('Generating launch script {}\n ' .format (run_file ))
32+ run_file = open (run_file , 'w' )
33+ run_file .truncate (0 ) # remove existing content, if any
34+ run_file .write (
35+ '''import fma_ions
36+ import numpy as np
37+ output_dir = './'
38+
39+ n_turns = {}
40+ num_part = 20_000
41+
42+ # Transfer function factors
43+ a_50 = 1.0 #1.7170
44+ a_150 = 0.5098
45+ a_300 = 0.2360
46+ a_600 = 0.1095
47+
48+ # Desired ripple frequencies and amplitudes - from DCCT measurements 2024-10-30
49+ ripple_freqs = np.array([50.0, 150.0, 300.0, 600.0])
50+ kqf_amplitudes = np.array([1.0141062492337905e-06*a_50, 1.9665396648867768e-07*a_150, 3.1027971430227987e-07*a_300, 4.5102937494506313e-07*a_600])
51+ kqd_amplitudes = np.array([1.0344583265981035e-06*a_50, 4.5225494700433166e-07*a_150, 5.492718035100028e-07*a_300, 4.243698659233664e-07*a_600])
52+ kqf_phases = np.array([0.7646995873548973, 2.3435670020522825, -1.1888958255027886, 2.849205512655574])
53+ kqd_phases = np.array([0.6225130389353318, -1.044380492147742, -1.125401419249802, -0.30971750008702853])
54+
55+ # Tracking on GPU context
56+ sps = fma_ions.SPS_Flat_Bottom_Tracker(qx0={:.3f}, qy0={:.3f}, num_turns=n_turns, num_part=num_part)
57+ tbt = sps.track_SPS(ion_type='Ne', which_context='gpu', distribution_type='qgaussian', install_SC_on_line=True, add_beta_beat=True,
58+ add_non_linear_magnet_errors=True, apply_kinetic_IBS_kicks=True, ibs_step = 2000, add_tune_ripple=True, ripple_freqs = ripple_freqs,
59+ kqf_amplitudes = kqf_amplitudes, kqd_amplitudes = kqd_amplitudes, kqf_phases=kqf_phases, kqd_phases=kqd_phases,
60+ SC_adaptive_interval_during_tracking=100)
61+ tbt.to_json(output_dir)
62+ ''' .format (num_turns [i ], Qx , Qy )
63+ )
64+ run_file .close ()
65+
66+
67+ # Instantiate the submitter class and launch the jobs
68+ sub = fma_ions .Submitter ()
69+ master_job_name = '{:%Y_%m_%d__%H_%M_%S}_{}' .format (datetime .datetime .now (), master_name )
70+
71+ # Launch the Python scripts in this folder
72+ for i , script in enumerate (script_names ):
73+ file_name = os .path .join (dir_path , script )
74+ print (f"Submitting { file_name } " )
75+ sub .submit_GPU (file_name , master_job_name = master_job_name , job_name = folder_names [i ])
76+ sub .copy_master_plot_script (folder_names , string_array )
77+ sub .copy_plot_script_emittances_for_scan (master_name , folder_names , scan_array_for_x_axis = Nb_array ,
78+ label_for_x_axis = 'Injected Pb ions per bunch' ,
79+ extra_text_string = '$Q_{x, y}$ = 26.31, 26.25 - q-Gaussian beam\\ nAdaptive SC, ~10% $\\ beta$-beat + non-linear magnet errors' )
0 commit comments