def __run_once(self): ref_phs_file = Configuration.ref_phs_file(self.params) correct._copy_mlooked(self.params) multi_paths = self.params[cf.INTERFEROGRAM_FILES] ifg_paths = [p.tmp_sampled_path for p in multi_paths] ifgs = [Ifg(i) for i in ifg_paths] self.params[cf.REFX_FOUND], self.params[ cf.REFY_FOUND] = ref_pixel_calc_wrapper(self.params) correct._create_ifg_dict(self.params) ref_phase_est_wrapper(self.params) for i in ifgs: i.open() phase_prev = [i.phase_data for i in ifgs] # assert ref_ph_file present assert ref_phs_file.exists() time_written = os.stat(ref_phs_file).st_mtime for i in ifgs: i.close() return phase_prev, time_written
def ref_phase_est_wrapper(params): """ Wrapper for reference phase estimation. """ ifg_paths = [ ifg_path.tmp_sampled_path for ifg_path in params[C.INTERFEROGRAM_FILES] ] refpx, refpy = params[C.REFX_FOUND], params[C.REFY_FOUND] if len(ifg_paths) < 2: raise ReferencePhaseError( "At least two interferograms required for reference phase correction ({len_ifg_paths} " "provided).".format(len_ifg_paths=len(ifg_paths))) # this is not going to be true as we now start with fresh multilooked ifg copies - remove? if mpiops.run_once(shared.check_correction_status, ifg_paths, ifc.PYRATE_REF_PHASE): log.warning( 'Reference phase correction already applied to ifgs; returning') return ifgs = [Ifg(ifg_path) for ifg_path in ifg_paths] # Save reference phase numpy arrays to disk. ref_phs_file = Configuration.ref_phs_file(params) # If ref phase file exists on disk, then reuse - subtract ref_phase from ifgs and return if ref_phs_file.exists(): ref_phs = np.load(ref_phs_file) _update_phase_and_metadata(ifgs, ref_phs, params) shared.save_numpy_phase(ifg_paths, params) return ref_phs, ifgs # determine the reference phase for each ifg if params[C.REF_EST_METHOD] == 1: log.info("Calculating reference phase as median of interferogram") ref_phs = est_ref_phase_ifg_median(ifg_paths, params) elif params[C.REF_EST_METHOD] == 2: log.info( 'Calculating reference phase in a patch surrounding pixel (x, y): ({}, {})' .format(refpx, refpy)) ref_phs = est_ref_phase_patch_median(ifg_paths, params, refpx, refpy) else: raise ReferencePhaseError( "No such option, set parameter 'refest' to '1' or '2'.") # gather all reference phases from distributed processes and save to disk if mpiops.rank == MAIN_PROCESS: collected_ref_phs = np.zeros(len(ifg_paths), dtype=np.float64) process_indices = mpiops.array_split(range(len(ifg_paths))).astype( np.uint16) collected_ref_phs[process_indices] = ref_phs for r in range(1, mpiops.size): process_indices = mpiops.array_split(range(len(ifg_paths)), r).astype(np.uint16) this_process_ref_phs = np.zeros(shape=len(process_indices), dtype=np.float64) mpiops.comm.Recv(this_process_ref_phs, source=r, tag=r) collected_ref_phs[process_indices] = this_process_ref_phs np.save(file=ref_phs_file, arr=collected_ref_phs) else: collected_ref_phs = np.empty(len(ifg_paths), dtype=np.float64) mpiops.comm.Send(ref_phs, dest=MAIN_PROCESS, tag=mpiops.rank) mpiops.comm.Bcast(collected_ref_phs, root=0) # subtract ref_phase from ifgs _update_phase_and_metadata(ifgs, collected_ref_phs, params) mpiops.comm.barrier() shared.save_numpy_phase(ifg_paths, params) log.debug("Finished reference phase correction") # Preserve old return value so tests don't break. return ref_phs, ifgs