From 1feb9438a452b0cb5c1b5d93e4c1ce0e33a59bd1 Mon Sep 17 00:00:00 2001
From: Colm Talbot <colm.talbot@ligo.org>
Date: Thu, 3 May 2018 09:21:23 +1000
Subject: [PATCH] start setting up some post processing

---
 peyote/result.py  | 30 ++++++++++++++++++++++++++++++
 peyote/sampler.py |  2 ++
 2 files changed, 32 insertions(+)

diff --git a/peyote/result.py b/peyote/result.py
index f3fbc41d4..45644dff6 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 6ae2981a6..f9d74fa63 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:
-- 
GitLab