Skip to content

Commit f357638

Browse files
authored
Merge pull request #51 from simonsobs/err_prop
Err prop
2 parents b3f6585 + 955825b commit f357638

File tree

91 files changed

+4553
-4728
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+4553
-4728
lines changed

lat_alignment/alignment.py

Lines changed: 64 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import megham.transform as mt
1515
import numpy as np
1616
import yaml
17-
from numpy.lib.arraysetops import isin
1817
from numpy.typing import NDArray
1918
from pqdm.processes import pqdm
2019

@@ -191,40 +190,46 @@ def main():
191190
bootstrap_from = cfg.get("bootstrap_from", "all")
192191
logger.info("Bootstrapping from %s", bootstrap_from)
193192
if isinstance(dataset, ds.DatasetPhotogrammetry):
194-
dataset, _ = da.align_photo(
193+
dataset, (aff, sft) = da.align_photo(
195194
dataset,
196195
reference,
197196
True,
198197
bootstrap_from,
199198
**cfg.get("align_photo", {}),
200199
)
201200
else:
202-
dataset, _ = da.align_tracker(
201+
dataset, (aff, sft) = da.align_tracker(
203202
dataset,
204203
tracker_yamls[i],
205204
bootstrap_from,
206205
**cfg.get("align_tracker", {}),
207206
)
207+
cfrom = "opt_global"
208208
if bootstrap_from == "primary":
209-
points = tf.coord_transform(
210-
dataset.points, "opt_primary", f"opt_{mirror}"
211-
)
209+
cfrom = "opt_primary"
212210
elif bootstrap_from == "secondary":
213-
points = tf.coord_transform(
214-
dataset.points, "opt_secondary", f"opt_{mirror}"
215-
)
216-
else:
217-
points = tf.coord_transform(
218-
dataset.points, "opt_global", f"opt_{mirror}"
219-
)
220-
dataset.data_dict = {l: p for l, p in zip(dataset.labels, points)}
221-
ddict = {f"{l}_{i}": p for l, p in zip(dataset.labels, dataset.points)}
211+
cfrom = "opt_secondary"
212+
points = tf.coord_transform(dataset.points, cfrom, f"opt_{mirror}")
213+
aff, sft = tf.affine_basis_transform(aff, sft, cfrom, f"opt_{mirror}")
214+
errs = tf.err_transform(dataset.errs, aff)
215+
dataset.data_dict = {
216+
l: np.array([p, e]) for l, p, e in zip(dataset.labels, points, errs)
217+
}
218+
ddict = {
219+
f"{l}_{i}": np.array([p, e])
220+
for l, p, e in zip(dataset.labels, dataset.points, dataset.errs)
221+
}
222222
data_dict = data_dict | ddict
223223
dataset = datasets[0].__class__(data_dict)
224224
append = ""
225225
if "sample_every" in cfg:
226226
i, j = cfg["sample_every"]
227-
ddict = {l: p for l, p in zip(dataset.labels[i::j], dataset.points[i::j])}
227+
ddict = {
228+
l: np.array([p, e])
229+
for l, p, e in zip(
230+
dataset.labels[i::j], dataset.points[i::j], dataset.errs[i::j]
231+
)
232+
}
228233
dataset.data_dict = ddict
229234
append = f"_{i}_{j}"
230235

@@ -251,9 +256,14 @@ def main():
251256
if cfg.get("only_adj", True):
252257
for panel in panels:
253258
panel.measurements = panel.measurements[panel.adj_msk]
259+
panel.meas_err = panel.meas_err[panel.adj_msk]
254260
measurements = np.vstack([panel.measurements for panel in panels])
255-
data = {"TARGET" + str(i): meas for i, meas in enumerate(measurements)}
256-
dataset = io.DatasetPhotogrammetry(data)
261+
errs = np.vstack([panel.meas_err for panel in panels])
262+
data = {
263+
"TARGET" + str(i): np.array([meas, err])
264+
for i, (meas, err) in enumerate(zip(measurements, errs))
265+
}
266+
dataset = datasets[0].__class__(data)
257267
dataset, _ = mir.remove_cm(
258268
dataset, mirror, cfg.get("compensate", 0), **cfg.get("common_mode", {})
259269
)
@@ -267,16 +277,31 @@ def main():
267277
)
268278
logger.info("Found measurements for %d panels", len(panels))
269279
fig = mir.plot_panels(
270-
panels, title_str, vmax=cfg.get("vmax", None), use_iqr=cfg.get("iqr", False)
280+
panels,
281+
False,
282+
title_str,
283+
vmax=cfg.get("vmax", None),
284+
use_iqr=cfg.get("iqr", False),
271285
)
272286
fig.savefig(os.path.join(cfgdir, f"{title_str.replace(' ', '_')}{append}.png"))
287+
fig = mir.plot_panels(
288+
panels,
289+
True,
290+
title_str,
291+
vmax=cfg.get("vmax", None),
292+
use_iqr=cfg.get("iqr", False),
293+
)
294+
fig.savefig(
295+
os.path.join(cfgdir, f"{title_str.replace(' ', '_')}_err{append}.png")
296+
)
273297
res_all = np.vstack([panel.residuals for panel in panels])
274298
model_all = np.vstack([panel.model for panel in panels])
275-
mir_out = np.hstack([model_all, res_all])
299+
res_err_all = np.vstack([panel.residuals_err for panel in panels])
300+
mir_out = np.hstack([model_all, res_all, res_err_all])
276301
np.savetxt(
277302
os.path.join(cfgdir, f"{title_str.replace(' ', '_')}_surface{append}.txt"),
278303
mir_out,
279-
header="x y z x_res y_res z_res",
304+
header="x y z x_res y_res z_res x_res_err y_res_err z_res_err",
280305
)
281306

282307
# calc and save adjustments
@@ -341,9 +366,14 @@ def main():
341366
)
342367
for panel in panels:
343368
panel.measurements = panel.measurements[panel.adj_msk]
369+
panel.meas_err = panel.meas_err[panel.adj_msk]
344370
measurements = np.vstack([panel.measurements for panel in panels])
345-
data = {"TARGET" + str(i): meas for i, meas in enumerate(measurements)}
346-
meas = io.Dataset(data)
371+
errs = np.vstack([panel.meas_err for panel in panels])
372+
data = {
373+
"TARGET" + str(i): np.array([meas, err])
374+
for i, (meas, err) in enumerate(zip(measurements, errs))
375+
}
376+
meas = meas.__class__(data)
347377
meas, common_mode_2 = mir.remove_cm(
348378
meas,
349379
"primary",
@@ -394,9 +424,14 @@ def main():
394424
)
395425
for panel in panels:
396426
panel.measurements = panel.measurements[panel.adj_msk]
427+
panel.meas_err = panel.meas_err[panel.adj_msk]
397428
measurements = np.vstack([panel.measurements for panel in panels])
398-
data = {"TARGET" + str(i): meas for i, meas in enumerate(measurements)}
399-
meas = io.Dataset(data)
429+
errs = np.vstack([panel.meas_err for panel in panels])
430+
data = {
431+
"TARGET" + str(i): np.array([meas, err])
432+
for i, (meas, err) in enumerate(zip(measurements, errs))
433+
}
434+
meas = meas.__class__(data)
400435
meas, common_mode_2 = mir.remove_cm(
401436
meas,
402437
"secondary",
@@ -422,15 +457,16 @@ def main():
422457
meas, alignment = da.align_photo(
423458
dataset, reference, True, "bearing", **cfg.get("align_photo", {})
424459
)
460+
meas, cyl_fit = br.cylinder_fit(meas)
461+
full_alignment = mt.compose_transform(*alignment, *cyl_fit)
425462
else:
426-
meas, alignment = da.align_tracker(
463+
full_alignment, alignment = da.align_tracker(
427464
dataset,
428465
cfg["tracker_yaml"],
429466
"bearing",
430467
**cfg.get("align_tracker", {}),
431468
)
432-
meas, cyl_fit = br.cylinder_fit(meas)
433-
full_alignment = mt.compose_transform(*alignment, *cyl_fit)
469+
logger.warning("Can't do cylinder fit on bearing with tracker data!")
434470
log_alignment(full_alignment, logger)
435471
except Exception as e:
436472
print(

lat_alignment/data_alignment.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
import matplotlib.pyplot as plt
1010
import numpy as np
11-
from megham.transform import apply_transform, decompose_rotation, get_affine, get_rigid
11+
from megham.transform import apply_transform, decompose_rotation, get_rigid
1212
from megham.utils import make_edm
1313
from numpy.typing import NDArray
1414

1515
from . import io
1616
from .dataset import Dataset, DatasetPhotogrammetry, DatasetReference
17-
from .transforms import coord_transform
17+
from .transforms import coord_transform, err_transform
1818

1919
logger = logging.getLogger("lat_alignment")
2020

@@ -152,12 +152,6 @@ def align_photo(
152152
logger.info("\t\tAssociated %s with %s", label, pname)
153153
if blind_search > 0:
154154
raise NotImplementedError("Blind search not implemented yet!")
155-
# Set 12
156-
# ref = [rpoint for rpoint, _ in reference[element]]
157-
# ref = np.array(ref)[[True, True, False, True]]
158-
# invars = ["TARGET35", "TARGET4", "TARGET484"] #, "TARGET421"]
159-
# pts = [dataset[label] for label in invars]
160-
# print(invars)
161155
if len(ref) < 4:
162156
logger.warning(f"Only {len(ref)} reference points found!")
163157
logger.warning(f"Adding reference codes")
@@ -194,8 +188,10 @@ def align_photo(
194188
pts_scaled = pts * scale_fac
195189
logger.debug("\t\tScale factor of %f applied", scale_fac)
196190

197-
new_rot, new_sft = get_rigid(pts_scaled[msk], ref[msk], method="mean")
198-
pts_t = apply_transform(pts_scaled[msk], new_rot, new_sft)
191+
new_rot, new_sft = get_rigid(
192+
pts_scaled[msk].astype(np.float64), ref[msk], method="mean"
193+
)
194+
pts_t = apply_transform(pts_scaled[msk].astype(np.float64), new_rot, new_sft)
199195
if plot:
200196
fig = plt.figure()
201197
ax = fig.add_subplot(projection="3d")
@@ -227,22 +223,27 @@ def align_photo(
227223
if rot is None or sft is None:
228224
raise ValueError("Transformation is None")
229225

230-
coords_transformed = apply_transform(dataset.points * scale_fac, rot, sft)
226+
logger.debug("\t\tShift is %s mm", str(sft))
227+
logger.debug("\t\tRotation is %s deg", str(np.rad2deg(decompose_rotation(rot))))
228+
scale_fac = np.eye(3) * scale_fac
229+
rot @= scale_fac
230+
231+
coords_transformed = apply_transform(dataset.points, rot, sft)
232+
errs_transformed = err_transform(dataset.errs, rot)
231233
labels = dataset.labels
232234

233235
if kill_refs:
234236
msk = ~np.isin(dataset.labels, invars)
235237
labels = labels[msk]
236238
coords_transformed = coords_transformed[msk]
239+
errs_transformed = errs_transformed[msk]
237240

238-
data = {label: coord for label, coord in zip(labels, coords_transformed)}
241+
data = {
242+
label: np.array([coord, err])
243+
for label, coord, err in zip(labels, coords_transformed, errs_transformed)
244+
}
239245
transformed = DatasetPhotogrammetry(data)
240246

241-
logger.debug("\t\tShift is %s mm", str(sft))
242-
logger.debug("\t\tRotation is %s deg", str(np.rad2deg(decompose_rotation(rot))))
243-
scale_fac = np.eye(3) * scale_fac
244-
rot @= scale_fac
245-
246247
if plot:
247248
fig = plt.figure()
248249
ax = fig.add_subplot(projection="3d")
@@ -356,17 +357,21 @@ def align_tracker(
356357
rms,
357358
)
358359

359-
coords_transformed = apply_transform(dataset.points * scale_fac, rot, sft)
360-
labels = dataset.labels
361-
362-
data = {label: coord for label, coord in zip(labels, coords_transformed)}
363-
transformed = Dataset(data)
364-
365360
logger.debug("\t\tShift is %s mm", str(sft))
366361
logger.debug("\t\tRotation is %s deg", str(np.rad2deg(decompose_rotation(rot))))
367362
scale_fac = np.eye(3) * scale_fac
368363
rot @= scale_fac
369364

365+
coords_transformed = apply_transform(dataset.points, rot, sft)
366+
errs_transformed = err_transform(dataset.errs, rot)
367+
labels = dataset.labels
368+
369+
data = {
370+
label: np.array([coord, err])
371+
for label, coord, err in zip(labels, coords_transformed, errs_transformed)
372+
}
373+
transformed = Dataset(data)
374+
370375
if plot:
371376
fig = plt.figure()
372377
ax = fig.add_subplot(projection="3d")

0 commit comments

Comments
 (0)