diff --git a/align.py b/align.py
index 8cd9be3043e80d46228e675faa7a463344202300..233837955851d18ec0d87beb7f15a3c724a65e82 100644
--- a/align.py
+++ b/align.py
@@ -1,3 +1,4 @@
+from typing import List
 import numpy as np
 from droplet_growth import mic, register, poisson
 import tifffile as tf
@@ -12,6 +13,7 @@ import nd2
 import pandas as pd
 from skimage.measure import regionprops_table
 from scipy.ndimage import laplace, rotate
+import json
 
 
 def align_multichip(BF_TRITC_2D_path, out_path, concentrations_path, template_path, labels_path, table_path, fit_poisson, nmax=10):
@@ -31,8 +33,8 @@ def align_multichip(BF_TRITC_2D_path, out_path, concentrations_path, template_pa
     data = read_dask(BF_TRITC_2D_path)
     template16 = tf.imread(template_path)
     if rotate_template_deg != 0:
-        template16 = rotate(template16, rotate_template_deg)
-        print(f'Rotated template {rotate_template_deg} deg')
+        data = da.from_array(rotate(data, rotate_template_deg))
+        print(f'Rotated data {rotate_template_deg} deg')
     big_labels = tf.imread(labels_path)
 
     fun = partial(
@@ -55,6 +57,20 @@ def align_multichip(BF_TRITC_2D_path, out_path, concentrations_path, template_pa
     
     aligned = [o['stack'] for o in out]
     counts = [o['counts'] for o in out]
+    tvecs = [o['tvec'] for o in out]
+
+    def prep_tvec(transform_dict):
+        transform_dict["tvec"] = List(transform_dict["tvec"])
+        return transform_dict
+
+    try:
+        transform_data = [map(prep_tvec, tvecs)]
+        with open(out_path.replace('.zarr', '.transform.json'), 'w') as f:
+            json.dump(transform_data, fp=f)
+    except Exception as e:
+        print('saving transform json failed: ', e.args)
+    
+
     df = pd.concat(counts, ignore_index=True).sort_values(['[AB]','label'])
     df.to_csv(table_path)
 
@@ -88,7 +104,7 @@ def align2D(stack_dask, path_tif, ab, template16=None, big_labels=None, unit='μ
     data = stack_dask.compute()
     aligned, tvec = register.align_stack(
         data, 
-        path_to_save=path_tif, 
+        path_to_save=None, 
         template16=template16, 
         mask2=big_labels, 
         binnings=(2,16,2)
@@ -105,8 +121,8 @@ def align2D(stack_dask, path_tif, ab, template16=None, big_labels=None, unit='μ
         )
         counts.loc[:, 'poisson fit'] = l
 
-    counts.to_csv((cp := path_tif.replace('.tif', '-counts.csv')), index=None)
-    return {"stack": aligned, "counts": counts}
+    # counts.to_csv((cp := path_tif.replace('.tif', '-counts.csv')), index=None)
+    return {"stack": aligned, "counts": counts, 'tvec': tvec}
 
 def count(aligned:np.ndarray, ab=None):
     counts = mic.get_cell_numbers(aligned[1], aligned[2], threshold_abs=2, plot=False, bf=aligned[0])