diff --git a/peyote/result.py b/peyote/result.py
index f3fbc41d46a5ad8ce70b7cbe3a731abc208a8327..45644dff62f2092d68cb57fcb6d857e64f84ad9b 100644
--- a/peyote/result.py
+++ b/peyote/result.py
@@ -1,7 +1,9 @@
 import logging
 import os
+import numpy as np
 import deepdish
 from chainconsumer import ChainConsumer
+import pandas as pd
 
 
 class Result(dict):
@@ -113,4 +115,32 @@ class Result(dict):
         fig = c.plotter.plot_distributions(**kwargs)
         return fig
 
+    def samples_to_data_frame(self):
+        """
+        Convert array of samples to data frame.
+
+        :return:
+        """
+        data_frame = pd.DataFrame(self.samples, columns=self.search_parameter_keys)
+        self.posterior = data_frame
+        for key in self.fixed_parameter_keys:
+            self.posterior[key] = self.prior[key].sample(len(self.posterior))
 
+    def construct_cbc_derived_parameters(self):
+        """
+        Construct widely used derived parameters of CBCs
+
+        :return:
+        """
+        self.posterior['mass_chirp'] = (self.posterior.mass_1 * self.posterior.mass_2)**0.6 \
+                                       / (self.posterior.mass_1 + self.posterior.mass_2)**0.2
+        self.posterior['q'] = self.posterior.mass_2 / self.posterior.mass_1
+        self.posterior['eta'] = (self.posterior.mass_1 * self.posterior.mass_2) \
+                                / (self.posterior.mass_1 + self.posterior.mass_2)**2
+
+        self.posterior['chi_eff'] = (self.posterior.a_1 * np.cos(self.posterior.tilt_1)
+                                     + self.posterior.q * self.posterior.a_2 * np.cos(self.posterior.tilt_2))\
+                                    / (1 + self.posterior.q)
+        self.posterior['chi_p'] = max(self.posterior.a_1 * np.sin(self.posterior.tilt_1),
+                                      (4 * self.posterior.q + 3) / (3 * self.posterior.q + 4) * self.posterior.q
+                                      * self.posterior.a_2 * np.sin(self.posterior.tilt_2))
\ No newline at end of file
diff --git a/peyote/sampler.py b/peyote/sampler.py
index 6ae2981a6e49c0fc864b853103171abad33702b2..f9d74fa63994e81797d5b902273545039e702edd 100644
--- a/peyote/sampler.py
+++ b/peyote/sampler.py
@@ -300,6 +300,8 @@ def run_sampler(likelihood, priors, label='label', outdir='outdir',
         else:
             result.log_bayes_factor = result.logz - result.noise_logz
         result.injection_parameters = injection_parameters
+        result.prior = prior
+        result.samples_to_data_frame()
         result.save_to_file(outdir=outdir, label=label)
         return result
     else: