LALInference  4.1.6.1-c9a8ef6
lalinference_merge_posteriors.py
Go to the documentation of this file.
1 
2 # resample posteriors (C) John Veitch, 2015
3 
4 from numpy import vstack,log
5 from optparse import OptionParser
6 import sys
7 from lalinference import bayespputils as bppu
8 
9 from lalinference.nest2pos import draw_posterior, draw_N_posterior
10 
11 usage='''%prog [-N NPOS]-o output.dat -p pos1.dat -w weight1 [-p pos2.dat -w weight2 ...]
12 %prog takes a list of posterior files and weights and draws samples from the combined,
13 reweighted distribution
14 '''
15 
16 def load_data(filename,header=None):
17  peparser=bppu.PEOutputParser('common')
18  commonObj=peparser.parse(open(filename,'r'),info=[header,None])
19  pos=bppu.Posterior(commonObj)
20  return pos
21 
22 if __name__=='__main__':
23  parser=OptionParser(usage)
24  parser.add_option('-o','--output',action='store',type='string',default=None,help='output file',metavar='output.dat')
25  parser.add_option('-p','--posterior',action='append',type='string',default=[],metavar='pos.dat',help='posterior input file')
26  parser.add_option('-w','--weight',action='append',type='float',default=[],metavar='NUM',help='weight of an input file')
27  parser.add_option('-N','--npos',action='store',default=None,metavar='NPOS',help='Optional number of posterior samples to draw')
28  parser.add_option('--verbose',action='store_true',default=False,help='Prints additional information')
29  (opts,args) = parser.parse_args()
30 
31  if len(opts.posterior)==0:
32  sys.stderr.write('No input files given\n')
33  sys.exit(1)
34  if len(opts.weight) != len(opts.posterior):
35  sys.stderr.write('Error: must specify same number of weights and posteriors\n')
36  sys.exit(1)
37 
38  # Create posterior samples for each input file
39  datas=map(load_data,opts.posterior)
40  weights=[]
41  for d,w in zip(datas,opts.weight):
42  theseweights = (log(w) + logl + logp for logl,logp in zip(d['logl'].samples,d['logprior'].samples))
43  weights.extend(theseweights)
44  bigdata=vstack([d.samples()[0] for d in datas])
45 
46  # Call reweighting function
47  if opts.npos is not None:
48  merged=draw_N_posterior(bigdata,weights,opts.npos,verbose=opts.verbose)
49  else:
50  merged=draw_posterior(bigdata,weights,verbose=opts.verbose)
51 
52  outObj=bppu.Posterior((datas[0].names,merged))
53 
54  # Write output file
55  if opts.output is not None:
56  outObj.write_to_file(opts.output)
57 
58 
def draw_N_posterior(data, log_wts, N, verbose=False)
Draw N samples from the input data, weighted by log_wt.
Definition: nest2pos.py:97
def draw_posterior(data, log_wts, verbose=False)
Draw points from the given data (of shape (Nsamples, Ndim)) with associated log(weight) (of shape (Ns...
Definition: nest2pos.py:55