diff --git a/src/ich/__pycache__/algo.cpython-310.pyc b/src/ich/__pycache__/algo.cpython-310.pyc
deleted file mode 100644
index 646093577efcb78c07a364cf7c0abfe40b23e6a8..0000000000000000000000000000000000000000
Binary files a/src/ich/__pycache__/algo.cpython-310.pyc and /dev/null differ
diff --git a/src/ich/__pycache__/args_in.cpython-310.pyc b/src/ich/__pycache__/args_in.cpython-310.pyc
deleted file mode 100644
index 28a51a332587afa620a45f2625518e47917a22bf..0000000000000000000000000000000000000000
Binary files a/src/ich/__pycache__/args_in.cpython-310.pyc and /dev/null differ
diff --git a/src/ich/__pycache__/plotting.cpython-310.pyc b/src/ich/__pycache__/plotting.cpython-310.pyc
deleted file mode 100644
index 18e6f194e092817b5c38a3f9c23a05a84bf490af..0000000000000000000000000000000000000000
Binary files a/src/ich/__pycache__/plotting.cpython-310.pyc and /dev/null differ
diff --git a/src/ich/__pycache__/rst_io.cpython-310.pyc b/src/ich/__pycache__/rst_io.cpython-310.pyc
deleted file mode 100644
index 2518670d4097a85851354dd8f474301d7307a88e..0000000000000000000000000000000000000000
Binary files a/src/ich/__pycache__/rst_io.cpython-310.pyc and /dev/null differ
diff --git a/src/ich/__pycache__/utils.cpython-310.pyc b/src/ich/__pycache__/utils.cpython-310.pyc
deleted file mode 100644
index eb73f28196990210072efb2325d07b429e471dad..0000000000000000000000000000000000000000
Binary files a/src/ich/__pycache__/utils.cpython-310.pyc and /dev/null differ
diff --git a/src/ich/algo.py b/src/ich/algo.py
index b82061756e43ae9f14d4e6bcc4078f57fed5ebf4..24dfd42afef53f21e736abf3187b1a3dfc7467a4 100644
--- a/src/ich/algo.py
+++ b/src/ich/algo.py
@@ -248,6 +248,7 @@ def process_block(i, j, cohArray, lidarArray, initial_ws, htl, htg, parm_):
         cohBlock = cohArray[start_i:end_i, start_j:end_j]
 
         if np.count_nonzero(~np.isnan(cohBlock)) <5:
+            # print('no coh')
             count = np.count_nonzero(~np.isnan(lidarBlock))
             s_parm = 0
             c_parm = 0
@@ -259,22 +260,23 @@ def process_block(i, j, cohArray, lidarArray, initial_ws, htl, htg, parm_):
             return start_i, end_i, start_j, end_j, s_parm, c_parm, rmse_parm, ht, count
         
         # elif (np.isfinite(lidarBlock).any() and np.count_nonzero(~np.isnan(lidarBlock)) > 1) or max(lidarBlock.shape)>512:
-        elif (np.isfinite(lidarBlock).any() and np.count_nonzero(~np.isnan(lidarBlock)) > 1) or max(lidarBlock.shape)>512:
+        elif (np.isfinite(lidarBlock).any() and np.count_nonzero(~np.isnan(lidarBlock)) > 3) or max(lidarBlock.shape)>512:
 
             parm = cal_(cohBlock, lidarBlock, htl, htg)
             mask = np.where(~np.isnan(lidarBlock), 1, 0)
 
-            if np.all(np.array(parm) == 0):
-                parm = parm_.copy()
-                del parm_
+            # if np.all(np.array(parm) == 0):
+            #     parm = parm_.copy()
+            #     del parm_
             if lidarBlock.shape[0]*lidarBlock.shape[1]>initial_ws*initial_ws:
                 # mask[np.shape(mask)[0]//2,np.shape(mask)[1]//2]=1
+                print('blank_blocks',lidarBlock.shape,parm)
                 np.fill_diagonal(mask, 1)
                 mask = np.flipud(mask)
                 np.fill_diagonal(mask, 1)
 
-            s_parm = np.full(lidarBlock.shape, parm[1]) * mask
-            c_parm = np.full(lidarBlock.shape, parm[2]) * mask
+            s_parm = np.full(lidarBlock.shape, parm[1]) 
+            c_parm = np.full(lidarBlock.shape, parm[2]) 
             rmse_parm = np.full(lidarBlock.shape, parm[4])
             count = np.count_nonzero(~np.isnan(lidarBlock))
 
diff --git a/src/ich/args_in.py b/src/ich/args_in.py
index 498c3a1ca9601edde075cc162206e28a5a8a5170..e4891bdf3d071cf02f6c2cadfbc277251b70034c 100644
--- a/src/ich/args_in.py
+++ b/src/ich/args_in.py
@@ -28,7 +28,7 @@ from sklearn.model_selection import train_test_split
 from plotting import density_scatter, plot_data, rmse
 from algo import arc_sinc_fast,arc_sinc, arc_sinc_, cal_, dynamicWindow
 from rst_io import read_bin, write_tif, write_bin
-from utils import blockshaped, unblockshaped, unpad, spatial_intp_lin, split_sample
+from utils import blockshaped, unblockshaped, unpad, spatial_intp_lin, split_sample, spatial_intp_idw
 
 # Initialize EMPatches instance
 emp = EMPatches()
@@ -148,6 +148,26 @@ def rvog_inverse(args):
     t1 = time.time()
     s, c, rmse__, ht_, count = dynamicWindow(cor, lidar_ht_cal, args.window_size, args.htl, args.htg)
 
+    temp_lidar = blockshaped(lidar_ht_cal, args.window_size, args.window_size)
+    temp_mask = np.zeros(temp_lidar.shape)
+    
+    for win in tqdm(range(np.shape(temp_lidar)[0])):
+        mask = temp_lidar[win,:,:].copy()
+        mask[~np.isnan(mask)] = 1 
+        temp_mask[win,:,:] = mask
+        if np.all(temp_lidar[win,:,:]==0) or np.all(np.isnan(temp_lidar[win,:,:])):
+            mask = np.zeros(temp_mask[win,:,:].shape)
+            np.fill_diagonal(mask, 1)
+            mask = np.flipud(mask)
+            np.fill_diagonal(mask, 1)
+            temp_mask[win,:,:] = mask
+
+    temp_mask = unblockshaped(temp_mask, rows,cols)
+
+    s = s*temp_mask
+    c = c*temp_mask
+
+
     # Mask out invalid values
     ht_[ht_ == 0] = np.nan
     s[s == 0] = np.nan
@@ -171,10 +191,18 @@ def rvog_inverse(args):
     t2 = time.time()
     print("[2/3] Generating height map... ",end=" ")
 
-    # Interpolate calibration parameters
+    # # Interpolate calibration parameters
     ci = spatial_intp_lin(c)
     si = spatial_intp_lin(s)
 
+    # # Interpolate calibration parameters
+    # ci = spatial_intp_idw(c)
+    # si = spatial_intp_idw(s)
+    
+    # # Interpolate calibration parameters
+    # ci = spatial_intp_kriging(c)
+    # si = spatial_intp_kriging(s)
+    
     # Clip extreme values
     si[si > 1.6] = 1.6
     ci[ci > 16] = 16
diff --git a/src/ich/utils.py b/src/ich/utils.py
index 337b4cb4308da0ba0de44956247e05e0735ccaf4..5a6882df9bfc490558e226694c5fba5fcc19513b 100644
--- a/src/ich/utils.py
+++ b/src/ich/utils.py
@@ -21,7 +21,7 @@ from scipy.interpolate import griddata
 from tqdm import tqdm
 from scipy.interpolate import interpn
 from sklearn.model_selection import train_test_split
-
+# from pykrige.ok import OrdinaryKriging
 
 def blockshaped(arr, nrows, ncols):
     """
@@ -73,6 +73,52 @@ def spatial_intp_lin(array):
 
     return intp
 
+
+# def spatial_intp_kriging(array):
+#     x = np.arange(0, array.shape[1])
+#     y = np.arange(0, array.shape[0])
+#     # Mask invalid values
+#     array = np.ma.masked_invalid(array)
+#     xx, yy = np.meshgrid(x, y)
+    
+#     # Get only the valid values
+#     x1 = xx[~array.mask]
+#     y1 = yy[~array.mask]
+#     newarr = array[~array.mask]
+    
+#     # Perform ordinary kriging
+#     OK = OrdinaryKriging(x1, y1, newarr, variogram_model='linear', verbose=False, enable_plotting=False)
+#     z, ss = OK.execute('grid', x, y)
+    
+#     return z
+
+def spatial_intp_idw(array, power=0.5):
+    x = np.arange(0, array.shape[1])
+    y = np.arange(0, array.shape[0])
+    # Mask invalid values
+    array = np.ma.masked_invalid(array)
+    xx, yy = np.meshgrid(x, y)
+    
+    # Get only the valid values
+    x1 = xx[~array.mask]
+    y1 = yy[~array.mask]
+    newarr = array[~array.mask]
+    
+    # Function to compute IDW
+    def idw(xi, yi, x1, y1, values, power):
+        dist = np.sqrt((x1 - xi) ** 2 + (y1 - yi) ** 2)
+        # Handle case where distance is zero
+        if np.any(dist == 0):
+            return values[dist == 0][0]
+        weights = 1 / (dist ** power)
+        return np.sum(weights * values) / np.sum(weights)
+    
+    # Apply IDW for each point in the grid
+    idw_values = np.array([[idw(i, j, x1, y1, newarr, power) for i in x] for j in y])
+    
+    return idw_values
+
+
 def split_sample(a,frac=0.3):
     """
     Returns calibration and validation 2d arrays