1414import megham .transform as mt
1515import numpy as np
1616import yaml
17- from numpy .lib .arraysetops import isin
1817from numpy .typing import NDArray
1918from 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 (
0 commit comments