|
| 1 | +# =============================================================================# |
| 2 | +# MODEL DEFINITION FILE # |
| 3 | +# =============================================================================# |
| 4 | +import bilby |
| 5 | +import numpy as np |
| 6 | +from bilby.core.prior import Constraint, PriorDict |
| 7 | + |
| 8 | + |
| 9 | +# -----------------------------------------------------------------------------# |
| 10 | +# Function defining the model. # |
| 11 | +# # |
| 12 | +# pDict = Dictionary of parameters, created by parsing inParms, below. # |
| 13 | +# lamSqArr_m2 = Array of lambda-squared values # |
| 14 | +# quArr = Complex array containing the Re and Im spectra. # |
| 15 | +# -----------------------------------------------------------------------------# |
| 16 | +def model(pDict, lamSqArr_m2): |
| 17 | + """ |
| 18 | +
|
| 19 | + Three separate Faraday thin sources |
| 20 | + Averaged within the same telescope beam (i.e., unresolved) |
| 21 | +
|
| 22 | + Ref (for individual source component): |
| 23 | + Sokoloff et al. (1998) Eq 2 |
| 24 | + O'Sullivan et al. (2012) Eq 8 |
| 25 | + Ma et al. (2019a) Eq 10 |
| 26 | +
|
| 27 | + """ |
| 28 | + |
| 29 | + # Calculate the complex fractional q and u spectra |
| 30 | + # fmt: off |
| 31 | + pArr1 = pDict["fracPol1"] * np.ones_like(lamSqArr_m2) |
| 32 | + pArr2 = pDict["fracPol2"] * np.ones_like(lamSqArr_m2) |
| 33 | + pArr3 = pDict["fracPol3"] * np.ones_like(lamSqArr_m2) |
| 34 | + quArr1 = pArr1 * np.exp( 2j * (np.radians(pDict["psi01_deg"]) + |
| 35 | + pDict["RM1_radm2"] * lamSqArr_m2)) |
| 36 | + quArr2 = pArr2 * np.exp( 2j * (np.radians(pDict["psi02_deg"]) + |
| 37 | + pDict["RM2_radm2"] * lamSqArr_m2)) |
| 38 | + quArr3 = pArr3 * np.exp( 2j * (np.radians(pDict["psi03_deg"]) + |
| 39 | + pDict["RM3_radm2"] * lamSqArr_m2)) |
| 40 | + quArr = (quArr1 + quArr2 + quArr3) |
| 41 | + # fmt: on |
| 42 | + |
| 43 | + return quArr |
| 44 | + |
| 45 | + |
| 46 | +# -----------------------------------------------------------------------------# |
| 47 | +# Priors for the above model. # |
| 48 | +# See https://lscsoft.docs.ligo.org/bilby/prior.html for details. # |
| 49 | +# # |
| 50 | +# -----------------------------------------------------------------------------# |
| 51 | +def converter(parameters): |
| 52 | + """ |
| 53 | + Function to convert between sampled parameters and constraint parameter. |
| 54 | +
|
| 55 | + Parameters |
| 56 | + ---------- |
| 57 | + parameters: dict |
| 58 | + Dictionary containing sampled parameter values, 'RM1_radm2', 'RM2_radm2', |
| 59 | + 'RM3_radm2', 'fracPol1', 'fracPol2', 'fracPol3' |
| 60 | +
|
| 61 | + Returns |
| 62 | + ------- |
| 63 | + dict: Dictionary with constraint parameter 'delta_RM1_RM2_radm2' and 'sum_p1_p2_p3' added. |
| 64 | + """ |
| 65 | + converted_parameters = parameters.copy() |
| 66 | + converted_parameters["delta_RM1_RM2_radm2"] = ( |
| 67 | + parameters["RM1_radm2"] - parameters["RM2_radm2"] |
| 68 | + ) |
| 69 | + converted_parameters["delta_RM2_RM3_radm2"] = ( |
| 70 | + parameters["RM2_radm2"] - parameters["RM3_radm2"] |
| 71 | + ) |
| 72 | + converted_parameters["sum_p1_p2_p3"] = ( |
| 73 | + parameters["fracPol1"] + parameters["fracPol2"] + parameters["fracPol3"] |
| 74 | + ) |
| 75 | + return converted_parameters |
| 76 | + |
| 77 | + |
| 78 | +priors = PriorDict(conversion_function=converter) |
| 79 | + |
| 80 | +priors["fracPol1"] = bilby.prior.Uniform( |
| 81 | + minimum=0.0, |
| 82 | + maximum=1.0, |
| 83 | + name="fracPol1", |
| 84 | + latex_label="$p_1$", |
| 85 | +) |
| 86 | +priors["fracPol2"] = bilby.prior.Uniform( |
| 87 | + minimum=0.0, |
| 88 | + maximum=1.0, |
| 89 | + name="fracPol2", |
| 90 | + latex_label="$p_2$", |
| 91 | +) |
| 92 | +priors["fracPol3"] = bilby.prior.Uniform( |
| 93 | + minimum=0.0, |
| 94 | + maximum=1.0, |
| 95 | + name="fracPol3", |
| 96 | + latex_label="$p_3$", |
| 97 | +) |
| 98 | + |
| 99 | +priors["psi01_deg"] = bilby.prior.Uniform( |
| 100 | + minimum=0, |
| 101 | + maximum=180.0, |
| 102 | + name="psi01_deg", |
| 103 | + latex_label="$\psi_{0,1}$ (deg)", |
| 104 | + boundary="periodic", |
| 105 | +) |
| 106 | +priors["psi02_deg"] = bilby.prior.Uniform( |
| 107 | + minimum=0, |
| 108 | + maximum=180.0, |
| 109 | + name="psi02_deg", |
| 110 | + latex_label="$\psi_{0,2}$ (deg)", |
| 111 | + boundary="periodic", |
| 112 | +) |
| 113 | +priors["psi03_deg"] = bilby.prior.Uniform( |
| 114 | + minimum=0, |
| 115 | + maximum=180.0, |
| 116 | + name="psi03_deg", |
| 117 | + latex_label="$\psi_{0,3}$ (deg)", |
| 118 | + boundary="periodic", |
| 119 | +) |
| 120 | + |
| 121 | +priors["RM1_radm2"] = bilby.prior.Uniform( |
| 122 | + minimum=-1100.0, |
| 123 | + maximum=1100.0, |
| 124 | + name="RM1_radm2", |
| 125 | + latex_label="$\phi_1$ (rad m$^{-2}$)", |
| 126 | +) |
| 127 | +priors["RM2_radm2"] = bilby.prior.Uniform( |
| 128 | + minimum=-1100.0, |
| 129 | + maximum=1100.0, |
| 130 | + name="RM2_radm2", |
| 131 | + latex_label="$\phi_2$ (rad m$^{-2}$)", |
| 132 | +) |
| 133 | +priors["RM3_radm2"] = bilby.prior.Uniform( |
| 134 | + minimum=-1100.0, |
| 135 | + maximum=1100.0, |
| 136 | + name="RM3_radm2", |
| 137 | + latex_label="$\phi_3$ (rad m$^{-2}$)", |
| 138 | +) |
| 139 | +priors["delta_RM1_RM2_radm2"] = Constraint( |
| 140 | + minimum=0, |
| 141 | + maximum=2200.0, |
| 142 | + name="delta_RM1_RM2_radm2", |
| 143 | + latex_label="$\Delta\phi_{1,2}$ (rad m$^{-2}$)", |
| 144 | +) |
| 145 | +priors["delta_RM2_RM3_radm2"] = Constraint( |
| 146 | + minimum=0, |
| 147 | + maximum=2200.0, |
| 148 | + name="delta_RM2_RM3_radm2", |
| 149 | + latex_label="$\Delta\phi_{1,2}$ (rad m$^{-2}$)", |
| 150 | +) |
| 151 | +priors["sum_p1_p2_p3"] = Constraint( |
| 152 | + minimum=0.0, |
| 153 | + maximum=1, |
| 154 | + name="sum_p1_p2_p3", |
| 155 | + latex_label="$p_1+p_2+p_3$)", |
| 156 | +) |
0 commit comments