B
    dP             Y   @   s  d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ d dlmZ yd dlmZ W n  ek
r   d dlmZ Y nX d dlmZ edZedZed	Zed
ZedZedZedZedZedZedZ edZ!edZ"edZ#edZ$edZ%edZ&edZ'edZ(edZ)edZ*edZ+edZ,edZ-e+Z.edZ/edZ0d d! Z1d"d# Z2d$d% Z3d&d' Z4d(d) Z5d*d+ Z6d,d- Z7d.d/ Z8d0d1 Z9dd2d3Z:dd4d5Z;d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddgYZ<ddddddddddddgZ=G dd dZ>G dd dZ?dd Z@dd ZAdd ZBdd ZCdd ZDededgdd dddfddZEdededgdfddZFdddZGdddZHdd ZIdddZJd	ddZKdddgdddfddZLededfddZMd
ddĄZNdddǄZOdddʄZPddgddddddfdd΄ZQddЄ ZRdddՄZSddׄ ZTddل ZUddۄ ZVdgddfddބZWdd ZXdd ZYdd ZZdd Z[dd Z\dddZ]dd Z^dd Z_dd Z`dddZadd ZbdddZcdddZddi ddddfddZedZfd d Zgdd ZhdS (      )print_functiondivisionN)cumtrapz)interp1d)	logsumexp)string_typesz64.8481368110953599358991410235794797595635330237270e-6z3206264.80624709635515647335733077861319665970087963z67.2722052166430399038487115353692196393452995355905e-5z313750.987083139757010431557155385240879777313391975z357.295779513082320876798154814105170332405472466564z61.7453292519943295769236907684886127134428718885417e-2z33.8197186342054880584532103209403446888270314977710z62.6179938779914943653855361527329190701643078328126e-1z33.1415926535897932384626433832795028841971693993751z36.2831853071795864769252867665590057683943387987502z31.5707963267948966192313216916397514420985846996876z86400.0z
31557600.0z3.0856776e13z3.0856776e16z4.925490947e-6z	1.9891e30z	1.8987e27z6.9551e8z6.378e6z299792458.0z	1.989e+30z	6.673e-11z3.0856776e19Z1e38c             C   s   | dk rd}nd}t tt| tj }t|}|| d }t|}|| d }|dkrx|dkrx|| || || fS || ||fS dS )zT
  rad_to_dms(rad):
     Convert radians to degrees, minutes, and seconds of arc.
  g           g      N@r   N)RADTODEGnpfmodfabsmathpiint)radsignarcdms r   b/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/lalapps/pulsarpputils.py
rad_to_dmsN   s     r   c             C   s^   | dk rd}n"| dkr,|dk s&|dk r,d}nd}|t  ddt|  t|  t|  S )z^
  dms_to_rad(deg, min, sec):
     Convert degrees, minutes, and seconds of arc to radians.
  g        r   r	   g      N@)ARCSECTORADr   r   )degminssecr   r   r   r   
dms_to_rad_   s    r   c             C   s   t t| || S )z^
  dms_to_deg(deg, min, sec):
     Convert degrees, minutes, and seconds of arc to degrees.
  )r
   r   )r   r   r   r   r   r   
dms_to_degm   s    r   c             C   sb   t | dtj } | dk r(| dtj  } t|  }t|}|| d }t|}|| d }|||fS )zR
  rad_to_hms(rad):
     Convert radians to hours, minutes, and seconds of arc.
  g       @g        g      N@)r   r   r   r   RADTOHRSr   )r   r   hr   r   r   r   r   
rad_to_hmst   s     r"   c             C   s@   | dk rd}nd}|t  ddt|  t|  t|  S )z\
  hms_to_rad(hour, min, sec):
     Convert hours, minutes, and seconds of arc to radians
  g        r   r	   g      N@)SECTORADr   r   )hourr   r   r   r   r   r   
hms_to_rad   s
     r%   c             C   s~   d}| dk rd}n t | dkr2|dk s.|dk r2d}t | t |t |  } }}|dkrh|d| ||f  S |d| ||f  S dS )	z
  coord_to_string(h_or_d, m, s):
     Return a formatted string of RA or DEC values as
     'hh:mm:ss.ssss' if RA, or 'dd:mm:ss.ssss' if DEC.
   r   -g        g9v#@z%.2d:%.2d:%.4fz%.2d:%.2d:0%.4fN)abs)Zh_or_dr   r   Zretstrr   r   r   coord_to_string   s    r)   c             C   sL   |  dkrt| \}}}n$|  dkr8t| \}}}ntdt|||S )a  
  rad_to_string(rad, ra_or_dec):
     Convert an angle in radians to hours/degrees, minutes seconds and output
     it as a string in the format 'hh:mm:ss.ssss' if RA, or 'dd:mm:ss.ssss' if DEC.
     Whether to use hours or degrees is set by whether ra_or_dec is 'RA' or 'DEC'
  RADECz=Unrecognised option: Expected 'ra_or_dec' to be 'RA' or 'DEC')upperr"   r   
ValueErrorr)   )r   Z	ra_or_decvr   r   r   r   r   rad_to_string   s    r/   c             C   s   |  d}t|dkr:tt|d t|d t|d S t|dkrbtt|d t|d dS t|dkrtt|d ddS td|  tjd td d	S )
z
  ra_to_rad(ar_string):
     Given a string containing RA information as
     'hh:mm:ss.ssss', return the equivalent decimal
     radians. Also deal with cases where input
     string is just hh:mm, or hh.
  :   r   r	      g        zProblem parsing RA string %s)fileN)	splitlenr%   r   floatprintsysstderrexit)Z	ra_stringZhmsr   r   r   	ra_to_rad   s    
$r;   c             C   s   |  d}d|d kr,t|d dkr,d}nd}t|dkrhtt|d t||d  t||d  S t|dkrtt|d t||d  dS t|dkrtt|d ddS td	|  tjd
 td dS )z
  dec_to_rad(dec_string):
     Given a string containing DEC information as
     'dd:mm:ss.ssss', return the equivalent decimal
     radians. Also deal with cases where input string
     is just dd:mm or dd
  r0   r'   r   g        r&   r1   r	   r2   zProblem parsing DEC string %s)r3   N)	r4   r6   r5   r   r   r7   r8   r9   r:   )Z
dec_stringZdmsr   r   r   r   
dec_to_rad   s    
, r<   c             C   sb   d|  }| | |   }|dkr&||gS |dkr4d}n d| | | d  || |    }|||gS dS )z
  p_to_f(p, pd, pdd=None):
    Convert period, period derivative and period second
    derivative to the equivalent frequency counterparts.
    Will also convert from f to p.
  g      ?Ng        g       @g      @r   )ppdZpddffdZfddr   r   r   p_to_f   s     rA   c             C   sx   |dkrd|  || d  gS || d  }t d|d  |d  | d  |d | d   }t| |\}}||||gS dS )z
  pferrs(porf, porferr, pdorfd=None, pdorfderr=None):
     Calculate the period or frequency errors and
     the pdot or fdot errors from the opposite one.
  Ng      ?g       @g      @g      @)r   sqrtrA   )ZporfZporferrZpdorfdZ	pdorfderrZforperrZ	fdorpderrZforpZfdorpdr   r   r   pferrs   s    rC   FF0F1ZF2ZF3ZF4ZF5ZF6ZF7ZF8ZF9ZF10ZF11ZF12PEPOCHPOSEPOCHZDMSTARTZFINISHZNTOAZTRESZTZRMJDZTZRFRQZTZRSITEZNITSA1XDOTEECCEDOTT0PBPBDOTOMOMDOTEPS1EPS2EPS1DOTEPS2DOTTASCZLAMBDAZBETARA_RADDEC_RADZGAMMAZSINIM2MTOTFB0ZFB1ZFB2ZELATZELONGZPMRAZPMDECDISTPB_2PB_3T0_2T0_3ZA1_2ZA1_3OM_2OM_3ZECC_2ZECC_3PXKINKOMZA0B0D_AOPZH0ZCOSIOTAZPSIZPHI0ZTHETAI21I31C22ZHPLUSZHCROSSC21ZPHI22ZPHI21ZSNRZCOSTHETAZIOTAZQ22FILEZPSRZPSRJNAMERAJDECJr*   r+   ZEPHEMZCLKBINARYUNITSc               @   s$   e Zd Zdd Zdd Zdd ZdS )psr_parc             C   sT	  || _ t|}x>| D ]0}| s*q|dd}|dd}|dd}|dd}| }|d	  }|tkrt| ||d
  n0|t	kryt| |t
|d
  W n   wY nX t|dkr|d dkrt| |d t
|d  t| |d d	 t|dkr|d dkr$t| |d d
 nt| |d d	 t| |d t
|d  qW t| drt| dt| j t| drt| dtd	d	| j t| drt| d| d  t| drt| dt| j t| drt| dtd	d	| j t| drt| d| d  xdD ]}t| d| r| d|  }t| d| d  | t| d| |tj d!  t| d| d r| d| d  }t| d| d" | t| d| d |tj d!  qW t| d#rt| d$| j t| d$rt| d%d&| j  t| d%rt| d$d&| j  t| d'r0t| d(d&| j d)  t| d*rt| d+rt| j| j| j| j\}	}
}}t| d,|
 t| d-| t| d.| nDt| d/rt| j| j\}	}t| d,| j| j| j   t| d-| t| d,rpt| d.r,t| j| j | j!| j"\}}}}t| d*| t| d/| t| d+| nDt| d-rpt| j| j!\}}t| d*| j | j| j   t| d/| yd	d0l#m$} xd1D ]~}t| |rt| |d  | |  t| ||| |  t| |d rt| |d" | |d   t| |d | |d  t%  qW W n   t&d2t'j(d3 Y nX t)d4t* d5}x|D ]}t| |r8t| |d  | |  t| || | ||   t| |d r8t| |d" | |d   t| |d | |d  ||   q8W xZd6D ]R}t| |rt| || | t+  t| |d rt| |d | |d  t+  qW xd7D ]~}t| |r$t| |d  | |  t| || | t%  t| |d r$t| |d" | |d   t| |d | |d  t%  q$W t| d8rt| d9| d8  t| d8| d8 t+d: t%   t| d;rt| d<| d;  t| d;| d; t+d: t%   t| d=rt| d>rt,-| j.| j. | j/| j/  }t,0| j.| j/}t| d?| t| d@| t| dA| j1| j2| t3   t| d(rt| dBrt| d?st| dCst| d?dD t| dArt| dEst| d@rt| d(rt| dE| j4| j2| j5 t3   xpdFD ]h}t| |r t| |d  | |  t6| | dGkr t| || | dH  | | dIkr t| |dD q W xdJD ]~}t| |rt| |d  | |  t| || | t7  t| |d rt| |d" | |d   t| |d | |d  t7  qW t| dK	rHt| dL| dK  t| dK| dK t+ dM  |8  dNS )Oz
    This class parses a TEMPO(2)-style pulsar parameter file. If possible all parameters
    are converted into SI units and angles are in radians. Epochs will be converted from
    MJD values into GPS times.
    zD-zE-zD+zE+zd-ze-zd+ze+r   r	   r1   r2   )01Z_ERRZ_FIT   rv   rp   rY   RAJ_ERRZ
RA_RAD_ERRZRAJ_FITZ
RA_RAD_FITrq   rZ   DECJ_ERRZDEC_RAD_ERRZDECJ_FITZDEC_RAD_FIT)r*   r+   ZPMZ	_ORIGINALg p&])RCZ_ERR_ORIGINALPP0rE   g      ?r]   rP   g     @P0_ERRP1_ERRF0_ERRrF   F1_ERRP1)
TTMJDtoGPS)rG   rH   ZDMEPOCHrO   rX   ra   rb   zECould not convert epochs to GPS times. They are all still MJD values.)r3   gMbP?)r^   re   )rR   rc   rd   rf   rg   )rP   r_   r`   rS   ZOMDOT_ORIGINALg     v@Z	OMDOT_ERRZOMDOT_ERR_ORIGINALrT   rU   rL   rR   rO   rJ   rM   g        rX   )rK   rQ   rN   rV   rW   ZXPBDOTgHz>g-q=g     @)r[   r\   ri   ZD_AOP_ORIGINALg      @N)9rn   open	readlinesstripreplacer4   r,   str_keyssetattr
float_keysr6   r5   hasattrr;   rp   r%   rx   r<   rq   r   ry   r   r   rz   r{   rE   r]   rC   r|   r   r}   rA   r~   rF   r   Z	lalpulsarr   	SECPERDAYr7   r8   r9   KPCr   r
   r   rB   rT   rU   atan2rX   rP   TWOPIrO   rR   r(   MSUNclose)selfZ	parfilenmpfline	splitlinekeypvZpmvZpmver?   Zferrr@   Zfderrr=   Zperrr>   Zpderrr   epochZconvfacsitemomZpbZeccomegaZbinuZmassr   r   r   __init__  s   
$


&
&
"
"00

"zpsr_par.__init__c             C   s$   yt | |}W n   d }Y nX |S )N)getattr)r   r   parr   r   r   __getitem__  s
    
zpsr_par.__getitem__c             C   sb   d}xX| j  D ]J\}}|d d dkrt| j | trJ|d||f 7 }q|d||f 7 }qW |S )Nr&   r2   __z%10s = '%s'
z%10s = %-20.15g
)__dict__items
isinstanceZstring_type)r   outkr.   r   r   r   __str__  s    zpsr_par.__str__N)__name__
__module____qualname__r   r   r   r   r   r   r   rt     s    Krt   c               @   s$   e Zd Zdd Zdd Zdd ZdS )	psr_priorc             C   sH  || _ t|}xv| D ]j}| }|d  }|tkrZt| |t|d t|d g q|tkrt| |t|d t|d g qW t	| drt
| jd \}}}t|||}	t
| jd \}
}}t|
||}t| d|	|g t	| dr<t| jd \}}}t|||}t| jd \}}}t|||}t| d||g |  d S )	Nr   r2   r1   r*   r	   ZRA_STRr+   ZDEC_STR)rn   r   r   r4   r,   r   r   r6   r   r   r"   r*   r)   r   r+   r   )r   Zpriorfilenmr   r   r   r   ZhlmlslZrastrlhumuZsuZrastrudlZdecstrlZduZdecstrur   r   r   r     s,    "$
zpsr_prior.__init__c             C   s$   yt | |}W n   d }Y nX |S )N)r   )r   r   Zatrr   r   r   r     s
    
zpsr_prior.__getitem__c             C   sR   d}xH| j  D ]:\}}|d d dkr|d|t|d t|d f 7 }qW |S )Nr&   r2   r   z%10s = %-20.15g, %-20.15g
r   r	   )r   r   r6   )r   r   r   r.   r   r   r   r     s
    &zpsr_prior.__str__N)r   r   r   r   r   r   r   r   r   r   r     s    r   c             C   s4   t dttd   t t | |  |t  }|S )Ng      @r1   )r   rB   GCI38r   r   )freqZfdotdistZhsdr   r   r   spin_down_limit#  s    0r   c             C   s6   | t d  | t dtjd  t t |d   }|S )Ng      @g      0@r2   )r   r   r   r   r   r   )h0r   r   Zellr   r   r   h0_to_ellipticity+  s    2r   c             C   sF   t ddt j  |  td  | t dt jd  t |d   }|S )Ng      .@g       @g      @g      0@r2   )r   rB   r   r   r   r   )r   r   r   q22r   r   r   h0_to_quadrupole2  s    Br   c             C   sF   | t dt j d  d t jd  t |d  td | t  }|S )Ng       @g      .@g      0@r2   g      @)r   rB   r   r   r   r   )r   r   r   r   r   r   r   quadrupole_to_h09  s    Br   c             C   s|  t | }g }g }tdd}t|}t|}x@td|D ]0}dd|  | |  dd|  ||   }	dd|  | |  dd|  ||   }
t|
tjd kr|	tj }	|
tjd krtjd  t|
tjd  tjd  }
n&tjd ttjd |
 tjd  }
|	dtj kr6t|	dtj }	n&dtj tdtj |	 dtj  }	|	|	 |	|
 q>W ||fS )Nr	   r2   r   g      @g       @)
r5   r   r   cossinranger   r   r   append)Z	phipchainZ	psipchainZchainlenZphichainZpsichainthetactstiphi0psir   r   r   phipsiconvertA  s(    

((
*&&
r   z-infinf2   Fc	             C   s  dd l }	ddl m}
 ddlm} g }g }|s@dddddddd	}|	j| d
dddddd}y||  }W n   |}Y nX g }d }|r||  }|d krdg}xt|D ]\}}|r|dkr|
jddd}|
	d n|s|
jddd}| | }|| j
}t|t||d |d \}}|
j|||| d d|krV|
|d |d  |
jd| ddd |
jdddd |jddd |s|
d| d |    |
 }|d! || n|| d |    |dkrt||}t|dd}tj|dd"\}}t||| d#d$}||t| qW |rx|sf|
	d |
j|dd%d&d' n|
j|dd%d&d' |r|
dt| |
 }|d! |
	d( || ||fS ))Nr   )pyplot)paramlatexdictAggTg      ?serif   )backendztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyz	font.sizercgbr   r   )H1H2L1V1G1Jointr   )rw   rw      )figsizedpir	   )colorr   r&      d   )fontsize
fontweightzProbability Densityg
ףp=
?g333333?)leftbottomg?z#F2F1F0)return_indexlinear)kindz--g      ?)r   lsZ	linewidthF)
matplotlibr   lalapps.pulsarhtmlutilsr   rcParamsupdater,   	enumeratefigureholdsampleshist_norm_boundsr   stepxlimxlabelylabelsubplots_adjustylimmaxgcaset_axis_bgcolorr   r   r   insertuniquer   r6   Zaxvline)poslistparamifosparamboundsnbins
upperlimitoverplotparfile	mplparamsr   pltr   myfigsZulvalscoldictZparaxisZymaxZparvalidxifomyfigpos	pos_sampsnbinsaxr   ctuuiintfr   r   r   plot_posterior_histi  s    








r  ffffff?c             C   sv   d}t | t||d |d \}}|dkrrt||}t|dd}tj|dd\}}	t|||	 dd}
|
t|}|S )Nr   r	   T)r   r   )r   )r   r   r   r   r   r   r   r6   )r  r   r   r   ulvalr	  r
  r   r  r  r  r   r   r   upper_limit  s    
r  r   c             C   s   t j| |d\}}|d |d  }d}d}x6|D ].}|}	|t|t|  7 }|d7 }||kr0P q0W ||d  ||	 |||	    }
|
S )N)r
  r	   r   g        )r   	histogramr6   r5   )r  r   r   r	  binedgesZdbinsfracjnvZprevfracZulr   r   r   upper_limit_greedy  s    
 r  c          	   C   s&  dd l }ddl m} ddlm} yddl m}	 W n
   d S |sVddddddd	d
d}|j| ddddddd}
y"|dkrd}n|}||  }W n   |}Y nX |rg }d}d}td}td }xt	|D ]\}}|dkr:|j
ddd}|jdd |r:|	jdddd}||d d }||d }t| | }d|krbt|d j}n
|| j}t||k rt|}t||krt|}|r|j|d|
| dd  tj||dd!\}}t|d}|j|||
| d" t||kr"t|}n|j|d|
| dd  |rVy|d#|| |   W n   g }Y nX nd }t||krt|}qW |s| }||g}|jd$| d%d&d' |jd(d%d&d' |d| ||d |d  |r||d |d  |d|d)|   |g  |d* |r"|j |d+d, |S )-Nr   )r   )r   )gridspecr   Tg      ?z
sans-serifz2Avant Garde, Helvetica, Computer Modern Sans serif   )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyzfont.sans-serifz	font.sizer   r   r   r   r   r   )r   r   r   r   r   r   iotacosiotar   )r   rw   r   )r   r   g333333?)r   r	   rw   )Zwspacer   .)r   
markersize)Zdensity)r   z
$R = %.2f$r&      r   )r   r   Z
Iterationsg?z#F2F1F0zGelman-Rubins test)title)!r   r   r   r   r  r   r   r,   r6   r   r   r   ZGridSpecZsubplotlistr   r   r   minr   plotr  r   r   r5   r   Z
set_ylabelZ
set_xlabelZset_xlimZset_ylimset_yticklabelsr   Zlegend)r   r   r   grrZwithhistr   r   r  r   r  r  r=   paryaxisZ
legendvalsmaxiterZmaxnZminsampZmaxsampr  r  r  gsZax1Zax2r  r  r	  r  boundsr   r   r   plot_posterior_chain  s    








r*  c       
   	   C   s  yt | d}W n   td|  tjd dS y| }W n   td|  tjd dS |  td|d d }tdt|d	  t|d
  |dd  }t	|}t	|}t
j|d t|d
  gd	d}xVtt|d	 d D ]>}t
j|||d t|d
  |d	 t|d
   gdd}qW t
|d |d |d |d	 d   t|d	 }t
|d |d |d |d
 d   t|d
 }	||	|fS )NrbzCould not open prior file %s)r3   )NNNz)Could not read in data from prior file %sZdddddd0   r   r2      )Zndminr	   r   )axisr1   rw   )r   r7   r8   r9   readr   structunpackr   r!  r   arrayr   r   linspace)
histfilefpr>   headergridr   histarrr   xbinsybinsr   r   r   read_hist_from_file  s*    , >22r;  Tc                s  dd l }ddl m} ddlm} t| \}}	}
| sHtdtjd d S g }|sddddddd	d
d}|j	
| |jddd}y||  }W n   |}Y nX y||  }W n   |}Y nX |jd| ddd |jd| dddd |d |d  }|	d |	d  }|d |d  |d |d  |	d |d  |	d |d  g}|jt|
d|ddd |jddd | d  }|| |rg }x6tt|D ]&}|tj|
d d  | |	d qW tj||d t fd d!|}g }x<tt|	D ],}|tjt|
d d  | |d qW tj||	dtfd"d!|}|jddd}|j||d#d$ |dt|d%t|   ||d |d  |jd| ddd |jd&ddd |jddd | }|d' |jddd}|j|	|d#d$ |dt|d%t|   ||d( |d)  |jd| ddd |jd&ddd |jddd | }|d' || || |S )*Nr   )r   )r   z$Could not read binary histogram file)r3   r   Tg      ?r   r   )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyz	font.size)rw   rw   r   )r   r   r&   r   r   )r   r   i  )r   r   rotationr	   g       @r   autoZbicubicZgray_r)aspectextentinterpolationcmapg
ףp=
?g333333?)r   r   )xc                s   |   S )Nr   )rB  )xarear   r   <lambda>      z'plot_2Dhist_from_file.<locals>.<lambda>c                s   |   S )Nr   )rB  )yarear   r   rD    rE  r   )r   g?zProbability Densityz#F2F1F0r1   r2   ) r   r   r   r   r;  anyr7   r8   r9   r   r   r   r,   r   r   imshowr   	transposer   Zget_axesr.  r   r   r5   trapzmapr   r   r   r   r   r   )r4  Z	ndimlabelZ	mdimlabelZmargparsr   r   r  r   r9  r:  r8  ZfigsZfigparxaxisr&  dxZdyr?  faxZxmargr   ZymargZfigxr  Zfigyr   )rC  rF  r   plot_2Dhist_from_file  s    

<

&,



rO  c                s   t | \}}}| s(tdtjd d S g }x4tt|D ]$}|tj	|d d  | |d q:W ||d |d  d  }tj	||d t
 fdd|}t||}t|dd}tj|d	d
\}	}
t|	||
 dd}|t|S )Nz$Could not read binary histogram file)r3   )rB  r	   r   r2   c                s   |   S )Nr   )rB  )h0arear   r   rD  4  rE  z&h0ul_from_prior_file.<locals>.<lambda>T)r   r   )r   )r;  rG  r7   r8   r9   r   r5   r   r   rJ  rK  r   r   r   r   r6   )Z	priorfiler  Zh0binsZcibinsr8  Zh0margr   Z
h0margnormr   r  r  r  r   )rP  r   h0ul_from_prior_file$  s    $
rQ  c       "   	   C   s`  dd l }ddl m}	 ddlm}
 t|dkrDtdtjd td |s\dd	d
d	d
ddd}|j	
| |r~ddddddd}g }y|
|d   }W n   |d }Y nX y|
|d   }W n   |d }Y nX d }d }|r||d   }||d   }|d krdg}x&t|D ]\}}|r~|dkrH|	jddd}t|dkrhd}|	jd}nd
}|	j|| }n|	jddd}d}|	jd}| | }t||d  j}t||d  j}| }| }| }| }|	jd| ddd |	jd| dddd tj|||d	d \}}}t|} |d |d! |d! |d g}!|	j| d"|!d#||d$ |r|	|d d |d d  |	|d d |d d  |r
|r
|r|t|d kr|	d	 |	j||d%d&dd' n|	d	 |	j||d%d&dd' |r|	d	 |s |jd(d)d* || q W |r\|jd(d)d* || |S )+Nr   )r   )r   r2   zRequire 2 parameters)r3   r	   r   Tg      ?r   r   )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyz	font.sizeRedsZGnBuGreensBluesZBuPuZGreys)r   r   r   r   r   r   r   )rw   rw   r   )r   r   g      ?r&   r   r   )r   r   i  )r   r   r<  )normedr   r=  Zbilinear)r>  r?  r@  rA  alpharx   )r  Zmewg
ףp=
?g333333?)r   r   ) r   r   r   r   r5   r7   r8   r9   r:   r   r   r,   r   r   cmZget_cmapr   Zsqueezer   r"  r   r   r   Zhistogram2drI  rH  r   r   r   r#  r   r   )"r   paramsr   r)  r   r   r   r   r   r  r   r  r  rL  r&  Zparval1Zparval2r  r  r  rV  rA  Z	posteriorar   Zpar1pos_minZpar2pos_minZpar1pos_maxZpar2pos_maxHZxedgesZyedgesZHmr?  r   r   r   plot_posterior_hist2DC  s    









r]  c             C   s  t | |\}}|d |d  }t g }x2tdt|d D ]}t ||| |d  }q>W |d | |krt |dd}t |d|d | }nV|d | }	t |d|}|d |d  }
|d |
| |	  }|t}t |d|}|d | |k rt |d}t ||d | }nR||d  }	t ||}|d |d  }
|d |
| |	  }|t}t ||}t j	||d}t g }x0tdt|D ]}t |t|| | }qW ||fS )Nr	   r   r2   r   )rB  )
r   r  r2  r   r5   r   r   astyper6   rJ  )r   r   lowhighr	  r  ZbinwidthZ
bincentresr   rM  dnZnboundZareansr   r   r   r     s8    



r         ?c             C   s   |dkrt | S t dd| }t |j}||d k }ddt dt j | || |d     ||< |d|d  k}ddt dt j | || d |d     ||< |S )Nr	   r   r2   g      ?)r   Zhanningr3  onesshaper   r   )NrV  rB  winlhsrhsr   r   r   tukey_window	  s    
04rk  Q c       4         s  dd l }ddlm} ddl m} ddl m}	 g }
g }g }g }g }|sZddddddd	d
d}|j| d|jd< dddddd}dddddd}xR| D ]H}ytj| | ddgd}W n,   t	d| |  t
jd t
d Y nX ||d d df   }tj|d d df ddd  }||d d f }g  |rtttt|d d d f |d d d!f fd"\}}|d}t|| ||d    d! }tt|d d d f || k }||d d f d }tt|d d d!f || k }||d d f d }|d d df  tt | t|d d d f d! |d d d!f d!  }|	jd#d$d%}|jd&d'd(d) tt fd*d+ }|	j||d,|| d d- |	j d.t! d  d/d0d1 |	j"d2d/d0d1 |	#|d |d  |
| |s|r d  d  }t$d d3ks.d k rFt	d4t
jd t
d d}tj%t!t&| d  t'd5}ttfd6d+|} x:t(dt)| D ](}!t'||!d f ||!d!f || |! < qW t*t+| d7d8}"d9 }#||t!t+| |#|"t!t+|d:  d;\}$}%}&|r|$j,}'t%|'d }(xNt(d|'d D ]<}!t|$|!d d f })t-|)}*|)|* })t.|)|(|!< q<W ||( |	jd<d$d%}+|+jd=d&d> |	j|%|(|| d? |	#|%d |%d  |	j d@d/d0d1 |	j"dAd/d0d1 |	/ },|# d: |# dB d3|#d: |#dB g}-|,0|- g }.xT|-D ]L}/|/dkrB|.dC n0|/dk r`|.dDdE|/   n|.dFd9|/   q(W |,1|. |	j2dGdHd/dI ||+ |r|	jd#d$d%}0|0jd&d'd(d) |d |d |%d |%d g}1|	j3tt4|$dJ|1d || |5 dK |	j"d@d/d0d1 |	j d.t! d  d/d0d1 |	/ },|# d: |# dB d3|#d: |#dB g}2|,6|2 g }3xT|2D ]L}/|/dkr|3dC n0|/dk r|3dDdE|/   n|3dFd9|/   qnW |,7|3 |	j2dLdHd/dI ||0 qW |
||||fS )MNr   )specgram)colors)r   r   Tg      ?z
sans-serifz2Avant Garde, Helvetica, Computer Modern Sans serifr  )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyzfont.sans-serifz	font.sizez\usepackage{xfrac}ztext.latex.preambler   r   r   r   r   )r   r   r   r   r   rR  ZPuBurS  rT  ZPuRd#%)commentszCould not open file %s)r3   r   )r   r	   r2   r   )   g      @r   )r   r   g333333?g
ףp=
?gGz?)r   r   rightc                s   |  d  S )Nr   r   )rB  )gpstimer   r   rD  s  rE  zplot_Bks_ASDs.<locals>.<lambda>r  )r   r  zGPS - %dr   r   )r   r   z$|B_k|$g        z8Error... time steps between data points must be integers)dtypec                s   t t|   d S )Ng      ?)r   r   floor)rB  )mindtr   r   rD    rE  g?)rV  g      ?g       @)ZNFFTFsZwindowZnoverlap)rw   g      @g
ףp=
?)r   r   )r   zFrequency (Hz)z$h/\sqrt{\rm Hz}$g      @ru   z$-\sfrac{1}{%d}$g      z$\sfrac{1}{%d}$rB  major)r.  whichZ	labelsizer=  )r>  r?  r@  rA  Znormy)8r   Zmatplotlib.mlabrm  rn  r   r   r   r   loadtxtr7   r8   r9   r:   Zargsortr   r  logr   ZconcatenateZargmaxr   expwherer"  diffr   rB   r   r   r!  rK  r#  r   r   r   r   r   zerosceilcomplexr   r5   rk  rv  rf  ZnonzeroZmedianr   
set_xticksset_xticklabelsZtick_paramsrH  ZflipudZ	NormalizeZ
set_yticksr$  )4ZBkdataZdeltZplotpsdsZ	plotfscanZremoveoutlierr   r   rm  rn  r  ZBkfigsZpsdfigsZ	fscanfigsZasdlistZsampledtr  Z	colmapdicr  ZBkZuargsr	  r  r  ZstdestvalsZBknewZBkabsZBkfigZtmsZtotlencountZdatazeropadr  r   rh  rx  ZfscanfreqstZfshapeZtotalasdZscanasdZnonzasdZpsdfigr  ZxtZxlr   Zfscanfigr?  ZytZylr   )rt  rw  r   plot_Bks_ASDs#  s    
>
$$
.


 (8

"





"




r     c       '         s  dd l }ddl m} ddlm}	 |s8dddddddd	}|j| g }
d
dddddd}y|	|  }W n   |}Y nX d}d }|d k	rt|}d }d}|r`g }g }g }d}xtt	|D ]h\}}| | }x"t	|D ]\}}|d kr||= qW t|}|
| |
t| |
t| qW |d k	rP|
t| |
t| t|t|f}xvt	|D ]h\}}| | }x&t	|D ]\}}|d kr||= qW t|}|s|}|jddd}g }g }|rg }g }x@|D ]"}|
||  |
||  qW n|| g}|| g}|j|||d|d|dd\} }}!x(t	|!D ]\}}"||"d||  qJW |s|
t| |
t| |d k	r|s|
t| |
t| t|}#t| n|d }#|d  |d |j|||ddddd |d n(|s$t|}#t| n|d }#|d  | }$ttt|#t  }%t fdd|%}%|$|% tdd |%}&|$|& |jd | d!d"d# |jd | d!d"d# |jd$d%d& |

| |rlP qlW |
S )'Nr   )r   )r   r   Tg      ?r   r   )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyz	font.sizer   r   r   r   r   r   )r   r   r   r   r   r   zNumber of PulsarsF)rw   rw   r   )r   r   r   g333333?)r   histtypestackedfillr   rV  	facecolorr	   r2   )r   	edgecolorlwr  r  c                s   | t t  S )N)r   r   rv  )rB  )minlimr   r   rD  h  rE  z"plot_limits_hist.<locals>.<lambda>c             S   s   d|  S )Nz	$10^{%d}$r   )rB  r   r   r   rD  j  rE  r&   r   r   )r   r   g
ףp=
?g333333?)r   r   )r   r   r   r   r   r   r,   r   log10r   r   r   r"  r   histZsetpr   r   r   r   r   r  rv  rK  r  r  r   r   r   )'Zlimsr   r   Zprevlimsr
  r   r   r   r  r   r  r  rL  r&  ZlogprevlimsZhranger  ZhighbinsZlowbinsZ	stackdatar  r  Z	theselimsr   valZloglimsr  ZmaxlimsZminlimsr  r  Zifonamer	  ZpatchespatchZmaxlimr  ZtickvalsZtlsr   )r  r   plot_limits_hist  s    










 






r  
   i  c
             C   sT  dd l }
ddl m} |	s,dddddddd}	|
j|	 g }d	d
ddddd}d}d}xt|D ]\}}| | }t|dkr|| }n|}t|t|krd S |r|r|dkr|jddd}|d |d k	rV|d k	rV|| }|| }t|t|krVt|t|krVxBtt|D ]2}|j	|| || g|| || gdddd q W |d k	r|d k	rt|t|kr|r|r|t|d kr|j	||ddddddd |j	||dd|| || dd |j
d | d!d"d# |jd | d!d"d# ||d |d  |r*|rb|t|d krb|d$ |jd%d&d' || qbW |S )(Nr   )r   r   Tg      ?r   r   )r   ztext.usetexzaxes.linewidthz	axes.gridzgrid.linewidthzfont.familyz	font.sizer   r   r   r   r   r   )r   r   r   r   r   r   zFrequency (Hz)z$h_0$r	   )   g      @r   )r   r   r'   r1   Z	lightgrey)r   r  r   *r  gffffff?None)markermsrV  mfcmecr   )r  r  r  r  r   r&   r   r   )r   r   FgQ?g?)r   r   )r   r   r   r   r   r5   r   r   r   Zloglogr   r   r   r   r   )Zh0limsZf0gwr   ZxlimsZulesttopZulestbotZprevlimZprevlimf0gwr   r   r   r  r  r  rL  r&  r  r  Zh0limZf0sr  ZultZulbr   r   r   r   plot_h0_lims  sV    

$2& 
r  c             C   s  g }| }t jg td}t |d }t |d }	dd|d |d    |d  }
d|d  |d  }|
| }|| }|
|	 }||	 }d}x|| | k r|| ||   t|| |d	 |d
 |d |\}}t ||| ||  d|| ||    }|| | }|d }qW ||fS )N)ru  r   g      ?g      ?r  r   g      ?r   radecr   y              ?r	   )r   r2  r  r   r   r   antenna_response)	starttimedurationdtdetectorpardicttstmptsr   ZsphiZcphiZXplusZXcrossZXpsinphiZXcsinphiZXpcosphiZXccosphir   r5  fcr   r   r   heterodyned_triaxial_pulsar  s&     $,r     tA     @      N@c             C   s  d| kr&| d }t |}t |}ntdd| kr@| d }	ntdd| krZ| d }
nd| krr| d  d }
nd}
d	| kr| d	 }nd
| krd| d
  }nd}t|d }d| kr| d }nd}d| kr| d }nd}t|d }g }g }d| krd| krd| krddg}ndg}x|D ]}d}|d krJt||| |}t|| d | d | d |\}}|dkr|d  | | | | d|d  | | |  }n<|dkr|
d  | d|d   | d|
 | | |  }|	| |	| q&W ||fS )Nr  zcos(iota) not defined!r   zpsi not defined!rl   r   g       @g        phi22r   y              ?rm   phi21g      ?r   r  r  g      @)
r   acosr   KeyErrorcmathr~  r   aranger  r   )r  r  r  r  r  Z	datatimesr  r  siniotar   rl   r  ZePhi22rm   r  ZePhi21r   r  r  r?   r   r5  r  Zsfr   r   r   heterodyned_pulsar_signal  sV    








 
4
2
r  c             C   sF  | d }t |}t|}td| }t| d }t| d }td| d  }| d }| d }	| d }
|	|d || d   |
|d   }|	| | }dt|d |d   }|	| | }|	|d  |
 | }dt|d |d   }t d| t|| dt j }t |t|| dt j }||||d}|S )	Ncosthetag       @lambdar   rj   rk   r2   )rl   rm   r  r  )	r   arccosr   r   r   rB   r   r   r   )r  r  r   sintheta	sin2theta	sinlambda	coslambda
sin2lambdar   rj   rk   A22B22rl   A21B21rm   r  r  Zoutvalsr   r   r   convert_model_parametersE  s(    

$"r  c       "      C   s  t |d }t |d }t|}t|}td| }	t|d }
t|d }td|d  }td|d  d }t|d d }|d d	 |d
  }|d  | |d  }|d | }| d|d d	   }d| |d  }|d | | }|d |d	  |d  |	 }|d |
d	 |d	 |d d	    |d |d	   }|d | |d  }g }g }| }t jg td}t jg td}d}x|| | k rp|	| ||   |	| ||   t
|| |d |d |d |\}}t 	||| | |d|   || | |d|    }t 	||| | |d|   || | |d|    }|| | }|d }qW t ||g} t ||g}!| |!fS )Nr  r  g       @r  g      ?r   y              ?f0r2   r   g      ?rj   rk   )ru  r   r  r  r   r	   )r   r  r   r   r   r  r~  r2  r  r   r  vstack)"r  r  r  r  r  r  r   r  r  r  r  r  r  ZePhiZe2PhiZf2_rZXplusfZXcrossfZXplus2fZXcross2fr  r  r  r  Zts1Zts2r  s1s2r   r5  r  r  r   r   r   r   heterodyned_pinsf_pulsarl  sN    

"$r  c             C   sB  dd l }|j|j|j|j|j|j|j|j|j|j|j|jd}y|| }W n" t	k
rl   t	d
|Y nX |j| }|j}	t|tst|tryt|}W q   td
|Y qX ntdt|tst|tryt|}W n   td
|Y nX ntdt| ts&t| tr4t| g} n
t| } | d} t| d	ksntt| jd	kr|| d }
d
}t| d	kr| d	 | d  }||	||||
|t| \}}|jj|jjfS tt| }tt| }xLt t| D ]<}|| | }|!|}|"|	||||\||< ||< qW ||fS d S )Nr   )r   r   r   r   r   T1AL1AH1AV1ZE1ZE2ZE3z+ERROR. Key {} is not a valid detector name.z2Right ascension string '{}' not formatted properlyzSRight ascension must be a 'float' in radians or a string of the format 'hh:mm:ss.s'z.Declination string '{}' not formatted properlyzODeclination must be a 'float' in radians or a string of the format 'dd:mm:ss.s'Zfloat64r	   g        )#lalZLALDetectorIndexLHODIFFZLALDetectorIndexLLODIFFZLALDetectorIndexGEO600DIFFZLALDetectorIndexVIRGODIFFZLALDetectorIndexTAMA300DIFFZLALDetectorIndexE1DIFFZLALDetectorIndexE2DIFFZLALDetectorIndexE3DIFFr  formatZCachedDetectorsresponser   r6   r   r;   r-   r<   r   r   r2  copyr_  r5   r   r  sizeZLIGOTimeGPSZComputeDetAMResponseSeriesdatar  r   ZGreenwichMeanSiderealTimeZComputeDetAMResponse)ZgpsTimer  r  r   detr  ZdetMapr  Zdetvalr  ZgpsStartr  r5  r  r   ZgpsZgmst_radr   r   r   r    sf    





&
$r  g       @c          	   C   s~  t |tr|g}|d krlg }x|D ]D}x>|D ]6}	t||	|d  }
t|
d d|  }|| q,W q"W ng }d}xxt|D ]l\}}xb|D ]Z}	t|dkr|t|d d d|   n |t|| d d|   |d }qW q~W |}t|dkr*t|t|kr*td	t|t|t|dkrfdt| t|krftd	t|t|t
g }t
g }d}xt|D ]\}}t|dkr|d dkrt||| ||\}}|dkrt||}t||}nt||g}t||g}t|d || }nt|dkrt||| ||\}}d}xt|D ]\}}	|dkr|dkrt||| d d  }t||| d d  }n4t||| d d  g}t||| d d  g}t|| d d  |d| |  }|||  }qHW t|}|||  }qW t|}|d k	rB|dkrF|| }nd}| }d}x|D ]}t|dkrtjt|d d}x&t|d D ]\}}t|jdkr ||| j d||| j   ||< ||| j || || d   d||| j || || d     ||< n||| | j d||| | j   || |< ||| | j || || d   d||| | j || || d     || |< qW |d }qZt|dkrHtjt|d d d  d	}xTt|d d d  D ]:\}}||| | j d||| | j   || |< ||| | j || || d   d||| | j || || d     || |< |||d  | j d|||d  | j   ||d  |< |||d  | j ||d  || d   d|||d  | j ||d  || d
     ||d  |< qW |d }ntdtjd td qZW || }||||||fS )Nr  g       @r   r	   z:Number of detectors {} not the same as number of noises {}r2   z7Number of detectors {} not half the number of noises {}y              ?rw   r1   zSomething wrong with injection)r3   )r   r   detector_noiser   rB   r   r   r5   r-   r  r2  r  r  get_optimal_snrr  randomZrandnrf  realimagr7   r8   r9   r:   )r  r  r  Z	detectorsr  ZfreqfacZnpsdsZsnrscaler  ZfrfZpsdrc  Ztmpnpsdsr  r  tssssZsnrtotr  r   Zsnrtmpr   Zsnrtmp2Z
signalonlyr   rsr  r   r   r   inject_pulsar_signal  s    



"  $


"




$N0^"0X<,F
r  c             C   s   dd l }| dkr||S | dks*| dkr4||S | dkrJ||d S | dkr\||S | dkrn||S | d	kr||S | d
kr||S | dks| dkr||S td	| d S )Nr   r  r   r   r   g       @r   r   r  ZK1r  r  z{} is not a recognised detector)
lalsimulationZSimNoisePSDAdvVirgoZSimNoisePSDiLIGOSRDZSimNoisePSDGEOZSimNoisePSDVirgoZSimNoisePSDTAMAZSimNoisePSDKAGRAZ SimNoisePSDaLIGOZeroDetHighPowerr-   r  )r  r?   r  r   r   r   r    s$    






r  c             C   s<   d}x$| D ]}||j d  |jd  }q
W t||d  S )Nr   r2   )r  r  r   rB   )r   sigr  r  r   r   r   r    s    
r  c       	      C   sX   dd | D }dd | D }t |}t |}|| }t| }|||  }|| }|S )Nc             S   s   g | ]}t |qS r   )r   mean).0r  r   r   r   
<listcomp>  s    z!gelman_rubins.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   var)r  r  r   r   r   r    s    )r   r  r  r5   )	chainsZ
chainMeansZ	chainVarsZBoverNWZ	sigmaHat2r   ZVHatRr   r   r   gelman_rubins  s    

r  c          	   C   s  ddl m} g }g }i }g }x| D ]}tj|rt|}|d krFdS g }x>td|jd D ]*}	||d d |	f \}
}}|	|
 q\W |	t
t| tt
|jd t| }|	|d d |d d f  |	|jd  q"td| tjd dS q"W t| d d}| }| }tdd	|}td
d	|}tdd	|}|  xtt| D ]d\}}g }|dkrdx:tdt|D ](}	||	 }|d d |f }|	| qW t||| < qdW |dd}| d d }yt|d}W n$   tdtjd td Y nX || xr|D ]j}xbtd|jd D ]N}	||	d d f }t	|t |d }d!dd |D d }|| q>W q(W |  |"d}t|d}|#|}|  t$| |j%|d d d}d }|&dt'|d j(}|	| |)d ||||fS )Nr   )bayespputils)NNNNr	   zFile %s does not exist!)r3   r   rp  r&   radsz[()]ZlogL
z	post
z_common_tmp.datwz!Can't open common posterior file! c             s   s   | ]}t |V  qd S )N)str)r  rB  r   r   r   	<genexpr>	  s    z+pulsar_mcmc_to_posterior.<locals>.<genexpr>common)SimInspiralTableEntryZvotfiler  r  )*lalinferencer  ospathisfileread_pulsar_mcmc_filer   rf  ZeffectiveSampleSizer   r   rv  r   r  r   r  r7   r8   r9   r   readlineresubr   r   r4   r5   r  lowerr   r:   writer~  joinPEOutputParserparseremove	PosteriorPosteriorOneDPDFr   r   pop)Z
chainfilesbppuclZneffsr%  ZmcmccfileZ	mcmcChainZneffstmpr  ZneffZaclZacfZnskipcfheadersr  ZparvZlgrZachainZsinglechainZcomfileZnarrZmlineZstrmlinepeparserZcommonResultsObjr  ciposr   r   r   pulsar_mcmc_to_posterior  s|    









r	  c       
   
   C   s0  d }yt j| dd}W n   yt| d}| }| }|  tdd|}tdd|}tdd|}t| }t 	g }| 
 }xtt|D ]h\}}d|krq| }t||krqytt|}	W n   wY nX |dkrt 	|	}qt ||	f}qW |jdkrd }W n   d }Y nX Y nX |S )Nrp  )rq  r   r&   r  z[()]r   )r   r|  r   r  r   r  r  r5   r4   r2  r   r   rK  r6   r  r  )
r  Zcfdatar  r  Zlhlinesr   r   ZlvalsZlvalsfr   r   r   r  =	  sB    

r  c       &      C   s  ddl m} ddlm} tj| d  }|dks<|dkr|ryrddlm	} ddl m
} || |d	}|j}	x"|	D ]}
|||
||
 t qrW |j| tdt|	f}W q   td
Y qX n|d}|| }nJ|dkrddl}|d}||| d}n|d}|t| d}|j|dd}|j}t||d  j}t|}tj| d}d}x|D ]}|| j || jd t|| jkr|dkr|| jd }n|dkr|| jd t  }|!| n.d}|"||| j| }|!| |#| qtW d}d|jkr6|d j}|dk	rpd}|"dt$|}|#| |rp|!d d}d|jkr|d j}|dk	rd}|"dt%|}|#| |r|!d d}d|jkr|d j}d}d|jkr|d j}d}d|jkr|d j}|dk	r|dkrd}|"dd|d j }|#| |!d |dk	rd}|"dt&|d jt'j( dt'j( }|#| |!d d}d|jkr|d j}d|jkr|d jt  }|!d |"d|} |#|  d|jkr|d j}|dk	rH|dk	rHd|jkrHd}|"dt)|||}|#| |dks\|dkrt*+| d}!|!d d  }"|"j,d! }#|"j,d" }$|!-  n&t.| /dd#d$ }%|%d% }#|%d& }$||#|$fS )'a  
  This function will import a posterior sample file created by `lalapps_nest2pos` (or a nested
  sample file). It will be returned as a Posterior class object from `bayespputils`. The
  signal evidence and noise evidence are also returned.

  If there are samples in 'Q22' and not 'H0', and also a distance, or distance samples, then
  the Q22 samples will be converted into equivalent H0 values.

  Parameters
  ----------
  postfile : str, required
      The file name of the posterior or nested sample file. In general this should be a HDF5 file with the extension
      '.hdf' or '.h5', although older format ascii files are still supported at the moment.
  nestedsamples : bool, default: False
      If the file being input contains nested samples, rather than posterior samples, then this flag must be set to
      True
  removeuntrig : bool, default: True
      If this is True then any parameters that are sines or cosines of a value will have the value removed if present
      e.g. if cosiota and iota exist then iota will be removed.
  r   )r  )replace_columnr   z.h5z.hdf)read_samples)(LALInferenceHDF5NestedSamplesDatasetName)Z	tablenamezCould not import nested samplesZhdf5z.gzNr  r   )r  Zf0_fixedr   r  r  r   ZsiniZc21Zc22r  r   g       @r   r   r  r  Zlalinference_nestZlog_evidenceZlog_noise_evidencer&   z_B.txtr	   r2   )0r  r  Zlalinference.bayespputilsr  r  r  splitextr  Zlalinference.ior  r  Zcolnamesr_  r6   Zas_arrayviewreshaper5   IOErrorr  r  gzipr   r  namesr   r   r  r  shuffletolistr  r   r  r   r   r   r   r   r   r   r   h5pyFileattrsr   r|  r   )&ZpostfileZnestedsamplesZremoveuntrigr  r  Zfer  r  r   rZ  r   ZnsResultsObjectr  r  r  pnamesZnsampsZpermarrZposdistZposfreqspnameZshufposZposIotar  ZposIZsiniposZposC21ZposC22Zposphi22Zh0posZphi0posZposQ22ZdistposZhdfr[  sigevZnoiseevBr   r   r   pulsar_nest_to_posteriorv	  s    
$





.
















&





 



r  c             C   s   t | |S )N)r   Z	logaddexp)rB  r{  r   r   r   logplus&
  s    r  c             C   s2   t |d tt| dd t| dd g S )aL  
  Perform trapezium rule integration for the logarithm of a function on a regular grid.

  Inputs
  ------
  lnf - a numpy array of values that are the natural logarithm of a function
  dx  - a float giving the step size between values in the function

  Returns
  -------
  The natural logarithm of the area under the function.
  g       @Nr   r	   )r   r}  r   )ZlnfrM  r   r   r   logtrapz*
  s    r  c       
      C   s   || }| |}t|dkr<tt|| |d |d  }nNt|dkr| j}tdt|t|k}t	t
t|| }	t| |	}||= || |S )Nr	   r   )indexr5   r   Zapply_along_axisr  rf  r  r_  r   tupler2  r!  r  r  )
liker  r  rangesZplacesr.  rB  zqZnewshaper   r   r   marginalise<
  s    

r&  c       
   	   C   s   ddl m} || }||}||}xX|D ]P}	|	|kr*|rlt|td||	 d ||	 d    |	||}q*t||	||}q*W |S )Nr   )deepcopyg      ?r   )r  r'  r&  r   r}  )
Zlnliker  r  r#  multflatpriorr'  Z	lnliketmpZ	pnamestmpZ	rangestmpnamer   r   r   marginalW
  s    
2r*  c       
      C   s   d } }}t | }g }tt| }xn|d7 }||d krJ|| P |d7 }| |d  }| | }	|	| d| ks~||kr*|| d}|d7 }q*W |S )Nr   r	   r2   g       @)r5   r   r"  r  r   )
r  ZchunkMaxr   r  r  lengthZchunkLengthsr  t1t2r   r   r   get_chunk_lengthsj
  s"    

r.    c             C   sR  d}|| }t || }|| }	d}
d}|dkrt ||| |}t|| d | d | d |\}}t |t |d  }
t |t |d  }t || |krt ||t |  |	|}t|| d | d | d |\}}|
t |d 7 }
|t |d 7 }| d d | | |
d	d| d
 d   d  || d
 d    }t |S )a  
  A function to estimate the signal-to-noise ratio of a pulsar signal (for a triaxial neutron
  star emitting at twice the rotation frequency from the l=m=2 quadrupole mode) in a given
  detector over a given time range, for a given one-sided power spectral density.

  Inputs
  ------
      source - a dictionary containing 'h0', 'cosiota', 'psi', 'ra' (rads or string), 'dec' (rads or string)
         det - the detector, e.g. 'H1'
      tstart - a GPS start time
    duration - a signal duration (seconds)
          Sn - a one-sided power spectral density
          dt - timestep for antenna response calculation [default: 1800s]

  Returns
  -------
  rho        - an estimate of the optimal matched filter SNR
  g rA	@r   r	   r  r  r   r2   r   g      ?r  )r   rv  r  r  sumrB   )sourcer  tstartr  Snr  siddayNdaysNsampstendsFpsFcttsFpFcZsnr2r   r   r   pulsar_estimate_snr
  s$      @r=  X  c             C   sN  d}|| }t || }	|| }
d}d}|dkrt ||| |}t||d |d |d |\}}t |t |d  }t |t |d  }t || |krt ||t |  |
|}t||d |d |d |\}}|t |d 7 }|t |d 7 }| d | ||dd|d	 d   d  ||d	 d     }t |S )
a7  
  A function to estimate the signal amplitude of a pulsar signal (for a triaxial neutron star emitting at twice
  the rotation frequency from the l=m=2 quadrupole mode) for a given SNR in a particular detector over
  a given time range, for a given one-sided power spectral density.

  Inputs
  ------
         snr - the optimal matched filter signal-to-noise ratio
      source - a dictionary containing 'cosiota', 'psi', 'ra' (rads or string), 'dec' (rads or string)
         det - the detector, e.g. 'H1'
      tstart - a GPS start time for the signal
    duration - a signal duration (seconds)
          Sn - a one-sided power spectral density
          dt - timestep for antenna response calculation [default: 600s]

  Returns
  -------
  h0         - an estimate of signal amplitude required to give the input SNR
  g rA	@r   r	   r  r  r   r2   g      ?r  )r   rv  r  r  r0  rB   )Zsnrr1  r  r2  r  r3  r  r4  r5  r6  r7  r8  r9  r:  r;  r<  Zh02r   r   r   pulsar_estimate_h0_from_snr
  s$      <r?     r-  c       O         s\  ddl ddl}ddlm} |dkr*d}nd}t| ts\t| trJ| g} ntd|jd dS dd	d
dddg}x| D ]}||krtdd	| d |jd dS |krtd| |jd dS | krtd| |jd dS |dkr||krtd| |jd dS t
| t
 | kr0td| |jd |dkrrt
| t
|| krrtd| |jd qrW ddddg}i }dj|	f|d< djd |	f|d< dd|	f|d< dd fdd D  d fd!dD   |	f|d< i }d"}x|D ]}||krzt
|| d#kr.|| ||< nJ|| d$ || d k sZ|| d% d$k rtd&| |jd || ||< n|| ||< || d || d$ || d% ||< ||| d% f7 }q W j|d |d |d |d d'd(\}}}}d)d|d%   }|}d| }d| }d| }d| }d)| | }d)| | } d)| | }!d)| | }"d)| | | | }#|d% }$|d% }%d| | | | }&|d% }'|d% }(|| })|d% }*|d% }+|d% },|}-d}.d}/x0|D ](}0|/||0 d$ ||0 d  8 }/qW x| D ]}|dkr>|| }1nt
| }1t| ||d|\}2}3|r|dkrt| |}4nt
| g}4d}5x|4D ]}6|5|6 }7|6|k rĐq | |5|7 |1|5|7  }8|2|5|7 |1|5|7  }9|3|5|7 |1|5|7  }:|9d% };|:d% }<|9|:}=|8j|9}>|8j|9}?|8j|:}@|8j|:}A|8jd% }B|8jd% }C|;|* |<|+  d|= |)  }D|<|* |;|+  d|= |)  }E|=|*|+  |;|)  |<|)  }F|!d% |D | d% |E  |#|F  }G|d% |D |"d% |E  |#|F  }H|!|>| |@|   | |@| |>|    }I||?| |A|   |"|A| |?|    }J|B|C |,|G|H   d| |I|J   }K|dkr(|-d)|K 8 }-|-|6dj  d|1|5|7   8 }-|.d)|B|C  8 }.|.|6dj  d|1|5|7   8 }.n||-t|6|K 8 }-|-||6d |6j  7 }-|.t|6|B|C  8 }.|.||6d |6j  7 }.|5|67 }5qW q$W |-|/7 }-t|-d*||}L|
s|-|L8 }-n|-|/8 }-i }MxD|D ]<}0|
st|-|0|||M|0< nt|-|0||d+d,|M|0< qW |L|. }N|-|Md |Md |Md |Md ||L|.fS )-a  
  A function to calculate the 4-parameter posterior probability density for a continuous wave signal
  given a set of processed data from a set of detectors.

  Inputs
  ------
         dets - a list of strings containing the detectors being used in the likelihood calculation
           ts - a dictionary of 1d numpy arrays containing the GPS times of the data for each detector
         data - a dictionary of 1d numpy arrays containing the complex data values for each detector
           ra - the right ascension (in rads) of the source
          dec - the declination (in rads) of the source
       sigmas - a dictionary of 1d numpy arrays containing the times series of standard deviation
                values for each detector. If this is not given a Student's t likelihood will be used,
                but if it is given a Gaussian likelihood will be used (default: None)
  paramranges - a dictionary of tuples for each parameter ('h0', 'phi0', 'psi' and 'cosiota') giving
                the lower and upper ranges of the parameter grid and the number of grid points. If not
                given then defaults will be used.
   datachunks - in the calculation split the data into stationary chunks with a maximum length given
                by this value. If set to 0 or inf then the data will not be split. (default: 30)
     chunkmin - this is the shortest chunk length allowed to be included in the likelihood calculation
                (default: 5)
        ngrid - the number of grid points to use for each dimension of the likelihood calculation. This
                is used if the values are not specified in the paramranges argument (default: 50)
   outputlike - output the log likelihoods rather than posteriors (default: False)

  Returns
  -------
  L           - The 4d posterior (or likelihood) over all parameters
  h0pdf       - The 1d marginal posterior for h0
  phi0pdf     - The 1d marginal posterior for phi0 (the rotation frequency, not GW frequency)
  psipdf      - The 1d marginal posterior for psi
  cosiotapdf  - The 1d marginal posterior for cosiota
  lingrids    - A dictionary of the grid points for each parameter
  sigev       - The log evidence for the signal model
  noiseev     - The log evidence for the noise model

  An example would be:
  # set the detectors
  dets = ['H1', 'L1']

  # set the time series and data
  ts = {}
  data = {}
  for det in dets:
    ts[det] = np.arange(900000000., 921000843., 60.)
    data[det] = np.random.randn(len(ts[det])) + 1j*np.random.randn(len(ts[det]))

  # set the parameter ranges
  ra = 0.2
  dec = -0.8
  paramranges = {}
  paramranges['h0'] = (0., 2., 50)
  paramranges['psi'] = (0., np.pi/2., 50)
  paramranges['phi0'] = (0., np.pi, 50)
  paramranges['cosiota'] = (-1., 1., 50)

  L, h0pdf, phi0pdf, psipdf, cosiotapdf, grid, sigev, noiseev = pulsar_posterior_grid(dets, ts, data, ra, dec,
                                                                                      paramranges=paramranges)
  r   N)gammalnZ	studentstZgaussianz!Detector not, or incorrectly, set)r3   r   r   r   r   r  r   z+Detector not in list of allowed detectors (,)z$No time stamps given for detector %sz)No data time series given for detector %sz*No sigma time series given for detector %szCLength of times stamps array and data array are inconsistent for %szDLength of times stamps array and sigma array are inconsistent for %sr   r   r   r  g        g       @g      g      ?c                s   g | ]}  | qS r   )Zstd)r  Zdv)r  r   r   r   r  r  s    z)pulsar_posterior_grid.<locals>.<listcomp>g     @c                s   g | ]}t  | qS r   )r5   )r  Zdtx)r  r   r   r  s  s    r   r1   r	   r2   z4Parameter ranges wrong for %s, reverting to defaultsZij)Zindexingg      ?allT)r(  )numpyr8   scipy.specialrA  r   r!  r   r7   r9   r  r5   r   r   rB   r3  Zmeshgridr   r   r  r}  re  r  isfiniter.  r0  dotr  r  r6   r*  r~  )OZdetsr  r  r  r  sigmasZparamrangesZ
datachunksZchunkminZngridZ
outputliker8   rA  ZliketypeZalloweddetsr  rZ  ZdefaultrangesZlingridsZ
shapetupler   ZH0SZPHI0SZPSISZCOSISZAPLUSZACROSSZSINPHIZCOSPHIZSIN2PSIZCOS2PSIZ
Apsinphi_2Z
Acsinphi_2Z
Apcosphi_2Z
Accosphi_2ZAcpsphicphi_2ZAP2ZAC2ZTWOAPACSPCPZSP2ZCP2ZC2PS2PZC2P2ZS2P2ZH02r"  Z	noiselikeZlogpriorr=   ZnstdZAsZBsZchunklengthsZstartidxr  ZendidxZthisdataastbstAr  ZABZdA1realZdA1imagZdB1realZdB1imagZdd1realZdd1imagr   ZP2ZP3Zhr2Zhi2Zd1hrZd1hiZchiSqr  ZpostsZevratr   )r  r   r  r   pulsar_posterior_grid
  s   ?




,

,*

(


  (($
46&&

rM  z1.58c             C   s"  ddl }tdd| }dt }|d7 }|d| 7 }|d7 }|d	7 }y4||}td
t|j}|d	 
d}W n   tdtjd dS d}d}d}	xxdd |D D ]f}
d|
ksd|
krdS |

 }d|d krt|d }d|d k rt|d }d|d kr|d }	qW |||	|fS )z
  Get the pulsar (psr) distance (DIST in kpc), proper motion corrected period derivative (P1_I) and any association
  (ASSOC e.g. GC) from the ATNF catalogue.
  r   Nz\+z%2BzDhttp://www.atnf.csiro.au/people/pulsar/psrcat/proc_form.php?version=z &Dist=Dist&Assoc=Assoc&P1_i=P1_izn&startUserDefined=true&c1_val=&c2_val=&c3_val=&c4_val=&sort_attr=jname&sort_order=asc&condition=&pulsar_names=ze&ephemeris=selected&submit_ephemeris=Get+Ephemeris&coords_unit=raj%2Fdecj&radius=&coords_1=&coords_2=zn&style=Long+with+last+digit+error&no_value=*&fsize=3&x_axis=&x_scale=linear&y_axis=&y_scale=linear&state=queryz<pre[^>]*>([^<]+)</pre>r	   z\nz@Warning... could not get information from ATNF pulsar catalogue.)r3   c             S   s   g | ]}t |d kr|qS )r   )r5   )r  r=   r   r   r   r  %  s    z!get_atnf_info.<locals>.<listcomp>WARNINGznot in cataloguer^   ZP1_IZASSOC)requestsr  r  ATNF_VERSIONgetsearchr  contentgroupr   r4   r7   r8   r9   r6   )ZpsrrO  ZpsrnameZatnfurlZurldatZpredatZpdatr   Zp1_Iassocr   r  Zager   r   r   get_atnf_info	  s8    
rV  c             C   sL   t t | }|t | jd  }t j|}t t || |}||fS )z
  Convert a covariance matrix to a correlation coefficient matrix.
  Return the correlation coefficient matrix and the standard deviations
  from the covariance matrix.
  r   )r   rB   Zdiagidentityrf  ZlinalginvrH  )ZcovrI  DZDinvZCcorr   r   r   
cov_to_cor3  s
    rZ  )N)NN)r  r   )Nr   F)TF)r  )rd  )rl  TFNF)Nr  FF)r  r  r  N)FT)F)r/  )r>  )i
__future__r   r   r8   r   r  r  rE  r   r0  r  r  Zscipy.integrater   Zscipy.interpolater   rF  r   ImportErrorZ
scipy.miscsixr   r6   r   ZRADTOARCSECr#   ZRADTOSECr
   ZDEGTORADr    ZHRSTORADZPIr   ZPIBYTWOr   ZSECPERJULYRZKMPERPCZKMPERKPCZTsunZMsunZMjupZRsunZRearthZSOLr   r   r   r   r   r   r   r   r"   r%   r)   r/   r;   r<   rA   rC   r   r   rt   r   r   r   r   r   r   r  r  r  r*  r;  rO  rQ  r]  r   rk  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r  r&  r*  r.  r=  r?  rM  rP  rV  rZ  r   r   r   r   <module>   s   

 `5)s~0 h~G C  I/H'IS t9 1"67  *