Skip to content

Commit 08b7898

Browse files
Pierre SchnizerPierre Schnizer
authored andcommitted
[TASK] (re)ported conversions for MLS: made factors kwargs
waveform records must match!
1 parent 31024cc commit 08b7898

File tree

2 files changed

+21
-14
lines changed

2 files changed

+21
-14
lines changed

bpm_data_combiner_app/Db/bpm_bdata.db

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ record(waveform, "$(PREFIX):bdata")
55
field(DTYP, "pydev")
66
field(EGU, "??")
77
field(EGU, "nm")
8-
field(FTVL, "DOUBLE")
8+
field(FTVL, "SHORT")
99
field(SCAN, "I/O Intr")
1010
field(INP, "@pydev.iointr('$(PREFIX):bdata')")
11-
field(NELM, 128)
11+
field(NELM, 256)
1212
field(TPRO, 0)
1313
}

src/bpm_data_combiner/app/view.py

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import sys
1010
stream = sys.stdout
1111

12+
1213
def 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

179186
class ViewStringBuffer:

0 commit comments

Comments
 (0)