Skip to content

Commit

Permalink
save cvd data to numpy array on disk
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt Garthwaite authored and Matt Garthwaite committed Mar 23, 2017
1 parent 2cb8057 commit e83ab04
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
3 changes: 2 additions & 1 deletion pyrate/scripts/run_pyrate.py
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,8 @@ def maxvar_alpha_calc(ifg_paths, params, preread_ifgs):
'to this process, out of a total {} ifgs'.format(
n+1, len(prcs_ifgs), len(ifg_paths)))
# TODO: cvd calculation is still pretty slow - revisit
process_maxvar.append(vcm_module.cvd(i, params, calc_alpha=True, write_values=True)[0])
process_maxvar.append(vcm_module.cvd(i, params, calc_alpha=True,
write_vals=True, save_acg=True)[0])
if mpiops.rank == MASTER_PROCESS:
maxvar = np.empty(len(ifg_paths), dtype=np.float64)
maxvar[process_indices] = process_maxvar
Expand Down
32 changes: 22 additions & 10 deletions pyrate/vcm.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"""
from __future__ import print_function
import logging
from os.path import join, basename
from numpy import array, where, isnan, real, imag, sqrt, meshgrid
from numpy import zeros, vstack, ceil, mean, exp, reshape
from numpy.linalg import norm
Expand All @@ -30,6 +31,7 @@

from pyrate import shared
from pyrate import ifgconstants as ifc
from pyrate import config as cf
from pyrate.shared import PrereadIfg, Ifg
from pyrate.algorithm import master_slave_ids

Expand Down Expand Up @@ -61,7 +63,7 @@ def _unique_points(points):
return vstack([array(u) for u in set(points)])


def cvd(ifg_path, params, calc_alpha=False, write_values=False):
def cvd(ifg_path, params, calc_alpha=False, write_vals=False, save_acg=False):
"""
Calculate the 1D covariance function of an entire interferogram as the
radial average of its 2D autocorrelation.
Expand All @@ -72,14 +74,16 @@ def cvd(ifg_path, params, calc_alpha=False, write_values=False):
dictionary of configuration parameters
:param calc_alpha: bool
calculate alpha, the exponential length-scale of decay factor.
:param write_values: bool
:param write_vals: bool
write maxvar and alpha values to interferogram metadata.
:param save_acg: bool
write acg and radial distance data to numpy array
"""
# pylint: disable=invalid-name
# pylint: disable=too-many-locals
if isinstance(ifg_path, str): # used during MPI
ifg = Ifg(ifg_path)
if write_values:
if write_vals:
ifg.open(readonly=False)
else:
ifg.open()
Expand Down Expand Up @@ -153,7 +157,10 @@ def cvd(ifg_path, params, calc_alpha=False, write_values=False):
indices_to_keep = r_dist < maxdist
r_dist = r_dist[indices_to_keep]
acg = acg[indices_to_keep]
# maximum variance usually at the zero lag: max(acg[:len(r_dist)])

# save acg vs dist observations to disk
if save_acg: _save_cvd_data(acg, r_dist, ifg_path, params[cf.TMPDIR])
# NOTE maximum variance usually at the zero lag: max(acg[:len(r_dist)])
maxvar = np.max(acg)

if calc_alpha:
Expand All @@ -180,24 +187,29 @@ def cvd(ifg_path, params, calc_alpha=False, write_values=False):
alpha = None

log.info('Best fit Maxvar = {}, Alpha = {}'.format(maxvar, alpha))
if write_values: _add_metadata(ifg, maxvar, alpha)
if write_vals: _add_metadata(ifg, maxvar, alpha)

if isinstance(ifg_path, str):
ifg.close()

return maxvar, alpha


def _add_metadata(ifg, maxvar, alpha):
"""convenience function for saving metadata to ifg"""
#ifg = Ifg(ifg_path)
#ifg.open(readonly=False)
md = ifg.meta_data
#print(md[ifc.PYRATE_MAXVAR], maxvar)
md[ifc.PYRATE_MAXVAR] = str(maxvar) #.astype('str')
md[ifc.PYRATE_ALPHA] = str(alpha) #.astype('str')
ifg.write_modified_phase()
#ifg.close()
#[_update_metadata(p, m, a) for p, m, a in zip(ifg_paths, maxvar, alpha)]


def _save_cvd_data(acg, r_dist, ifg_path, outdir):
""" function to save numpy array of autocorrelation data to disk"""
data = np.column_stack((acg, r_dist))
data_file = join(outdir, 'cvd_data_{b}.npy'.format(
b=basename(ifg_path).split('.')[0]))
np.save(file=data_file, arr=data)


def get_vcmt(ifgs, maxvar):
"""
Expand Down

0 comments on commit e83ab04

Please sign in to comment.