1010from functools import partial
1111from importlib .resources import files
1212
13+ import matplotlib .pyplot as plt
1314import megham .transform as mt
1415import numpy as np
1516import yaml
17+ from numpy .lib .arraysetops import isin
1618from numpy .typing import NDArray
1719from pqdm .processes import pqdm
1820
@@ -108,10 +110,16 @@ def main():
108110
109111 mode = cfg .get ("mode" , "panel" )
110112 cfgdir = os .path .dirname (os .path .abspath (args .config ))
111- meas_file = os .path .abspath (os .path .join (cfgdir , cfg ["measurement" ]))
113+ meas_files = cfg ["measurement" ]
114+ if isinstance (meas_files , str ):
115+ meas_files = [meas_files ]
116+ meas_files = [os .path .abspath (os .path .join (cfgdir , meas )) for meas in meas_files ]
117+ tracker_yamls = cfg .get ("tracker_yaml" , "" )
118+ if isinstance (tracker_yamls , str ):
119+ tracker_yamls = [tracker_yamls ]
112120 title_str = cfg ["title" ]
113121 logger .info ("Begining alignment %s in %s mode" , title_str , mode )
114- logger .debug ("Using measurement file : %s" , meas_file )
122+ logger .debug ("Using measurement files : %s" , meas_files )
115123
116124 dat_dir = os .path .abspath (os .path .join (cfgdir , cfg .get ("data_dir" , "/" )))
117125 if "data_dir" in cfg :
@@ -122,7 +130,10 @@ def main():
122130 ref_path = str (files ("lat_alignment.data" ).joinpath ("reference.yaml" ))
123131 with open (ref_path ) as file :
124132 reference = yaml .safe_load (file )
125- dataset = io .load_data (meas_file , ** cfg .get ("load" , {"source" : "photo" }))
133+ datasets = [
134+ io .load_data (meas_file , ** cfg .get ("load" , {"source" : "photo" }))
135+ for meas_file in meas_files
136+ ]
126137 if "data_dir" in cfg :
127138 corner_path_m1 = os .path .join (dat_dir , f"primary_corners.yaml" )
128139 adj_path_m1 = os .path .join (dat_dir , f"primary_adj.csv" )
@@ -159,47 +170,73 @@ def main():
159170 logger .info ("Aligning panels for the %s mirror" , mirror )
160171
161172 # init, fit, and plot panels
162- try :
163- if isinstance (dataset , ds .DatasetPhotogrammetry ):
164- dataset , _ = da .align_photo (
165- dataset , reference , True , mirror , ** cfg .get ("align_photo" , {})
166- )
167- else :
168- dataset , _ = da .align_tracker (
169- dataset , cfg ["tracker_yaml" ], mirror , ** cfg .get ("align_tracker" , {})
170- )
171- except Exception as e :
172- logger .error ("Failed to align to reference points, with error %s" , str (e ))
173- bootstrap_from = cfg .get ("bootstrap_from" , "all" )
174- logger .info ("Bootstrapping from %s" , bootstrap_from )
175- if isinstance (dataset , ds .DatasetPhotogrammetry ):
176- dataset , _ = da .align_photo (
177- dataset ,
178- reference ,
179- True ,
180- bootstrap_from ,
181- ** cfg .get ("align_photo" , {}),
182- )
183- else :
184- dataset , _ = da .align_tracker (
185- dataset ,
186- cfg ["tracker_yaml" ],
187- bootstrap_from ,
188- ** cfg .get ("align_tracker" , {}),
189- )
190- if bootstrap_from == "primary" :
191- points = tf .coord_transform (
192- dataset .points , "opt_primary" , f"opt_{ mirror } "
193- )
194- elif bootstrap_from == "secondary" :
195- points = tf .coord_transform (
196- dataset .points , "opt_secondary" , f"opt_{ mirror } "
173+ data_dict = {}
174+ for i , dataset in enumerate (datasets ):
175+ try :
176+ if isinstance (dataset , ds .DatasetPhotogrammetry ):
177+ dataset , _ = da .align_photo (
178+ dataset , reference , True , mirror , ** cfg .get ("align_photo" , {})
179+ )
180+ else :
181+ dataset , _ = da .align_tracker (
182+ dataset ,
183+ tracker_yamls [i ],
184+ mirror ,
185+ ** cfg .get ("align_tracker" , {}),
186+ )
187+ except Exception as e :
188+ logger .error (
189+ "Failed to align to reference points, with error %s" , str (e )
197190 )
198- else :
199- points = tf .coord_transform (
200- dataset .points , "opt_global" , f"opt_{ mirror } "
201- )
202- dataset .data_dict = {l : p for l , p in zip (dataset .labels , points )}
191+ bootstrap_from = cfg .get ("bootstrap_from" , "all" )
192+ logger .info ("Bootstrapping from %s" , bootstrap_from )
193+ if isinstance (dataset , ds .DatasetPhotogrammetry ):
194+ dataset , _ = da .align_photo (
195+ dataset ,
196+ reference ,
197+ True ,
198+ bootstrap_from ,
199+ ** cfg .get ("align_photo" , {}),
200+ )
201+ else :
202+ dataset , _ = da .align_tracker (
203+ dataset ,
204+ tracker_yamls [i ],
205+ bootstrap_from ,
206+ ** cfg .get ("align_tracker" , {}),
207+ )
208+ if bootstrap_from == "primary" :
209+ points = tf .coord_transform (
210+ dataset .points , "opt_primary" , f"opt_{ mirror } "
211+ )
212+ 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 )}
222+ data_dict = data_dict | ddict
223+ dataset = datasets [0 ].__class__ (data_dict )
224+ append = ""
225+ if "sample_every" in cfg :
226+ i , j = cfg ["sample_every" ]
227+ ddict = {l : p for l , p in zip (dataset .labels [i ::j ], dataset .points [i ::j ])}
228+ dataset .data_dict = ddict
229+ append = f"_{ i } _{ j } "
230+
231+ fig = plt .figure ()
232+ ax = fig .add_subplot (projection = "3d" )
233+ ax .scatter (
234+ dataset .targets [:, 0 ],
235+ dataset .targets [:, 1 ],
236+ dataset .targets [:, 2 ],
237+ marker = "x" ,
238+ )
239+ plt .show ()
203240 dataset , _ = mir .remove_cm (
204241 dataset , mirror , cfg .get ("compensate" , 0 ), ** cfg .get ("common_mode" , {})
205242 )
@@ -229,13 +266,15 @@ def main():
229266 cfg .get ("adjuster_radius" , 100 ),
230267 )
231268 logger .info ("Found measurements for %d panels" , len (panels ))
232- fig = mir .plot_panels (panels , title_str , vmax = cfg .get ("vmax" , None ))
233- fig .savefig (os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} .png" ))
269+ fig = mir .plot_panels (
270+ panels , title_str , vmax = cfg .get ("vmax" , None ), use_iqr = cfg .get ("iqr" , False )
271+ )
272+ fig .savefig (os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} { append } .png" ))
234273 res_all = np .vstack ([panel .residuals for panel in panels ])
235274 model_all = np .vstack ([panel .model for panel in panels ])
236275 mir_out = np .hstack ([model_all , res_all ])
237276 np .savetxt (
238- os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} _surface.txt" ),
277+ os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} _surface{ append } .txt" ),
239278 mir_out ,
240279 header = "x y z x_res y_res z_res" ,
241280 )
@@ -249,11 +288,15 @@ def main():
249288 order = np .lexsort ((adjustments [:, 2 ], adjustments [:, 1 ], adjustments [:, 0 ]))
250289 adjustments = adjustments [order ]
251290 np .savetxt (
252- os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} .csv" ),
291+ os .path .join (cfgdir , f"{ title_str .replace (' ' , '_' )} { append } .csv" ),
253292 adjustments ,
254293 fmt = ["%d" , "%d" , "%d" ] + ["%.5f" ] * 14 ,
255294 )
256295 elif mode == "optical" :
296+ if len (datasets ) > 1 or len (tracker_yamls ) > 1 :
297+ raise ValueError ("Cannot have multiple files in optical mode" )
298+ dataset = datasets [0 ]
299+ tracker_yaml = tracker_yamls [0 ]
257300 align_to = cfg ["align_to" ]
258301 if align_to not in ["primary" , "secondary" , "receiver" , "bearing" ]:
259302 raise ValueError (f"Invalid element specified for 'align_to': { align_to } " )
@@ -264,7 +307,7 @@ def main():
264307 )
265308 else :
266309 dataset , _ = da .align_tracker (
267- dataset , cfg [ " tracker_yaml" ] , "all" , ** cfg .get ("align_tracker" , {})
310+ dataset , tracker_yaml , "all" , ** cfg .get ("align_tracker" , {})
268311 )
269312
270313 # Load data and compute the transformation to align with the model
0 commit comments