e nx_sol en
Oc obe 9, 2025
1 F127 a he ai -wa e in e ace analysis using e nx
This no ebook p o ides a demons a ion on how he neu on e lec i i y da a was modelled and
op imised using e nx. Example shown he e ela es o 2 w % F127 adso bed a he ai -wa e
in e ace a 22 ˚C. The e nx package used he e is eadily a ailable on he e nx Gi Hub eposi o y
a h ps://gi hub.com/ e nx/ e nx. The e nx wheels a e also a ailable on PyPI p ebuil e sion
on conda- o ge.
[1]: impo pickle
impo numpy as np
impo ma plo lib.pyplo as pl
pl . cPa ams[" igu e. igsize"]=(6,3)
%ma plo lib inline
om scipy.s a s impo no m, uncno m
impo sys
om e nx. e lec impo SLD, Slab, Re lec Model, MixedRe lec Model
om e nx.da ase impo Re lec Da ase as RD
om e nx.analysis impo Objec i e, Cu eFi e , PDF, Pa ame e ,␣
↪p ocess_chain, load_chain, T ans o m
[2]: # Ve sion numbe s allow you o epea he analysis on you compu e and ob ain␣
↪iden ical esul s.
impo e nx,scipy
e nx.__ e sion__, np. e sion. e sion, scipy. e sion. e sion
[2]: ('0.1.29', '1.26.4', '1.13.1')
1.1 Ti le he da a we’ e i ing
[3]: i _name ="F127_2w _22C"
1.2 C ea ing a sol a ed model
Le ’s load in he da a:
1
[4]: # load he da a.
da a =RD('NR_da a_ iles/D2O F127 2w 22C - 57576.da ')
Calcula e dq_ es and emo e da a.x_e o make he calcula ion as e wi h cons an dq_ es.
[5]: dq_ es =np.mean(da a.x_e /da a.x) * 100
da a =RD(da a=[da a.x, da a.y, da a.y_e ])
The e a e se e al di e en ma e ials in ou sys em. We will c ea e SLD (componen ) objec s o all
o hem.
[6]: ai =SLD(0,'ai ')
polyme _ppo =SLD(0.35,'ppo')
polyme _ppo. eal.se p ( a y=False, bounds=(0.33,0.37))
polyme _peo =SLD(0.67,'peo')
polyme _peo. eal.se p ( a y=False, bounds=(0.65,0.69))
d2o =SLD(6.2,'d2o')
d2o. eal.se p ( a y=T ue, bounds=(5.4,6.36))
Now we will de ine he componen s ha make up ou sys em. The in e acial s uc u e o F127 is
modelled using slab componen s. We will use: - One slab o he ai supe phase. - One slab o
PPO. - One slab o PEO. - One slab o he D2O subphase.
[7]: # Ai slab
ai _l =ai (0,0)
# PPO slab
ppo =polyme _ppo(10,10)
ppo. hick.se p ( a y=T ue, bounds=(0.5,50))
ppo. sol .se p ( a y=T ue, alue=0.05, bounds=(0.005,0.5))
ppo. ough.se p ( a y=T ue, bounds=(1,50))
# PEO slab
peo =polyme _peo(80,10)
peo. hick.se p ( a y=T ue, bounds=(1,150))
peo. sol .se p ( a y=T ue, alue=0.9, bounds=(0.1,1))
peo. ough.se p ( a y=T ue, bounds=(1,100))
# D2O
d2o_l =d2o(0,2)
d2o_l. ough.se p ( a y=T ue, bounds=(0.01,30))
Now we will pu he componen s o ou sys em in o a s uc u e. The s uc u e ep esen s he
in e ace ha we a e modelling.
We place his s uc u e in o ou model and se ex a model pa ame e s ela ed o ou expe imen al
condi ions.
2
[8]: s uc u e =ai |ppo |peo |d2o_l
# con ac ing he slab ep esen a ion educes compu a ion ime.
s uc u e.con ac = 1.5
[9]: model =Re lec Model(s uc u e)
model.scale.se p( alue=1, a y=T ue, bounds=(0.8,1.2))
model.bkg.se p( alue=1e-5, a y=T ue, bounds=(0.9e-8,3e-4))
F om ou model and ou da a, we c ea e an objec i e which includes he expe imen al da a.
[10]: objec i e =Objec i e(model, da a, ans o m=T ans o m('logY'))
Le ’s ha e a look a ou de ined objec i e o check ha we ha en’ made any mis akes.
[11]: objec i e.plo ()
[11]: (<Figu e size 600x300 wi h 1 Axes>, <Axes: >)
1.3 Ini ial local op imisa ion
To use di e en ial_e olu ion o leas _squa es con inue he e.
[12]: i e =Cu eFi e (objec i e)
i e . i ('leas _squa es');
[13]: ig, ax =pl .subplo s()
i e .objec i e.plo ( ig= ig)
[13]: (<Figu e size 600x300 wi h 1 Axes>, <Axes: >)
3
[14]: i e .objec i e.chisq ()
[14]: 469.2172816244555
[15]: o xin i e .objec i e. a ying_pa ame e s():
p in (x)
<Pa ame e : 'scale' , alue=0.982669 +/- 0.00403, bounds=[0.8, 1.2]>
<Pa ame e : 'bkg' , alue=1.06539e-05 +/- 5.87e-07, bounds=[9e-09,
0.0003]>
<Pa ame e : 'ppo - hick' , alue=16.3972 +/- 10.5 , bounds=[0.5, 50.0]>
<Pa ame e : 'ppo - ough' , alue=1.00006 +/- 867 , bounds=[1.0, 50.0]>
<Pa ame e :'ppo - ol ac sol en ', alue=0.430234 +/- 17.8 , bounds=[0.005,
0.5]>
<Pa ame e : 'peo - hick' , alue=71.8302 +/- 307 , bounds=[1.0, 150.0]>
<Pa ame e : 'peo - ough' , alue=1.00002 +/- 895 , bounds=[1.0, 100.0]>
<Pa ame e :'peo - ol ac sol en ', alue=0.89866 +/- 0.00459, bounds=[0.1,
1.0]>
<Pa ame e : 'd2o - sld' , alue=6.07323 +/- 0.00514, bounds=[5.4, 6.36]>
<Pa ame e : 'd2o - ough' , alue=11.1761 +/- 2.54 , bounds=[0.01, 30.0]>
[ ]:
1.4 PT-MCMC sampling
The PT-MCMC sampling ha was conduc ed o his wo k was pe o med on a HPC. He e we
p o ide an example o how he sampling was pe o med. We ini ialise wi h ‘p io ’ so ou s a ing
posi ioning doesn’ ma e , only he bounds a e ele an .
4
[16]: i e =Cu eFi e (objec i e, n emps=15, nwalke s=500)
i e .ini ialise('p io ')
[ ]: num_bu n = 300
o iin ange(num_bu n):
p in ("BURNING: %d/%d"%(i+1,num_bu n))
i e .sample(1, n hin=200);
pickle.dump( i e , open( i _name +'_ i e .pkl','wb'))
BURNING: 1/300
BURNING: 2/300
BURNING: 3/300
BURNING: 4/300
BURNING: 5/300
BURNING: 6/300
BURNING: 7/300
BURNING: 8/300
BURNING: 9/300
BURNING: 10/300
BURNING: 11/300
BURNING: 12/300
BURNING: 13/300
BURNING: 14/300
BURNING: 15/300
BURNING: 16/300
BURNING: 17/300
BURNING: 18/300
BURNING: 19/300
BURNING: 20/300
BURNING: 21/300
BURNING: 22/300
BURNING: 23/300
BURNING: 24/300
BURNING: 25/300
BURNING: 26/300
BURNING: 27/300
BURNING: 28/300
BURNING: 29/300
BURNING: 30/300
BURNING: 31/300
BURNING: 32/300
BURNING: 33/300
BURNING: 34/300
BURNING: 35/300
BURNING: 36/300
BURNING: 37/300
BURNING: 38/300
5
BURNING: 39/300
BURNING: 40/300
BURNING: 41/300
BURNING: 42/300
BURNING: 43/300
BURNING: 44/300
BURNING: 45/300
BURNING: 46/300
BURNING: 47/300
BURNING: 48/300
BURNING: 49/300
BURNING: 50/300
BURNING: 51/300
BURNING: 52/300
BURNING: 53/300
BURNING: 54/300
BURNING: 55/300
BURNING: 56/300
BURNING: 57/300
BURNING: 58/300
BURNING: 59/300
BURNING: 60/300
BURNING: 61/300
BURNING: 62/300
BURNING: 63/300
BURNING: 64/300
BURNING: 65/300
BURNING: 66/300
BURNING: 67/300
BURNING: 68/300
BURNING: 69/300
BURNING: 70/300
BURNING: 71/300
BURNING: 72/300
BURNING: 73/300
BURNING: 74/300
BURNING: 75/300
BURNING: 76/300
BURNING: 77/300
BURNING: 78/300
BURNING: 79/300
BURNING: 80/300
BURNING: 81/300
BURNING: 82/300
BURNING: 83/300
BURNING: 84/300
BURNING: 85/300
BURNING: 86/300
6
BURNING: 87/300
BURNING: 88/300
BURNING: 89/300
BURNING: 90/300
BURNING: 91/300
BURNING: 92/300
BURNING: 93/300
BURNING: 94/300
BURNING: 95/300
BURNING: 96/300
BURNING: 97/300
BURNING: 98/300
BURNING: 99/300
BURNING: 100/300
BURNING: 101/300
BURNING: 102/300
BURNING: 103/300
BURNING: 104/300
BURNING: 105/300
BURNING: 106/300
BURNING: 107/300
BURNING: 108/300
BURNING: 109/300
BURNING: 110/300
BURNING: 111/300
BURNING: 112/300
BURNING: 113/300
BURNING: 114/300
BURNING: 115/300
BURNING: 116/300
BURNING: 117/300
BURNING: 118/300
BURNING: 119/300
BURNING: 120/300
BURNING: 121/300
BURNING: 122/300
BURNING: 123/300
BURNING: 124/300
BURNING: 125/300
BURNING: 126/300
BURNING: 127/300
BURNING: 128/300
BURNING: 129/300
BURNING: 130/300
BURNING: 131/300
BURNING: 132/300
BURNING: 133/300
BURNING: 134/300
7
BURNING: 135/300
BURNING: 136/300
BURNING: 137/300
BURNING: 138/300
BURNING: 139/300
BURNING: 140/300
BURNING: 141/300
BURNING: 142/300
BURNING: 143/300
BURNING: 144/300
BURNING: 145/300
BURNING: 146/300
BURNING: 147/300
BURNING: 148/300
BURNING: 149/300
BURNING: 150/300
BURNING: 151/300
BURNING: 152/300
BURNING: 153/300
BURNING: 154/300
BURNING: 155/300
BURNING: 156/300
BURNING: 157/300
BURNING: 158/300
BURNING: 159/300
BURNING: 160/300
BURNING: 161/300
BURNING: 162/300
BURNING: 163/300
BURNING: 164/300
BURNING: 165/300
BURNING: 166/300
BURNING: 167/300
BURNING: 168/300
BURNING: 169/300
BURNING: 170/300
BURNING: 171/300
BURNING: 172/300
BURNING: 173/300
BURNING: 174/300
BURNING: 175/300
BURNING: 176/300
BURNING: 177/300
BURNING: 178/300
BURNING: 179/300
BURNING: 180/300
BURNING: 181/300
BURNING: 182/300
8
BURNING: 183/300
BURNING: 184/300
BURNING: 185/300
BURNING: 186/300
BURNING: 187/300
BURNING: 188/300
BURNING: 189/300
BURNING: 190/300
BURNING: 191/300
BURNING: 192/300
BURNING: 193/300
BURNING: 194/300
BURNING: 195/300
BURNING: 196/300
BURNING: 197/300
BURNING: 198/300
BURNING: 199/300
BURNING: 200/300
BURNING: 201/300
BURNING: 202/300
BURNING: 203/300
BURNING: 204/300
BURNING: 205/300
BURNING: 206/300
BURNING: 207/300
BURNING: 208/300
BURNING: 209/300
BURNING: 210/300
BURNING: 211/300
BURNING: 212/300
BURNING: 213/300
BURNING: 214/300
BURNING: 215/300
BURNING: 216/300
BURNING: 217/300
BURNING: 218/300
BURNING: 219/300
BURNING: 220/300
BURNING: 221/300
BURNING: 222/300
BURNING: 223/300
BURNING: 224/300
BURNING: 225/300
BURNING: 226/300
BURNING: 227/300
BURNING: 228/300
BURNING: 229/300
BURNING: 230/300
9
ax[0].e o ba (da a.x, da a.y, da a.y_e , ms=5, lw=0, elinewid h=2, c='g ey')
sa ed_pa ams =np.a ay(objec i e.pa ame e s)
p ecs = i e .chain[-1,0]
o p ec in p ecs:
objec i e.se p(p ec)
ax[0].plo (da a.x, objec i e.gene a i e(), colo =' ', alpha=0.01, zo de =2)
z, sld =objec i e.model.s uc u e.sld_p o ile()
ax[1].plo (z, sld, colo =' ', alpha=0.01)
objec i e.se p(sa ed_pa ams)
ax[0].se _yscale('log')
ax[0].se _ylabel('Re lec i i y')
ax[1].se _ylabel('SLD, $ imes 10^{-6}$ Å')
ax[1].se _xlabel('Dis ance, Å')
ax[0].se _xlabel('$Q$, Å$^{-1}$')
[ ]: Tex (0.5, 0, '$Q$, Å$^{-1}$')
[19]: o xin i e .objec i e. a ying_pa ame e s():
p in (x)
<Pa ame e : 'scale' , alue=0.982598 +/- 0.00476, bounds=[0.8, 1.2]>
<Pa ame e : 'bkg' , alue=8.67999e-06 +/- 2.08e-07, bounds=[9e-09,
0.0003]>
<Pa ame e : 'ppo - hick' , alue=14.299 +/- 0.475, bounds=[0.5, 50.0]>
<Pa ame e : 'ppo - ough' , alue=2.70204 +/- 0.361, bounds=[1.0, 50.0]>
<Pa ame e :'ppo - ol ac sol en ', alue=0.372202 +/- 0.0379, bounds=[0.005,
16
0.5]>
<Pa ame e : 'peo - hick' , alue=72.9662 +/- 1.11 , bounds=[1.0, 150.0]>
<Pa ame e : 'peo - ough' , alue=4.39383 +/- 0.656, bounds=[1.0, 100.0]>
<Pa ame e :'peo - ol ac sol en ', alue=0.895801 +/- 0.00234, bounds=[0.1,
1.0]>
<Pa ame e : 'd2o - sld' , alue=6.07297 +/- 0.0062, bounds=[5.5, 6.4]>
<Pa ame e :'wa e _poly_ ough', alue=12.7351 +/- 0.786, bounds=[1.0, 100.0]>
[ ]:
17