|
| 1 | +import pathlib |
| 2 | + |
| 3 | +import numpy as np |
| 4 | + |
| 5 | +import RATapi as RAT |
| 6 | + |
| 7 | + |
| 8 | +def DSPC_data_background(): |
| 9 | + """Standard Layers fit of a DSPC floating bilayer""" |
| 10 | + problem = RAT.Project(name="original_dspc_bilayer", model="standard layers", geometry="substrate/liquid") |
| 11 | + |
| 12 | + # Set up the relevant parameters |
| 13 | + problem.parameters.append(name="Oxide Thickness", min=5.0, value=19.54, max=60.0, fit=True) |
| 14 | + problem.parameters.append(name="Oxide SLD", min=3.39e-06, value=3.39e-06, max=3.41e-06, fit=False) |
| 15 | + problem.parameters.append(name="SAM Tails Thickness", min=15.0, value=22.66, max=35.0, fit=True) |
| 16 | + problem.parameters.append(name="SAM Tails SLD", min=-5e-07, value=-4.01e-07, max=-3e-07, fit=False) |
| 17 | + problem.parameters.append(name="SAM Tails Hydration", min=1.0, value=5.252, max=50.0, fit=True) |
| 18 | + problem.parameters.append(name="SAM Roughness", min=1.0, value=5.64, max=15.0, fit=True) |
| 19 | + problem.parameters.append(name="CW Thickness", min=10.0, value=17.12, max=28.0, fit=True) |
| 20 | + problem.parameters.append(name="CW SLD", min=0.0, value=0.0, max=1e-09, fit=False) |
| 21 | + |
| 22 | + problem.parameters.append( |
| 23 | + name="SAM Heads Thickness", |
| 24 | + min=5.0, |
| 25 | + value=8.56, |
| 26 | + max=17.0, |
| 27 | + fit=True, |
| 28 | + prior_type="gaussian", |
| 29 | + mu=10.0, |
| 30 | + sigma=2.0, |
| 31 | + ) |
| 32 | + problem.parameters.append(name="SAM Heads SLD", min=1.0e-07, value=1.75e-06, max=2.0e-06, fit=False) |
| 33 | + problem.parameters.append( |
| 34 | + name="SAM Heads Hydration", |
| 35 | + min=10.0, |
| 36 | + value=45.45, |
| 37 | + max=50.0, |
| 38 | + fit=True, |
| 39 | + prior_type="gaussian", |
| 40 | + mu=30.0, |
| 41 | + sigma=3.0, |
| 42 | + ) |
| 43 | + problem.parameters.append( |
| 44 | + name="Bilayer Heads Thickness", |
| 45 | + min=7.0, |
| 46 | + value=10.7, |
| 47 | + max=17.0, |
| 48 | + fit=True, |
| 49 | + prior_type="gaussian", |
| 50 | + mu=10.0, |
| 51 | + sigma=2.0, |
| 52 | + ) |
| 53 | + problem.parameters.append(name="Bilayer Heads SLD", min=5.0e-07, value=1.47e-06, max=1.5e-06, fit=False) |
| 54 | + problem.parameters.append(name="Bilayer Roughness", min=2.0, value=6.014, max=15.0, fit=True) |
| 55 | + problem.parameters.append(name="Bilayer Tails Thickness", min=14.0, value=17.82, max=22.0, fit=True) |
| 56 | + problem.parameters.append(name="Bilayer Tails SLD", min=-5.0e-07, value=-4.61e-07, max=0.0, fit=False) |
| 57 | + problem.parameters.append(name="Bilayer Tails Hydration", min=10.0, value=17.64, max=50.0, fit=True) |
| 58 | + problem.parameters.append(name="Bilayer Heads Hydration", min=10.0, value=36.15, max=50.0, fit=True) |
| 59 | + problem.parameters.append(name="CW Hydration", min=99.9, value=100.0, max=100.0, fit=False) |
| 60 | + problem.parameters.append(name="Oxide Hydration", min=0.0, value=23.61, max=60.0, fit=True) |
| 61 | + |
| 62 | + problem.parameters.set_fields(0, max=10) |
| 63 | + |
| 64 | + # Group these into layers |
| 65 | + problem.layers.append( |
| 66 | + name="Oxide", |
| 67 | + thickness="Oxide Thickness", |
| 68 | + SLD="Oxide SLD", |
| 69 | + roughness="Substrate Roughness", |
| 70 | + hydration="Oxide Hydration", |
| 71 | + hydrate_with="bulk out", |
| 72 | + ) |
| 73 | + |
| 74 | + problem.layers.append( |
| 75 | + name="SAM Tails", |
| 76 | + thickness="SAM Tails Thickness", |
| 77 | + SLD="SAM Tails SLD", |
| 78 | + roughness="SAM Roughness", |
| 79 | + hydration="SAM Tails Hydration", |
| 80 | + hydrate_with="bulk out", |
| 81 | + ) |
| 82 | + |
| 83 | + problem.layers.append( |
| 84 | + name="SAM Heads", |
| 85 | + thickness="SAM Heads Thickness", |
| 86 | + SLD="SAM Heads SLD", |
| 87 | + roughness="SAM Roughness", |
| 88 | + hydration="SAM Heads Hydration", |
| 89 | + hydrate_with="bulk out", |
| 90 | + ) |
| 91 | + |
| 92 | + problem.layers.append( |
| 93 | + name="Central Water", |
| 94 | + thickness="CW Thickness", |
| 95 | + SLD="CW SLD", |
| 96 | + roughness="Bilayer Roughness", |
| 97 | + hydration="CW Hydration", |
| 98 | + hydrate_with="bulk out", |
| 99 | + ) |
| 100 | + |
| 101 | + problem.layers.append( |
| 102 | + name="Bilayer Heads", |
| 103 | + thickness="Bilayer Heads Thickness", |
| 104 | + SLD="Bilayer Heads SLD", |
| 105 | + roughness="Bilayer Roughness", |
| 106 | + hydration="Bilayer Heads Hydration", |
| 107 | + hydrate_with="bulk out", |
| 108 | + ) |
| 109 | + |
| 110 | + problem.layers.append( |
| 111 | + name="Bilayer Tails", |
| 112 | + thickness="Bilayer Tails Thickness", |
| 113 | + SLD="Bilayer Tails SLD", |
| 114 | + roughness="Bilayer Roughness", |
| 115 | + hydration="Bilayer Tails Hydration", |
| 116 | + hydrate_with="bulk out", |
| 117 | + ) |
| 118 | + |
| 119 | + # Make the bulk SLDs |
| 120 | + del problem.bulk_in[0] |
| 121 | + problem.bulk_in.append(name="Silicon", min=2.0e-06, value=2.073e-06, max=2.1e-06, fit=False) |
| 122 | + |
| 123 | + del problem.bulk_out[0] |
| 124 | + problem.bulk_out.append(name="D2O", min=5.50e-06, value=5.98e-06, max=6.4e-06, fit=True) |
| 125 | + problem.bulk_out.append(name="SMW", min=1.0e-06, value=2.21e-06, max=4.99e-06, fit=True) |
| 126 | + |
| 127 | + # Set the scalefactors - use one for each contrast |
| 128 | + del problem.scalefactors[0] |
| 129 | + problem.scalefactors.append(name="Scalefactor 1", min=0.05, value=0.10, max=0.2, fit=False) |
| 130 | + problem.scalefactors.append(name="Scalefactor 2", min=0.05, value=0.15, max=0.2, fit=False) |
| 131 | + |
| 132 | + # Now deal with the backgrounds |
| 133 | + # SMW has a constant background |
| 134 | + del problem.backgrounds[0] |
| 135 | + del problem.background_parameters[0] |
| 136 | + problem.background_parameters.append( |
| 137 | + name="Background parameter SMW", |
| 138 | + min=1.0e-10, |
| 139 | + value=3.38e-06, |
| 140 | + max=4.99e-06, |
| 141 | + fit=True, |
| 142 | + ) |
| 143 | + problem.backgrounds.append(name="SMW Background", type="constant", source="Background parameter SMW") |
| 144 | + |
| 145 | + data_path = pathlib.Path(__file__).parents[1] / "data" |
| 146 | + |
| 147 | + # load in background data for D2O |
| 148 | + d2o_background = np.loadtxt(data_path / "d2o_background_data.dat") |
| 149 | + problem.data.append(name="D2O Background Data", data=d2o_background) |
| 150 | + |
| 151 | + # add background parameter for the offset |
| 152 | + problem.background_parameters.append( |
| 153 | + name="D2O Data Offset", |
| 154 | + min=-1e-8, |
| 155 | + value=0, |
| 156 | + max=1e-8, |
| 157 | + fit=True, |
| 158 | + ) |
| 159 | + |
| 160 | + # add the background with data and offset |
| 161 | + problem.backgrounds.append( |
| 162 | + name="D2O Data Background", |
| 163 | + type="data", |
| 164 | + source="D2O Background Data", |
| 165 | + value_1="D2O Data Offset", |
| 166 | + ) |
| 167 | + |
| 168 | + # Now add the data |
| 169 | + d2o_dat = np.loadtxt(data_path / "DSPC_D2O.dat", delimiter=",") |
| 170 | + problem.data.append(name="dspc_bil_D2O", data=d2o_dat) |
| 171 | + |
| 172 | + smw_dat = np.loadtxt(data_path / "DSPC_SMW.dat", delimiter=",") |
| 173 | + problem.data.append(name="dspc_bil_smw", data=smw_dat) |
| 174 | + |
| 175 | + # Set the model |
| 176 | + stack = [ |
| 177 | + "Oxide", |
| 178 | + "SAM Tails", |
| 179 | + "SAM Heads", |
| 180 | + "Central Water", |
| 181 | + "Bilayer Heads", |
| 182 | + "Bilayer Tails", |
| 183 | + "Bilayer Tails", |
| 184 | + "Bilayer Heads", |
| 185 | + ] |
| 186 | + |
| 187 | + # Then make the two contrasts |
| 188 | + problem.contrasts.append( |
| 189 | + name="D2O", |
| 190 | + bulk_in="Silicon", |
| 191 | + bulk_out="D2O", |
| 192 | + background="D2O Data Background", |
| 193 | + resolution="Resolution 1", |
| 194 | + scalefactor="Scalefactor 1", |
| 195 | + data="dspc_bil_D2O", |
| 196 | + model=stack, |
| 197 | + ) |
| 198 | + |
| 199 | + problem.contrasts.append( |
| 200 | + name="SMW", |
| 201 | + bulk_in="Silicon", |
| 202 | + bulk_out="SMW", |
| 203 | + background="SMW Background", |
| 204 | + resolution="Resolution 1", |
| 205 | + scalefactor="Scalefactor 2", |
| 206 | + data="dspc_bil_smw", |
| 207 | + model=stack, |
| 208 | + ) |
| 209 | + |
| 210 | + controls = RAT.Controls() |
| 211 | + problem, results = RAT.run(problem, controls) |
| 212 | + |
| 213 | + return problem, results |
| 214 | + |
| 215 | + |
| 216 | +if __name__ == "__main__": |
| 217 | + problem, results = DSPC_data_background() |
| 218 | + RAT.plotting.plot_ref_sld(problem, results, True) |
0 commit comments