66import csv
77import os
88
9+ import numpy as np
910import pytac
1011from cothread .catools import FORMAT_CTRL , caget
1112
@@ -23,54 +24,104 @@ def generate_feedback_pvs(all_elements):
2324 + all_elements .q1b
2425 )
2526 # Data to be written is stored as a list of tuples each with structure:
26- # element index (int), field (str), pv (str), value (int).
27+ # element index (int), field (str), pv (str), value (int), record_type (str) .
2728 # We have special cases for four lattice fields that feedback systems read from.
2829 data = [
29- ("index" , "field" , "pv" , "value" , "read-only " ),
30- (0 , "beam_current" , "SR-DI-DCCT-01:SIGNAL" , 300 , True ),
31- (0 , "feedback_status" , "CS-CS-MSTAT-01:FBSTAT" , 2 , True ),
32- (0 , "fofb_status" , "SR01A-CS-FOFB-01:RUN" , 0 , False ),
33- (0 , "feedback_heart" , "CS-CS-MSTAT-01:FBHEART" , 10 , False ),
30+ ("index" , "field" , "pv" , "value" , "record_type " ),
31+ (0 , "beam_current" , "SR-DI-DCCT-01:SIGNAL" , 300 , "ai" ),
32+ (0 , "feedback_status" , "CS-CS-MSTAT-01:FBSTAT" , 2 , "ai" ),
33+ (0 , "fofb_status" , "SR01A-CS-FOFB-01:RUN" , 0 , "ao" ),
34+ (0 , "feedback_heart" , "CS-CS-MSTAT-01:FBHEART" , 10 , "ao" ),
3435 ]
3536 # Iterate over our elements to get the PV names.
3637 for elem in all_elements .hstr :
3738 pv_stem = elem .get_device ("x_kick" ).name
38- data .append ((elem .index , "error_sum" , pv_stem + ":ERCSUM" , 0 , True ))
39- data .append ((elem .index , "state" , pv_stem + ":STATE" , 2 , True ))
39+ data .append ((elem .index , "error_sum" , pv_stem + ":ERCSUM" , 0 , "ai" ))
40+ data .append ((elem .index , "state" , pv_stem + ":STATE" , 2 , "ai" ))
4041 for elem in all_elements .vstr :
4142 pv_stem = elem .get_device ("y_kick" ).name
42- data .append ((elem .index , "error_sum" , pv_stem + ":ERCSUM" , 0 , True ))
43- data .append ((elem .index , "state" , pv_stem + ":STATE" , 2 , True ))
43+ data .append ((elem .index , "error_sum" , pv_stem + ":ERCSUM" , 0 , "ai" ))
44+ data .append ((elem .index , "state" , pv_stem + ":STATE" , 2 , "ai" ))
4445 for elem in all_elements .bpm :
4546 data .append (
46- (elem .index , "enabled" , elem .get_pv_name ("enabled" , pytac .RB ), 1 , True )
47+ (elem .index , "enabled" , elem .get_pv_name ("enabled" , pytac .RB ), 1 , "ai" )
4748 )
4849 # Add elements for Tune Feedback
4950 for elem in tune_quad_elements :
5051 data .append (
51- (elem .index , "offset" , elem .get_device ("b1" ).name + ":OFFSET1" , 0 , True )
52+ (elem .index , "offset" , elem .get_device ("b1" ).name + ":OFFSET1" , 0 , "ai" )
5253 )
5354 return data
5455
5556
56- def generate_bba_pvs (all_elements ):
57+ def generate_bba_pvs (all_elements , symmetry ):
5758 """Data to be written is stored as a list of tuples each with structure:
58- element index (int), field (str), pv (str), value (int).
59+ element index (int), field (str), pv (str), value (int), record_type (str) .
5960 """
60- data = [("index" , "field" , "pv" , "value" , "read-only " )]
61+ data = [("index" , "field" , "pv" , "value" , "record_type " )]
6162 # Iterate over the BPMs to construct the PV names.
6263 for elem in all_elements .bpm :
6364 pv_stem = elem .get_device ("enabled" ).name
6465 data .append (
65- (elem .index , "golden_offset_x" , pv_stem + ":CF:GOLDEN_X_S" , 0 , False )
66+ (elem .index , "golden_offset_x" , pv_stem + ":CF:GOLDEN_X_S" , 0 , "ao" )
6667 )
6768 data .append (
68- (elem .index , "golden_offset_y" , pv_stem + ":CF:GOLDEN_Y_S" , 0 , False )
69+ (elem .index , "golden_offset_y" , pv_stem + ":CF:GOLDEN_Y_S" , 0 , "ao" )
70+ )
71+ data .append ((elem .index , "bcd_offset_x" , pv_stem + ":CF:BCD_X_S" , 0 , "ao" ))
72+ data .append ((elem .index , "bcd_offset_y" , pv_stem + ":CF:BCD_Y_S" , 0 , "ao" ))
73+ data .append ((elem .index , "bba_offset_x" , pv_stem + ":CF:BBA_X_S" , 0 , "ao" ))
74+ data .append ((elem .index , "bba_offset_y" , pv_stem + ":CF:BBA_Y_S" , 0 , "ao" ))
75+ for cell in range (1 , symmetry + 1 ):
76+ cell = str (cell ).zfill (2 )
77+ pv_stem = f"SR{ cell } A-CS-FOFB-01"
78+ # Waveform records
79+ data .append (
80+ (
81+ cell ,
82+ f"cell_{ cell } _excite_start_times" ,
83+ f"{ pv_stem } :EXCITE:START_TIMES" ,
84+ np .zeros (18 ),
85+ "wfm" ,
86+ )
87+ )
88+ data .append (
89+ (
90+ cell ,
91+ f"cell_{ cell } _excite_amps" ,
92+ f"{ pv_stem } :EXCITE:AMPS" ,
93+ np .zeros (18 ),
94+ "wfm" ,
95+ )
96+ )
97+ data .append (
98+ (
99+ cell ,
100+ f"cell_{ cell } _excite_deltas" ,
101+ f"{ pv_stem } :EXCITE:DELTAS" ,
102+ np .zeros (18 ),
103+ "wfm" ,
104+ )
105+ )
106+ data .append (
107+ (
108+ cell ,
109+ f"cell_{ cell } _excite_ticks" ,
110+ f"{ pv_stem } :EXCITE:TICKS" ,
111+ np .zeros (18 ),
112+ "wfm" ,
113+ )
114+ )
115+ # ao record
116+ data .append (
117+ (
118+ cell ,
119+ f"cell_{ cell } _excite_prime" ,
120+ f"{ pv_stem } :EXCITE:PRIME" ,
121+ 0 ,
122+ "ao" ,
123+ )
69124 )
70- data .append ((elem .index , "bcd_offset_x" , pv_stem + ":CF:BCD_X_S" , 0 , False ))
71- data .append ((elem .index , "bcd_offset_y" , pv_stem + ":CF:BCD_Y_S" , 0 , False ))
72- data .append ((elem .index , "bba_offset_x" , pv_stem + ":CF:BBA_X_S" , 0 , False ))
73- data .append ((elem .index , "bba_offset_y" , pv_stem + ":CF:BBA_Y_S" , 0 , False ))
74125 return data
75126
76127
@@ -136,7 +187,9 @@ def generate_mirrored_pvs(lattice):
136187 value:
137188 The inital value of the output record.
138189 """
139- data = [("output type" , "mirror type" , "in" , "out" , "value" )]
190+ data : list [tuple [str , str , str , str , int ]] = [
191+ ("output type" , "mirror type" , "in" , "out" , "value" )
192+ ]
140193 # Tune PV aliases.
141194 tune = [
142195 lattice .get_value ("tune_x" , pytac .RB , data_source = pytac .SIM ),
@@ -308,6 +361,11 @@ def parse_arguments():
308361 help = "Filename for output tune feedback offset PVs CSV file" ,
309362 default = "tunefb.csv" ,
310363 )
364+ parser .add_argument (
365+ "--bba" ,
366+ help = "Filename for output beam-based-alignment PVs CSV file" ,
367+ default = "bba.csv" ,
368+ )
311369 return parser .parse_args ()
312370
313371
@@ -316,8 +374,9 @@ def parse_arguments():
316374 lattice = atip .utils .loader (args .ring_mode )
317375 all_elements = atip .utils .preload (lattice )
318376 data = generate_feedback_pvs (all_elements )
319- data .extend (generate_bba_pvs (all_elements )[1 :])
320377 write_data_to_file (data , args .feedback , args .ring_mode )
378+ data = generate_bba_pvs (all_elements , lattice .symmetry )
379+ write_data_to_file (data , args .bba , args .ring_mode )
321380 data = generate_pv_limits (lattice )
322381 write_data_to_file (data , args .limits , args .ring_mode )
323382 data = generate_mirrored_pvs (lattice )
0 commit comments