99import sys
1010stream = sys .stdout
1111
12+
1213def string_array_to_bytes (names : Sequence [str ], * , encoding = "utf8" ):
1314 return [bytes (name , encoding ) for name in names ]
1415
@@ -27,7 +28,6 @@ def update(self, *,
2728 names = list (names )
2829 label = self .prefix + ":" + "names"
2930 logger .debug ("Update active view label %s, values %s" , label , names )
30- # stream.write("Update active view label %s, values %s\n" % (label, names))
3131 pydev .iointr (label , names )
3232
3333 # int number wrong by a factor of 2: why?
@@ -80,7 +80,7 @@ def update(self, data: BPMDataCollection):
8080 if pydev_supports_sequence :
8181 values = var .values .astype (int )
8282 else :
83- values = [int (v ) for v in values ]
83+ values = [int (v ) for v in var . values ]
8484 logger .debug ("Update label %s, values %s" , label , values )
8585 pydev .iointr (label , values )
8686
@@ -91,7 +91,6 @@ def update(self, data: BPMDataCollection):
9191
9292 # Todo: avoid to publish names at every turn
9393 #
94- return
9594 label = self .prefix + ":names"
9695 names_byte_encoded = string_array_to_bytes (data .names )
9796 logger .debug ("Update label=%s, names=%s" , label , names_byte_encoded )
@@ -135,24 +134,27 @@ class ViewBPMDataAsBData:
135134 def __init__ (self , prefix : str ):
136135 self .prefix = prefix
137136
138- def update (self , data : BPMDataCollectionStats ):
137+ def update (self , data : BPMDataCollectionStats , * , n_bpms , scale_x_axis ):
139138 """prepare data as expected
140139 """
141140 logger .debug ("view bdata: publishing data %s" , data )
142141 nm2mm = 1e-6
143142 n_entries = len (data .x .values )
144- return
145- n_bpms = 8
146143 if n_entries > n_bpms :
147144 raise ValueError ("number of bpms %s too many. max %s" , n_entries , n_bpms )
148145
149146 bdata = np .empty ([8 , n_bpms ], dtype = float )
150147 bdata .fill (0.0 )
148+ # is this the correct way to convert the data ?
149+ scale_bits = 2 ** 15 / 10
150+
151151 # flipping coordinate system to get the dispersion on the correct side
152152 # todo: check at which state this should be done
153153 # fmt:off
154- bdata [0 , :n_entries ] = - data .x .values * nm2mm
155- bdata [1 , :n_entries ] = data .y .values * nm2mm
154+ def convert (data , scale_axis = 1.0 ):
155+ return data * (nm2mm * scale_bits * scale_axis )
156+ bdata [0 , :n_entries ] = - convert (data .x .values , scale_axis = scale_x_axis )
157+ bdata [1 , :n_entries ] = convert (data .y .values )
156158 # fmt:on
157159 # intensity z 1.3
158160 # bdata[2] = 3
@@ -166,14 +168,19 @@ def update(self, data: BPMDataCollectionStats):
166168 # factor 100 seems to be enough.
167169 # I think I should add some check that the noise is large enough
168170 scale_rms = 20
169- bdata [6 , :n_entries ] = np .where (data .x .n_readings > 0 , data .x .std * nm2mm * scale_rms , 0 )
170- bdata [7 , :n_entries ] = np .where (data .y .n_readings > 0 , data .y .std * nm2mm * scale_rms , 0 )
171+ def convert_noise (data , scale_axis = 1 ):
172+ noise = convert (data .std , scale_axis = scale_axis * scale_rms )
173+ noise [data .n_readings > 0 ] = np .clip (noise , 1 , None )[data .n_readings > 0 ]
174+ # so sofb Orbit will consider it as not existing
175+ noise [data .n_readings <= 0 ] = 0
176+ return noise
177+ bdata [6 , :n_entries ] = convert_noise (data .x , scale_axis = scale_x_axis )
178+ bdata [7 , :n_entries ] = convert_noise (data .y )
171179
172180 label = f"{ self .prefix } "
173- bdata = [float (v ) for v in bdata .ravel ()]
181+ bdata = [float (v ) for v in bdata .ravel (). astype ( np . int16 ) ]
174182 pydev .iointr (label , bdata )
175183 logger .debug ("view bdata: label %s, %d n_entries" , label , n_entries )
176- # logger.warning("view bdata: label %s bdata %s", label, bdata)
177184
178185
179186class ViewStringBuffer :
0 commit comments