Sphères de Livermore
Description rapide de l’expérience
Les expériences dites “Sphères de Livermore” ont été réalisées fin des années 60 - début des années 70 au Lawrence Livermore Laboratory (États-Unis).
Une sphère creuse est placée au centre d’un bunker. En son centre on a une source de neutrons à 14 MeV (faisceau de sur une cible d’tritium, réaction ). Des détecteurs sont positionnés autour de la sphère après collimation.
On observe le spectre en temps des neutrons qui arrivent dans les détecteurs (réponse type REACTION
dans Tripoli-4).
Pour une sphère donnée on exécute deux fois la simulation : - avec la sphère étudiée (matériau = fer, béryllium, azote, eau, etc) - avec la même sphère dont le matériau étudié a été remplacé par de l’air
Cette seconde sphère nous permet de normaliser les résultats et de pouvoir nous comparer aux données expérimentales notamment grâce à un graphique. Il y a donc deux sorties Tripoli-4 à lire et des opérations à faire sur les spectres.
Dans le cas présent la sphère considérée est celle d’azote liquide, d’une épaisseur de 3.1 mfp (libre parcours moyen), avec un spectre à 30°.
Parsing des résultats Tripoli-4 et récupération du spectre
Parser les résultats
[1]:
from valjean.eponine.tripoli4.parse import Parser
jdd_sphere = 'prob103_nitrogen3.1_fine_timeShifted_sphere_PARA.d.res'
jdd_air = 'prob103_nitrogen3.1_fine_timeShifted_air_PARA.d.res'
Le module permettant de lire, parser et récupérer les résultats de Tripoli-4 sous un format plus facilement exploitable est Parser
.
On ne regardera ici que le résultat du dernier batch. Le parsing est effectivement fait par la méthode parse_from_index
. L’index par défaut est -1
, ce qui correspond au dernier batch.
Pour manipuler plus aisément les réponses de Tripoli-4 et en particulier les sélectionner on utilise un objet Browser
.
[2]:
sphere_b = Parser(jdd_sphere).parse_from_index(name='sphere').to_browser()
air_b = Parser(jdd_air).parse_from_index(name='air').to_browser()
INFO parse: Parsing prob103_nitrogen3.1_fine_timeShifted_sphere_PARA.d.res
INFO parse: Successful scan in 0.164728 s
INFO parse: Successful parsing in 6.081770 s
INFO parse: Parsing prob103_nitrogen3.1_fine_timeShifted_air_PARA.d.res
INFO parse: Successful scan in 0.164611 s
INFO parse: Successful parsing in 6.085544 s
Sélection du résultat
À chaque réponse dans ce jeu de données a été associé un SCORE NAME
unique (et explicite). C’est le moyen le plus aisé de récupérer les réponses nécessaires.
Dans le cas de la sphère (ici d’azote liquide), on récupère score_name='neutron_response_30deg'
, soit le spectre neutron à 30 degrés (des spectres photons sont aussi disponibles). Il s’agira du numérateur (variable nsphere
). Dans le cas de l’air, seule l’intégrale du spectre est nécessaire pour la normalisation, donc au dénominateur (variable dair
). La sélection de la réponse se fait sur score_name='neutron_response_integral_30deg'
.
[3]:
nsphere = sphere_b.select_by(score_name='neutron_response_30deg')
dair = air_b.select_by(score_name='neutron_response_integral_30deg')
Transformation des données en Dataset
Pour pouvoir manipuler les données plus aisément mais aussi pour faciliter leur manipulation, elles sont transformées en Dataset
.
Le but de Dataset
est d’être commun à tous les types de données (Tripoli-4, données expérimentales, PATMOS, MCNP, etc). Chaque dataset contient au moins 2 membres : value
et error
. Il s’agit de l’incertitude absolue (et non pas relative comme dans les résultats standard Tripoli-4). Trois autres membres sont optionnels : bins
, name
et what
.
Les données sont stockées sous forme de Dataset
accessible dans le Browser
sous la clef 'results'
.
Pour info :
[4]:
test_ds = nsphere['results']['score']
print(type(test_ds))
print(test_ds)
<class 'valjean.eponine.dataset.Dataset'>
shape: (1, 1, 1, 1, 138, 1, 1), dim: 7, type: <class 'numpy.ndarray'>, bins: ['u: []', 'v: []', 'w: []', 'e: [1.e-11 2.e+01]', 't: [0.00e+00 2.38e-07 2.40e-07 2.42e-07 2.44e-07 2.46e-07 2.48e-07 2.50e-07 2.52e-07 2.54e-07 2.56e-07 2.58e-07 2.60e-07 2.62e-07 2.64e-07 2.66e-07 2.68e-07 2.70e-07 2.72e-07 2.74e-07 2.76e-07 2.78e-07 2.80e-07 2.82e-07 2.84e-07 2.86e-07 2.88e-07 2.90e-07 2.92e-07 2.94e-07 2.96e-07 2.98e-07 3.00e-07 3.02e-07 3.04e-07 3.06e-07 3.08e-07 3.10e-07 3.12e-07 3.14e-07 3.16e-07 3.18e-07 3.20e-07 3.22e-07 3.24e-07 3.26e-07 3.28e-07 3.30e-07 3.32e-07 3.34e-07 3.36e-07 3.38e-07 3.40e-07 3.42e-07 3.44e-07 3.46e-07 3.48e-07 3.50e-07 3.52e-07 3.54e-07 3.56e-07 3.58e-07 3.60e-07 3.62e-07 3.64e-07 3.66e-07 3.68e-07 3.70e-07 3.72e-07 3.74e-07 3.76e-07 3.78e-07 3.80e-07 3.82e-07 3.84e-07 3.86e-07 3.88e-07 3.90e-07 3.92e-07 3.94e-07 3.96e-07 3.98e-07 4.00e-07 4.02e-07 4.04e-07 4.06e-07 4.08e-07 4.10e-07 4.12e-07 4.14e-07 4.16e-07 4.18e-07 4.20e-07 4.22e-07 4.24e-07 4.26e-07 4.28e-07 4.30e-07 4.32e-07 4.34e-07 4.36e-07 4.38e-07 4.40e-07 4.42e-07 4.44e-07 4.46e-07 4.48e-07 4.50e-07 4.52e-07 4.54e-07 4.56e-07 4.58e-07 4.60e-07 4.62e-07 4.64e-07 4.66e-07 4.68e-07 4.70e-07 4.72e-07 4.74e-07 4.76e-07 4.78e-07 4.80e-07 4.82e-07 4.84e-07 4.86e-07 4.88e-07 4.90e-07 4.92e-07 4.94e-07 4.96e-07 4.98e-07 5.00e-07 5.02e-07 5.04e-07 5.06e-07 5.08e-07 5.10e-07 1.00e+01]', 'mu: []', 'phi: []'], name: sphere, what: reaction
[5]:
print(test_ds.squeeze().shape)
(138,)
Pour les manipuler plus simplement, les Dataset
sont squeezés : nous récupérons des spectres en temps, les 6 autres dimensions sont donc à 1 et non utiles ici (et triviales).
[6]:
nsphereds = nsphere['results']['score'].squeeze()
nsphereds.name="azote (num)"
[7]:
dairds = dair['results']['score'].squeeze()
dairds.name='air (denom)'
print(dairds)
shape: (3,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['t: [0.00e+00 2.38e-07 5.10e-07 1.00e+01]'], name: air (denom), what: reaction
Normalisation du spectre
Le résultat correspondant à l’intégrale du spectre n’est en réalité ici pas un score générique, mais un réel spectre. Cette différence est due aux intervalles extrêmes : - entre t=0 et le début des résultats expérientaux, à t=138 ns pour le premier - entre t=410 ns et t=10 s pour le dernier, soit entre la fin des résultats expérimentaux et la valeur maximale du temps dans Tripoli-4
Pour être plus juste, notamment au niveau du calcul des incertitudes associées, le choix a été fait de faire un spectre de 3 intervalles où seul celui du milieu nous intéresse dans le cas présent.
L’incertitude sur la norme est négligée par la suite (elle est dominée par celle sur chaque intervalle).
[8]:
import numpy as np
norm = dairds.value[1]
print("type(norm) = {0}, shape(norm) = {1}".format(type(norm), norm.shape))
type(norm) = <class 'numpy.float64'>, shape(norm) = ()
En réalité deux normalisations du spectre sont à effectuer, celle par l’intégrale de l’air et celle par la largeur des bins, appelée ici TIME_BIN_WIDTH
, valant 2 ns.
[9]:
TIME_BIN_WIDTH = 2
t4ds = nsphereds / norm / TIME_BIN_WIDTH
Remarque : il n’aurait pas été possible d’utiliser un Dataset
issu de dairds
pour la normalisation.
[10]:
print(dairds)
test_dairds = dairds.copy()[1:-1]
print(test_dairds)
shape: (3,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['t: [0.00e+00 2.38e-07 5.10e-07 1.00e+01]'], name: air (denom), what: reaction
shape: (1,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['t: [2.38e-07 5.10e-07]'], name: air (denom), what: reaction
[11]:
test_ds = nsphereds / test_dairds / TIME_BIN_WIDTH
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[11], line 1
----> 1 test_ds = nsphereds / test_dairds / TIME_BIN_WIDTH
File ~/checkouts/readthedocs.org/user_builds/valjean/envs/latest/lib/python3.11/site-packages/valjean/eponine/dataset.py:954, in Dataset.__truediv__(self, other)
950 if not isinstance(other, Dataset):
951 return Dataset(
952 self.value / other, self.error / other,
953 bins=self.bins, name=self.name, what=self.what)
--> 954 self._check_datasets_consistency(other, "divide")
955 value = self.value / other.value
956 # RuntimeWarning can be ignored thanks to the commented line.
957 # 'log' can be used instead of 'ignore' but did not work.
958 # with np.errstate(divide='divide', invalid='ignore'):
File ~/checkouts/readthedocs.org/user_builds/valjean/envs/latest/lib/python3.11/site-packages/valjean/eponine/dataset.py:895, in Dataset._check_datasets_consistency(self, other, operation)
893 def _check_datasets_consistency(self, other, operation=""):
894 if other.shape != self.shape:
--> 895 raise ValueError(f"Datasets to {operation} do not have same shape")
896 if other.bins != OrderedDict():
897 if any((s != o) for s, o in zip(self.bins, other.bins)):
ValueError: Datasets to divide do not have same shape
Ces deux datasets n’ont bien pas les shapes or les calculs sur les Dataset
ne peuvent être effectués que s’ils ont la même shape et, dans le cas où des bins ont été fournis, si leurs bins sont équivalents.
[12]:
'shape(t4ds) = {0}, shape(test_dairds) = {1}'.format(t4ds.shape, test_dairds.shape)
[12]:
'shape(t4ds) = (138,), shape(test_dairds) = (1,)'
Réarrangement des intervalles
Les temps sont par défaut en s dans Tripoli-4 alors que les données que nous avons à disposition sont données par intervalles de temps en ns, on convertit donc les intervalles de Tripoli-4 en ns.
Par ailleurs, les intervalles en temps dans le jeu de données ont été décalés de 100 ns pour que la description de la source (gaussienne) soit correcte et complètement prise en compte dans le temps de la simulation (jeu de données tourné avec Tripoli-4, version 10.2, ce bug a été corrigé pour la version 11, mais c’est une jolie illustration des calculs possibles sur les Dataset
).
[13]:
print('Bins en s et avant décalage:\n',t4ds.bins['t'] )
t4ds.bins['t'] = t4ds.bins['t'] * 1e9 - 100
print('Bins en ns et après décalage:\n', t4ds.bins['t'])
Bins en s et avant décalage:
[0.00e+00 2.38e-07 2.40e-07 2.42e-07 2.44e-07 2.46e-07 2.48e-07 2.50e-07
2.52e-07 2.54e-07 2.56e-07 2.58e-07 2.60e-07 2.62e-07 2.64e-07 2.66e-07
2.68e-07 2.70e-07 2.72e-07 2.74e-07 2.76e-07 2.78e-07 2.80e-07 2.82e-07
2.84e-07 2.86e-07 2.88e-07 2.90e-07 2.92e-07 2.94e-07 2.96e-07 2.98e-07
3.00e-07 3.02e-07 3.04e-07 3.06e-07 3.08e-07 3.10e-07 3.12e-07 3.14e-07
3.16e-07 3.18e-07 3.20e-07 3.22e-07 3.24e-07 3.26e-07 3.28e-07 3.30e-07
3.32e-07 3.34e-07 3.36e-07 3.38e-07 3.40e-07 3.42e-07 3.44e-07 3.46e-07
3.48e-07 3.50e-07 3.52e-07 3.54e-07 3.56e-07 3.58e-07 3.60e-07 3.62e-07
3.64e-07 3.66e-07 3.68e-07 3.70e-07 3.72e-07 3.74e-07 3.76e-07 3.78e-07
3.80e-07 3.82e-07 3.84e-07 3.86e-07 3.88e-07 3.90e-07 3.92e-07 3.94e-07
3.96e-07 3.98e-07 4.00e-07 4.02e-07 4.04e-07 4.06e-07 4.08e-07 4.10e-07
4.12e-07 4.14e-07 4.16e-07 4.18e-07 4.20e-07 4.22e-07 4.24e-07 4.26e-07
4.28e-07 4.30e-07 4.32e-07 4.34e-07 4.36e-07 4.38e-07 4.40e-07 4.42e-07
4.44e-07 4.46e-07 4.48e-07 4.50e-07 4.52e-07 4.54e-07 4.56e-07 4.58e-07
4.60e-07 4.62e-07 4.64e-07 4.66e-07 4.68e-07 4.70e-07 4.72e-07 4.74e-07
4.76e-07 4.78e-07 4.80e-07 4.82e-07 4.84e-07 4.86e-07 4.88e-07 4.90e-07
4.92e-07 4.94e-07 4.96e-07 4.98e-07 5.00e-07 5.02e-07 5.04e-07 5.06e-07
5.08e-07 5.10e-07 1.00e+01]
Bins en ns et après décalage:
[-1.0000000e+02 1.3800000e+02 1.4000000e+02 1.4200000e+02
1.4400000e+02 1.4600000e+02 1.4800000e+02 1.5000000e+02
1.5200000e+02 1.5400000e+02 1.5600000e+02 1.5800000e+02
1.6000000e+02 1.6200000e+02 1.6400000e+02 1.6600000e+02
1.6800000e+02 1.7000000e+02 1.7200000e+02 1.7400000e+02
1.7600000e+02 1.7800000e+02 1.8000000e+02 1.8200000e+02
1.8400000e+02 1.8600000e+02 1.8800000e+02 1.9000000e+02
1.9200000e+02 1.9400000e+02 1.9600000e+02 1.9800000e+02
2.0000000e+02 2.0200000e+02 2.0400000e+02 2.0600000e+02
2.0800000e+02 2.1000000e+02 2.1200000e+02 2.1400000e+02
2.1600000e+02 2.1800000e+02 2.2000000e+02 2.2200000e+02
2.2400000e+02 2.2600000e+02 2.2800000e+02 2.3000000e+02
2.3200000e+02 2.3400000e+02 2.3600000e+02 2.3800000e+02
2.4000000e+02 2.4200000e+02 2.4400000e+02 2.4600000e+02
2.4800000e+02 2.5000000e+02 2.5200000e+02 2.5400000e+02
2.5600000e+02 2.5800000e+02 2.6000000e+02 2.6200000e+02
2.6400000e+02 2.6600000e+02 2.6800000e+02 2.7000000e+02
2.7200000e+02 2.7400000e+02 2.7600000e+02 2.7800000e+02
2.8000000e+02 2.8200000e+02 2.8400000e+02 2.8600000e+02
2.8800000e+02 2.9000000e+02 2.9200000e+02 2.9400000e+02
2.9600000e+02 2.9800000e+02 3.0000000e+02 3.0200000e+02
3.0400000e+02 3.0600000e+02 3.0800000e+02 3.1000000e+02
3.1200000e+02 3.1400000e+02 3.1600000e+02 3.1800000e+02
3.2000000e+02 3.2200000e+02 3.2400000e+02 3.2600000e+02
3.2800000e+02 3.3000000e+02 3.3200000e+02 3.3400000e+02
3.3600000e+02 3.3800000e+02 3.4000000e+02 3.4200000e+02
3.4400000e+02 3.4600000e+02 3.4800000e+02 3.5000000e+02
3.5200000e+02 3.5400000e+02 3.5600000e+02 3.5800000e+02
3.6000000e+02 3.6200000e+02 3.6400000e+02 3.6600000e+02
3.6800000e+02 3.7000000e+02 3.7200000e+02 3.7400000e+02
3.7600000e+02 3.7800000e+02 3.8000000e+02 3.8200000e+02
3.8400000e+02 3.8600000e+02 3.8800000e+02 3.9000000e+02
3.9200000e+02 3.9400000e+02 3.9600000e+02 3.9800000e+02
4.0000000e+02 4.0200000e+02 4.0400000e+02 4.0600000e+02
4.0800000e+02 4.1000000e+02 9.9999999e+09]
De plus, le dataset actuel, t4ds
, contient toujours les bins extrêmes, il faut donc les enlever.
Le slicing a été codé dans Dataset
: il est effectué en même temps sur les valeurs, sur les erreurs et sur les intervalles.
[14]:
print('bins en temps (avant slicing):')
print(t4ds.bins['t'])
print("shape(t4ds) = {0}, bins(nom = {1}, shape = {2})"
.format(t4ds.shape, list(t4ds.bins.keys()), t4ds.bins['t'].shape))
t4ds = t4ds[1:-1]
print('bins en temps (après slicing):')
print(t4ds.bins['t'])
print("shape(t4ds) = {0}, bins(nom = {1}, shape = {2})"
.format(t4ds.shape, list(t4ds.bins.keys()), t4ds.bins['t'].shape))
bins en temps (avant slicing):
[-1.0000000e+02 1.3800000e+02 1.4000000e+02 1.4200000e+02
1.4400000e+02 1.4600000e+02 1.4800000e+02 1.5000000e+02
1.5200000e+02 1.5400000e+02 1.5600000e+02 1.5800000e+02
1.6000000e+02 1.6200000e+02 1.6400000e+02 1.6600000e+02
1.6800000e+02 1.7000000e+02 1.7200000e+02 1.7400000e+02
1.7600000e+02 1.7800000e+02 1.8000000e+02 1.8200000e+02
1.8400000e+02 1.8600000e+02 1.8800000e+02 1.9000000e+02
1.9200000e+02 1.9400000e+02 1.9600000e+02 1.9800000e+02
2.0000000e+02 2.0200000e+02 2.0400000e+02 2.0600000e+02
2.0800000e+02 2.1000000e+02 2.1200000e+02 2.1400000e+02
2.1600000e+02 2.1800000e+02 2.2000000e+02 2.2200000e+02
2.2400000e+02 2.2600000e+02 2.2800000e+02 2.3000000e+02
2.3200000e+02 2.3400000e+02 2.3600000e+02 2.3800000e+02
2.4000000e+02 2.4200000e+02 2.4400000e+02 2.4600000e+02
2.4800000e+02 2.5000000e+02 2.5200000e+02 2.5400000e+02
2.5600000e+02 2.5800000e+02 2.6000000e+02 2.6200000e+02
2.6400000e+02 2.6600000e+02 2.6800000e+02 2.7000000e+02
2.7200000e+02 2.7400000e+02 2.7600000e+02 2.7800000e+02
2.8000000e+02 2.8200000e+02 2.8400000e+02 2.8600000e+02
2.8800000e+02 2.9000000e+02 2.9200000e+02 2.9400000e+02
2.9600000e+02 2.9800000e+02 3.0000000e+02 3.0200000e+02
3.0400000e+02 3.0600000e+02 3.0800000e+02 3.1000000e+02
3.1200000e+02 3.1400000e+02 3.1600000e+02 3.1800000e+02
3.2000000e+02 3.2200000e+02 3.2400000e+02 3.2600000e+02
3.2800000e+02 3.3000000e+02 3.3200000e+02 3.3400000e+02
3.3600000e+02 3.3800000e+02 3.4000000e+02 3.4200000e+02
3.4400000e+02 3.4600000e+02 3.4800000e+02 3.5000000e+02
3.5200000e+02 3.5400000e+02 3.5600000e+02 3.5800000e+02
3.6000000e+02 3.6200000e+02 3.6400000e+02 3.6600000e+02
3.6800000e+02 3.7000000e+02 3.7200000e+02 3.7400000e+02
3.7600000e+02 3.7800000e+02 3.8000000e+02 3.8200000e+02
3.8400000e+02 3.8600000e+02 3.8800000e+02 3.9000000e+02
3.9200000e+02 3.9400000e+02 3.9600000e+02 3.9800000e+02
4.0000000e+02 4.0200000e+02 4.0400000e+02 4.0600000e+02
4.0800000e+02 4.1000000e+02 9.9999999e+09]
shape(t4ds) = (138,), bins(nom = ['t'], shape = (139,))
bins en temps (après slicing):
[138. 140. 142. 144. 146. 148. 150. 152. 154. 156. 158. 160. 162. 164.
166. 168. 170. 172. 174. 176. 178. 180. 182. 184. 186. 188. 190. 192.
194. 196. 198. 200. 202. 204. 206. 208. 210. 212. 214. 216. 218. 220.
222. 224. 226. 228. 230. 232. 234. 236. 238. 240. 242. 244. 246. 248.
250. 252. 254. 256. 258. 260. 262. 264. 266. 268. 270. 272. 274. 276.
278. 280. 282. 284. 286. 288. 290. 292. 294. 296. 298. 300. 302. 304.
306. 308. 310. 312. 314. 316. 318. 320. 322. 324. 326. 328. 330. 332.
334. 336. 338. 340. 342. 344. 346. 348. 350. 352. 354. 356. 358. 360.
362. 364. 366. 368. 370. 372. 374. 376. 378. 380. 382. 384. 386. 388.
390. 392. 394. 396. 398. 400. 402. 404. 406. 408. 410.]
shape(t4ds) = (136,), bins(nom = ['t'], shape = (137,))
Enfin, les données issues de la simulation sont données par intervalle (avec les extémités des intervalles) alors que les données expérimentales sont données au centre de l’intervalle. Ces dernières sont également des int
et non des float
comme les temps issus de Tripoli-4. L’étape finale est donc de supprimer la première (ou dernière) valeur dans les bins et de toutes les décaler d’1 ns (largeur d’intervalle toujours de 2 ns) et de les transformer en int
.
[15]:
t4ds.bins['t'] = np.rint(t4ds.bins['t'][1:] - 1)
print(t4ds.bins['t'])
[139. 141. 143. 145. 147. 149. 151. 153. 155. 157. 159. 161. 163. 165.
167. 169. 171. 173. 175. 177. 179. 181. 183. 185. 187. 189. 191. 193.
195. 197. 199. 201. 203. 205. 207. 209. 211. 213. 215. 217. 219. 221.
223. 225. 227. 229. 231. 233. 235. 237. 239. 241. 243. 245. 247. 249.
251. 253. 255. 257. 259. 261. 263. 265. 267. 269. 271. 273. 275. 277.
279. 281. 283. 285. 287. 289. 291. 293. 295. 297. 299. 301. 303. 305.
307. 309. 311. 313. 315. 317. 319. 321. 323. 325. 327. 329. 331. 333.
335. 337. 339. 341. 343. 345. 347. 349. 351. 353. 355. 357. 359. 361.
363. 365. 367. 369. 371. 373. 375. 377. 379. 381. 383. 385. 387. 389.
391. 393. 395. 397. 399. 401. 403. 405. 407. 409.]
Le Dataset
est maintenant prêt pour la comparaison aux données. On met simplement à jour son nom et la variable qu’il représente (ordonnée) pour le représenter explicitement.
[16]:
t4ds.name = 'T4'
t4ds.what = 'Neutron count rate'
Résultats expérimentaux
Les résultats expérimentaux sont fournis dans un fichier ASCII, sous forme de tableaux de valeurs. Il faut donc les parser et les transformer en Dataset
.
Cette étape est actuellement faite dans une petite classe externe : LivermoreExps
[17]:
from livermore_exps import LivermoreExps
exps = LivermoreExps('s10a11.res.mesure')
s10a11.res.mesure
['BERYLLIUM', '0.8', '30', 765.2]
['CARBON', '0.5', '30', 766.0]
['CARBON', '0.5', '120', 975.2]
['CARBON', '2.9', '30', 766.0]
['CARBON', '2.9', '120', 975.2]
['NITROGEN', '3.1', '30', 765.2]
['OXYGENE', '0.7', '30', 754.0]
['MAGNESIUM', '0.7', '30', 765.2]
['MAGNESIUM', '0.7', '120', 977.2]
['ALUMINIUM', '0.9', '30', 765.2]
['ALUMINIUM', '0.9', '120', 977.2]
['IRON', '0.9', '30', 766.0]
['IRON', '0.9', '120', 975.2]
['IRON', '4.8', '30', 766.0]
['IRON', '4.8', '120', 975.2]
['WATER', '1.1', '30', 754.0]
['H_WATER', '1.2', '30', 765.0]
['CONCRETE', '2.0', '120', 975.4]
ALL KEYS:
[('BERYLLIUM', '0.8', '30'), ('CARBON', '0.5', '30'), ('CARBON', '0.5', '120'), ('CARBON', '2.9', '30'), ('CARBON', '2.9', '120'), ('NITROGEN', '3.1', '30'), ('OXYGENE', '0.7', '30'), ('MAGNESIUM', '0.7', '30'), ('MAGNESIUM', '0.7', '120'), ('ALUMINIUM', '0.9', '30'), ('ALUMINIUM', '0.9', '120'), ('IRON', '0.9', '30'), ('IRON', '0.9', '120'), ('IRON', '4.8', '30'), ('IRON', '4.8', '120'), ('WATER', '1.1', '30'), ('H_WATER', '1.2', '30'), ('CONCRETE', '2.0', '120')]
Toutes les données expérimentales sont ainsi disponibles, il suffit de les charger une seule fois pour toutes les analyses des sphères de Livermore. Ici on ne considèrera qu’un seul cas : ('NITROGEN', '3.1', '30')
.
[18]:
exp_key = ('NITROGEN', '3.1', '30')
exp_data = exps.res[exp_key]
type(exp_data)
[18]:
valjean.eponine.dataset.Dataset
[19]:
print(exp_data)
shape: (136,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['t: [139. 141. 143. 145. 147. 149. 151. 153. 155. 157. 159. 161. 163. 165. 167. 169. 171. 173. 175. 177. 179. 181. 183. 185. 187. 189. 191. 193. 195. 197. 199. 201. 203. 205. 207. 209. 211. 213. 215. 217. 219. 221. 223. 225. 227. 229. 231. 233. 235. 237. 239. 241. 243. 245. 247. 249. 251. 253. 255. 257. 259. 261. 263. 265. 267. 269. 271. 273. 275. 277. 279. 281. 283. 285. 287. 289. 291. 293. 295. 297. 299. 301. 303. 305. 307. 309. 311. 313. 315. 317. 319. 321. 323. 325. 327. 329. 331. 333. 335. 337. 339. 341. 343. 345. 347. 349. 351. 353. 355. 357. 359. 361. 363. 365. 367. 369. 371. 373. 375. 377. 379. 381. 383. 385. 387. 389. 391. 393. 395. 397. 399. 401. 403. 405. 407. 409.]'], name: data, what:
Les objets dans le dictionnaire de résultat (exps.res
) sont des Dataset
.
Comparaison entre données et expérience
Pour les graphiques on utilise le rapport des spectres simulé et expérimental. La classe Dataset
fournit les outils pour faire ce type de calculs.
[20]:
print(np.array_equal(t4ds.bins['t'], exp_data.bins['t']))
True
Malgré le fait que les bins nous apparaissaient complètement équivalents, ils ne l’étaient pas : cela vient probablement de la conversion de strings (depuis les fichiers ASCII) en float alors que les nombres n’étaient pas écrits de la même manière (int
pour les données expérimentales, float
en notation exponentielle à 6 chiffres après la virgule pour Tripoli-4 ayant subis quelques calculs en plus).
[21]:
ratio = t4ds / exp_data
Comparaisons numériques
Il est possible de comparer les deux Dataset
numériquement grâce aux fonctions disponibles dans gavroche.test.py
qui agissent sur les datasets.
[22]:
from valjean.gavroche.test import TestApproxEqual
test_equality = TestApproxEqual(t4ds, exp_data, name='light criteria on approx eq', rtol=0.1, atol=1e-2)
print(bool(test_equality.evaluate()))
True
Lors de la VV ce test est davantage fait sur l’intégrale du spectre.
[23]:
integ = sphere_b.select_by(score_name='neutron_response_integral_30deg')
intnumds = integ['results']['score'].squeeze()
intnumds.name='integ'
integds = intnumds / norm / TIME_BIN_WIDTH
integds = integds[1:-1]
print(integds)
shape: (1,), dim: 1, type: <class 'numpy.ndarray'>, bins: ['t: [2.38e-07 5.10e-07]'], name: integ, what: reaction
Petite vérification de routine rapide :
[24]:
np.allclose(np.sum(t4ds.value), integds.value)
[24]:
True
On supprime les bins ici pour simplifier la comparaison (il s’agit d’une intégrale).
[25]:
from collections import OrderedDict
integds.bins = OrderedDict()
print(integds)
shape: (1,), dim: 1, type: <class 'numpy.ndarray'>, bins: [], name: integ, what: reaction
Intégrale des données, en supposant les intervalles indépendants :
[26]:
from valjean.eponine.dataset import Dataset
[27]:
quad_err = np.sqrt(np.sum(exp_data.error ** 2))
integ_data = Dataset(np.sum(exp_data.value), quad_err)
print(integ_data)
value: 2.015474e-01, error: 4.239589e-04, bins: OrderedDict(), type: <class 'numpy.float64'>,name: , what:
[28]:
equ_integ = TestApproxEqual(integds, integ_data, name='approx eq integrales', rtol=0.03, atol=1e-4)
print(bool(equ_integ))
True
Graphiques par défaut dans valjean
La majorité des tests peut être représentée sous forme de graphique.
[29]:
from valjean.javert.representation import FullRepresenter
from valjean.javert.rst import RstFormatter
from valjean.javert.mpl import MplPlot
from valjean.javert.verbosity import Verbosity
frepr = FullRepresenter()
rstformat = RstFormatter()
[30]:
teq_res = test_equality.evaluate()
eqrepr = frepr(teq_res, verbosity=Verbosity.FULL_DETAILS) # il s'agit d'une liste de templates
eqrst = rstformat.template(eqrepr[1])
print(eqrst)
mpl = MplPlot(eqrepr[0]).draw()
.. role:: hl
.. table::
:widths: auto
=== =========== =========== =============
t T4 data approx equal?
=== =========== =========== =============
139 5.55457e-05 0.0009519 True
141 0.00118528 0.0077 True
143 0.00893213 0.0204795 True
145 0.0218566 0.026057 True
147 0.0216699 0.0173575 True
149 0.0132692 0.0095605 True
151 0.00748997 0.00616 True
153 0.00502181 0.0047192 True
155 0.00388959 0.0040897 True
157 0.0034185 0.00406495 True
159 0.00317997 0.00369335 True
161 0.00297349 0.00326535 True
163 0.00279022 0.0029624 True
165 0.00258342 0.00269255 True
167 0.00236749 0.00232045 True
169 0.00226739 0.0020996 True
171 0.00206574 0.00201375 True
173 0.00190346 0.0017443 True
175 0.00170911 0.0016056 True
177 0.0016319 0.00157055 True
179 0.00158248 0.0015384 True
181 0.00155479 0.0014737 True
183 0.00153633 0.0014077 True
185 0.00151627 0.00138115 True
187 0.0015399 0.001371 True
189 0.00157329 0.00138875 True
191 0.00155078 0.0012998 True
193 0.00148645 0.00130525 True
195 0.00144237 0.0012063 True
197 0.00134622 0.001105 True
199 0.00131588 0.0010722 True
201 0.00124256 0.0010684 True
203 0.00117172 0.00099225 True
205 0.00116655 0.0009726 True
207 0.00109664 0.00095265 True
209 0.00108667 0.0009802 True
211 0.00108588 0.00101455 True
213 0.00111711 0.00099005 True
215 0.00109222 0.00102495 True
217 0.0010924 0.0009409 True
219 0.00106172 0.00085005 True
221 0.00103876 0.00089455 True
223 0.00106566 0.0009124 True
225 0.00104802 0.00087615 True
227 0.00102713 0.00088065 True
229 0.00100579 0.0008775 True
231 0.00103697 0.000875 True
233 0.00103529 0.00091045 True
235 0.00100917 0.00088475 True
237 0.00100023 0.00084455 True
239 0.00100228 0.0008346 True
241 0.000983864 0.00083185 True
243 0.000997541 0.00085315 True
245 0.00104778 0.00088735 True
247 0.00100842 0.0008887 True
249 0.00106032 0.00093345 True
251 0.00106348 0.00095775 True
253 0.00107137 0.0009621 True
255 0.00110801 0.0009755 True
257 0.00102729 0.00087365 True
259 0.000973585 0.0008456 True
261 0.00099714 0.0007888 True
263 0.000950634 0.0007969 True
265 0.000881015 0.0007551 True
267 0.000854355 0.00074015 True
269 0.000816657 0.0006776 True
271 0.000765727 0.00065885 True
273 0.000736658 0.0005968 True
275 0.000691288 0.0006269 True
277 0.000678993 0.0006212 True
279 0.000696424 0.00060335 True
281 0.000670687 0.0005857 True
283 0.000651523 0.00052105 True
285 0.000599761 0.00053375 True
287 0.00061133 0.00055205 True
289 0.000601374 0.0005533 True
291 0.000583103 0.0005488 True
293 0.000584056 0.00053585 True
295 0.000540916 0.00049291 True
297 0.000550412 0.00052315 True
299 0.000552923 0.000479485 True
301 0.000560512 0.00052695 True
303 0.000531155 0.000483245 True
305 0.000518599 0.000484415 True
307 0.000492058 0.000483095 True
309 0.000505487 0.000488225 True
311 0.000509219 0.000488575 True
313 0.000501507 0.000487045 True
315 0.000488588 0.000465225 True
317 0.000483927 0.00050375 True
319 0.00049458 0.00048882 True
321 0.000482865 0.00044683 True
323 0.000477005 0.000452225 True
325 0.000480317 0.000467225 True
327 0.000494829 0.00047503 True
329 0.000491724 0.00047855 True
331 0.000507182 0.00049157 True
333 0.000498105 0.000487365 True
335 0.000502847 0.00049807 True
337 0.000505027 0.00045714 True
339 0.000507307 0.000486445 True
341 0.000489606 0.0005155 True
343 0.000473202 0.000481145 True
345 0.000475292 0.000489915 True
347 0.000480632 0.00044432 True
349 0.000465248 0.000444205 True
351 0.000475173 0.000448605 True
353 0.000437251 0.00045204 True
355 0.000471841 0.00042395 True
357 0.000451007 0.000441215 True
359 0.00043615 0.00046094 True
361 0.000425573 0.000448195 True
363 0.000430618 0.000444745 True
365 0.000418642 0.00043726 True
367 0.000410464 0.000417455 True
369 0.000390776 0.00038885 True
371 0.00037246 0.00037076 True
373 0.000381532 0.00036254 True
375 0.000359002 0.000398215 True
377 0.000346426 0.000357555 True
379 0.000354585 0.000324985 True
381 0.000344207 0.000342015 True
383 0.0003436 0.00031319 True
385 0.000327421 0.000326635 True
387 0.000309169 0.000303065 True
389 0.000333483 0.000270825 True
391 0.000301403 0.000296465 True
393 0.000304476 0.00028084 True
395 0.000291929 0.0002719 True
397 0.000284313 0.000263645 True
399 0.000269536 0.00025017 True
401 0.000272009 0.00022047 True
403 0.00025244 0.00020573 True
405 0.000237807 0.000211075 True
407 0.000227296 0.00019417 True
409 0.00022099 0.00016967 True
=== =========== =========== =============
Avec un test de Holm-Bonferroni puisqu’il s’agit d’un spectre :
[31]:
from valjean.gavroche.stat_tests.student import TestStudent
from valjean.gavroche.stat_tests.bonferroni import TestHolmBonferroni
[32]:
sphere_b.globals
studt = TestStudent(t4ds, exp_data, name='Student test', ndf=sphere_b.globals['edition_batch_number'])
hb_res = TestHolmBonferroni(test=studt, name='Holm-Bonferroni test', description='').evaluate()
[33]:
hbrepr = frepr(hb_res, verbosity=Verbosity.INTERMEDIATE) # il s'agit d'une liste de templates
hbrst = rstformat.template(hbrepr[1])
print(hbrst)
mpl = MplPlot(hbrepr[0]).draw()
.. role:: hl
.. table::
:widths: auto
========== === =========== ============ =========== ========== ================
test ndf α min(p-value) min(α) N rejected Holm-Bonferroni?
========== === =========== ============ =========== ========== ================
T4 vs data 136 0.005 0 3.67647e-05 39 :hl:`False`
========== === =========== ============ =========== ========== ================
D’autres niveaux de verbosité sont disponibles. Il est également possible de changer un peu la représentation graphique des tests en utilisant une échelle logarithmique pour les données et la simulation par exemple.
[34]:
from valjean.javert import plot_repr as pltr
def log_post(templates, tres):
pltr.post_treatment(templates, tres)
for templ in templates:
templ.subplots[0].attributes.logy = True
return templates
[35]:
hbrepr = FullRepresenter(post=log_post)(hb_res, verbosity=Verbosity.FULL_DETAILS) # il s'agit d'une liste de templates
print(len(hbrepr[1:]))
hbrst = '\n'.join([str(rstformat.template(hbrepr[1])), str(rstformat.template(hbrepr[2]))])
print(hbrst)
mpl = MplPlot(hbrepr[0]).draw()
2
.. role:: hl
.. table::
:widths: auto
========== === =========== ============ =========== ========== ================
test ndf α min(p-value) min(α) N rejected Holm-Bonferroni?
========== === =========== ============ =========== ========== ================
T4 vs data 136 0.005 0 3.67647e-05 39 :hl:`False`
========== === =========== ============ =========== ========== ================
.. role:: hl
.. table::
:widths: auto
=== =========== =========== =========== =========== =========== ===========
t v(T4) σ(T4) v(data) σ(data) t Student?
=== =========== =========== =========== =========== =========== ===========
139 5.55457e-05 3.10611e-06 0.0009519 2.99445e-05 -29.7741 :hl:`False`
141 0.00118528 1.42187e-05 0.0077 7.9415e-05 -80.7498 :hl:`False`
143 0.00893213 4.06929e-05 0.0204795 0.00012866 -85.573 :hl:`False`
145 0.0218566 6.54398e-05 0.026057 0.000145 -26.404 :hl:`False`
147 0.0216699 6.09966e-05 0.0173575 0.00011853 32.3498 :hl:`False`
149 0.0132692 5.06842e-05 0.0095605 8.831e-05 36.4235 :hl:`False`
151 0.00748997 3.62418e-05 0.00616 7.122e-05 16.6432 :hl:`False`
153 0.00502181 3.17534e-05 0.0047192 6.2585e-05 4.31188 :hl:`False`
155 0.00388959 3.01783e-05 0.0040897 5.8415e-05 -3.04344 :hl:`False`
157 0.0034185 2.60436e-05 0.00406495 5.8245e-05 -10.132 :hl:`False`
159 0.00317997 2.54106e-05 0.00369335 5.563e-05 -8.39418 :hl:`False`
161 0.00297349 2.39223e-05 0.00326535 5.2455e-05 -5.06248 :hl:`False`
163 0.00279022 2.5883e-05 0.0029624 5.0095e-05 -3.0536 :hl:`False`
165 0.00258342 2.3407e-05 0.00269255 4.7877e-05 -2.04779 True
167 0.00236749 2.33064e-05 0.00232045 4.4653e-05 0.933804 True
169 0.00226739 2.24576e-05 0.0020996 4.2624e-05 3.48261 :hl:`False`
171 0.00206574 2.11621e-05 0.00201375 4.1809e-05 1.10938 True
173 0.00190346 1.96915e-05 0.0017443 3.91435e-05 3.63225 :hl:`False`
175 0.00170911 1.92469e-05 0.0016056 3.7693e-05 2.44584 True
177 0.0016319 1.86048e-05 0.00157055 3.73155e-05 1.47144 True
179 0.00158248 1.85253e-05 0.0015384 3.69715e-05 1.06596 True
181 0.00155479 1.94426e-05 0.0014737 3.6263e-05 1.97088 True
183 0.00153633 1.90821e-05 0.0014077 3.5526e-05 3.18979 :hl:`False`
185 0.00151627 1.74553e-05 0.00138115 3.5225e-05 3.437 :hl:`False`
187 0.0015399 2.00079e-05 0.001371 3.5109e-05 4.17969 :hl:`False`
189 0.00157329 2.01629e-05 0.00138875 3.53115e-05 4.53821 :hl:`False`
191 0.00155078 2.19893e-05 0.0012998 3.4287e-05 6.16179 :hl:`False`
193 0.00148645 1.78986e-05 0.00130525 3.43505e-05 4.678 :hl:`False`
195 0.00144237 1.88918e-05 0.0012063 3.31755e-05 6.18356 :hl:`False`
197 0.00134622 1.787e-05 0.001105 3.1928e-05 6.59263 :hl:`False`
199 0.00131588 1.94992e-05 0.0010722 3.1514e-05 6.57554 :hl:`False`
201 0.00124256 1.65324e-05 0.0010684 3.14655e-05 4.89969 :hl:`False`
203 0.00117172 1.65994e-05 0.00099225 3.04795e-05 5.17104 :hl:`False`
205 0.00116655 5.87326e-05 0.0009726 3.02205e-05 2.93635 :hl:`False`
207 0.00109664 5.846e-05 0.00095265 2.99545e-05 2.192 True
209 0.00108667 1.59775e-05 0.0009802 3.03205e-05 3.10663 :hl:`False`
211 0.00108588 1.5647e-05 0.00101455 3.07715e-05 2.06635 True
213 0.00111711 1.73304e-05 0.00099005 3.04505e-05 3.62654 :hl:`False`
215 0.00109222 1.61502e-05 0.00102495 3.09065e-05 1.92912 True
217 0.0010924 1.83855e-05 0.0009409 2.97965e-05 4.32694 :hl:`False`
219 0.00106172 1.68272e-05 0.00085005 2.8548e-05 6.38742 :hl:`False`
221 0.00103876 1.85236e-05 0.00089455 2.91665e-05 4.17379 :hl:`False`
223 0.00106566 1.63213e-05 0.0009124 2.9411e-05 4.55633 :hl:`False`
225 0.00104802 1.53696e-05 0.00087615 2.89125e-05 5.24889 :hl:`False`
227 0.00102713 1.59634e-05 0.00088065 2.8975e-05 4.42776 :hl:`False`
229 0.00100579 1.63727e-05 0.0008775 2.895e-05 3.85736 :hl:`False`
231 0.00103697 1.58147e-05 0.000875 2.88965e-05 4.91711 :hl:`False`
233 0.00103529 1.80806e-05 0.00091045 2.93845e-05 3.61824 :hl:`False`
235 0.00100917 1.656e-05 0.00088475 2.90315e-05 3.72257 :hl:`False`
237 0.00100023 2.05546e-05 0.00084455 2.8471e-05 4.4335 :hl:`False`
239 0.00100228 1.58244e-05 0.0008346 2.83305e-05 5.1674 :hl:`False`
241 0.000983864 1.50035e-05 0.00083185 2.82915e-05 4.74692 :hl:`False`
243 0.000997541 1.85275e-05 0.00085315 2.8592e-05 4.23805 :hl:`False`
245 0.00104778 2.1722e-05 0.00088735 2.90675e-05 4.42114 :hl:`False`
247 0.00100842 1.64345e-05 0.0008887 2.9086e-05 3.58364 :hl:`False`
249 0.00106032 1.56954e-05 0.00093345 2.9696e-05 3.77718 :hl:`False`
251 0.00106348 1.61786e-05 0.00095775 3.00225e-05 3.1002 :hl:`False`
253 0.00107137 2.16596e-05 0.0009621 3.008e-05 2.948 :hl:`False`
255 0.00110801 1.69586e-05 0.0009755 3.0259e-05 3.82009 :hl:`False`
257 0.00102729 1.65585e-05 0.00087365 2.8878e-05 4.61556 :hl:`False`
259 0.000973585 1.50525e-05 0.0008456 2.8486e-05 3.9724 :hl:`False`
261 0.00099714 1.87934e-05 0.0007888 2.76745e-05 6.22793 :hl:`False`
263 0.000950634 1.59219e-05 0.0007969 2.7792e-05 4.79972 :hl:`False`
265 0.000881015 1.43211e-05 0.0007551 2.71325e-05 4.10412 :hl:`False`
267 0.000854355 1.43856e-05 0.00074015 2.6961e-05 3.73723 :hl:`False`
269 0.000816657 1.52233e-05 0.0006776 2.6014e-05 4.61354 :hl:`False`
271 0.000765727 1.35224e-05 0.00065885 2.57235e-05 3.67766 :hl:`False`
273 0.000736658 1.50207e-05 0.0005968 2.4733e-05 4.83321 :hl:`False`
275 0.000691288 1.37425e-05 0.0006269 2.5221e-05 2.24177 True
277 0.000678993 1.28367e-05 0.0006212 2.513e-05 2.04803 True
279 0.000696424 1.6121e-05 0.00060335 2.4844e-05 3.14267 :hl:`False`
281 0.000670687 1.65141e-05 0.0005857 2.4557e-05 2.87185 :hl:`False`
283 0.000651523 1.276e-05 0.00052105 2.3475e-05 4.8832 :hl:`False`
285 0.000599761 1.26954e-05 0.00053375 2.3694e-05 2.45571 True
287 0.00061133 1.33979e-05 0.00055205 2.40015e-05 2.15659 True
289 0.000601374 1.20326e-05 0.0005533 2.40225e-05 1.78929 True
291 0.000583103 1.21542e-05 0.0005488 2.3947e-05 1.27733 True
293 0.000584056 1.20167e-05 0.00053585 2.37295e-05 1.81235 True
295 0.000540916 1.1966e-05 0.00049291 2.29925e-05 1.85209 True
297 0.000550412 1.21389e-05 0.00052315 2.3514e-05 1.03022 True
299 0.000552923 1.18554e-05 0.000479485 2.27575e-05 2.86191 :hl:`False`
301 0.000560512 1.15318e-05 0.00052695 2.35785e-05 1.27866 True
303 0.000531155 1.09718e-05 0.000483245 2.28235e-05 1.8919 True
305 0.000518599 1.11668e-05 0.000484415 2.2844e-05 1.34438 True
307 0.000492058 1.07867e-05 0.000483095 2.2821e-05 0.355101 True
309 0.000505487 1.69899e-05 0.000488225 2.2911e-05 0.605184 True
311 0.000509219 1.7619e-05 0.000488575 2.2917e-05 0.714139 True
313 0.000501507 1.25527e-05 0.000487045 2.289e-05 0.553988 True
315 0.000488588 1.06051e-05 0.000465225 2.2505e-05 0.9391 True
317 0.000483927 1.75318e-05 0.00050375 2.3191e-05 -0.681862 True
319 0.00049458 1.08281e-05 0.00048882 2.29215e-05 0.22722 True
321 0.000482865 1.05604e-05 0.00044683 2.2175e-05 1.46716 True
323 0.000477005 1.00847e-05 0.000452225 2.2272e-05 1.01353 True
325 0.000480317 9.92964e-06 0.000467225 2.25405e-05 0.531542 True
327 0.000494829 1.07151e-05 0.00047503 2.2679e-05 0.789352 True
329 0.000491724 1.07552e-05 0.00047855 2.2741e-05 0.5237 True
331 0.000507182 1.0728e-05 0.00049157 2.29695e-05 0.615827 True
333 0.000498105 1.0642e-05 0.000487365 2.2896e-05 0.425391 True
335 0.000502847 1.08098e-05 0.00049807 2.30825e-05 0.187432 True
337 0.000505027 1.24756e-05 0.00045714 2.23605e-05 1.87018 True
339 0.000507307 1.00953e-05 0.000486445 2.288e-05 0.834194 True
341 0.000489606 1.18542e-05 0.0005155 2.3383e-05 -0.987711 True
343 0.000473202 1.02049e-05 0.000481145 2.2757e-05 -0.318474 True
345 0.000475292 1.00383e-05 0.000489915 2.29405e-05 -0.583981 True
347 0.000480632 9.63098e-06 0.00044432 2.21295e-05 1.50456 True
349 0.000465248 9.71176e-06 0.000444205 2.21275e-05 0.870816 True
351 0.000475173 9.77166e-06 0.000448605 2.2207e-05 1.09505 True
353 0.000437251 9.24249e-06 0.00045204 2.2269e-05 -0.613391 True
355 0.000471841 9.91968e-06 0.00042395 2.17575e-05 2.00281 True
357 0.000451007 9.16715e-06 0.000441215 2.2073e-05 0.409681 True
359 0.00043615 9.44434e-06 0.00046094 2.24285e-05 -1.01865 True
361 0.000425573 1.07187e-05 0.000448195 2.21995e-05 -0.917668 True
363 0.000430618 9.78274e-06 0.000444745 2.2137e-05 -0.583687 True
365 0.000418642 8.511e-06 0.00043726 2.2001e-05 -0.789255 True
367 0.000410464 9.2263e-06 0.000417455 2.16375e-05 -0.297205 True
369 0.000390776 7.92623e-06 0.00038885 2.11005e-05 0.0854315 True
371 0.00037246 8.0628e-06 0.00037076 2.0754e-05 0.0763566 True
373 0.000381532 8.19401e-06 0.00036254 2.0595e-05 0.856856 True
375 0.000359002 7.44099e-06 0.000398215 2.1278e-05 -1.7396 True
377 0.000346426 7.51633e-06 0.000357555 2.04975e-05 -0.509748 True
379 0.000354585 7.41695e-06 0.000324985 1.98505e-05 1.39682 True
381 0.000344207 7.06501e-06 0.000342015 2.01915e-05 0.102481 True
383 0.0003436 7.10479e-06 0.00031319 1.96105e-05 1.45796 True
385 0.000327421 6.915e-06 0.000326635 1.98835e-05 0.0373397 True
387 0.000309169 6.48171e-06 0.000303065 1.94025e-05 0.298385 True
389 0.000333483 8.11078e-06 0.000270825 1.87245e-05 3.07061 :hl:`False`
391 0.000301403 6.34478e-06 0.000296465 1.92655e-05 0.243443 True
393 0.000304476 6.32524e-06 0.00028084 1.8933e-05 1.18408 True
395 0.000291929 6.22648e-06 0.0002719 1.87475e-05 1.01391 True
397 0.000284313 6.04437e-06 0.000263645 1.85705e-05 1.05831 True
399 0.000269536 5.84774e-06 0.00025017 1.8277e-05 1.00918 True
401 0.000272009 6.21651e-06 0.00022047 1.76135e-05 2.7593 :hl:`False`
403 0.00025244 5.50901e-06 0.00020573 1.7275e-05 2.57609 True
405 0.000237807 5.47488e-06 0.000211075 1.73985e-05 1.46558 True
407 0.000227296 5.32532e-06 0.00019417 1.70045e-05 1.85907 True
409 0.00022099 5.11706e-06 0.00016967 1.6417e-05 2.98444 :hl:`False`
=== =========== =========== =========== =========== =========== ===========
L’impression des résultats des TestStudent
dans le cas FULL_DETAILS
donne le tableau de Student en INTERMEDIATE
, soit les bins où le test à échouer.
Remarque : le test de Holm-Bonferroni n’est pas très adapté ici, comme nous comparons les données à la simulation, nous n’avons pas de nombre de degrés de liberté similaire pour les deux échantillons.
Graphiques de comparaison entre les données expérimentales et Tripoli-4
L’analyse des données peut également être faite en dehors de valjean en fonction de ses nécessités.
Comme pour la lecture des résultats expérimentaux, une petite classe a été dérivée pour facilier et personnaliser les graphiques de comparaison.
La bibliothèque utilisée est matplotlib
.
Dans notre cas, on souhaite aisément :
ajouter une nouvelle courbe, avec ses erreurs
visualiser le rapport entre les différentes courbes
pouvoir personnaliser facilement la couleur et l’aspect des courbes (aisé grâce à
matplotlib
, les arguments sont juste transmis ici)
Cette petite classe, CompPlot, est aussi disponible dans le notebook.
Le nom de « l’analyse » correspond à la clef pour les données expérimentales. Cela permet de générer par exemple le titre.
[36]:
import matplotlib.pyplot as plt
from comp_plots import CompPlot
cplot = CompPlot(exp_key)
cplot.add_errorbar_plot(exp_data.bins['t'], exp_data.value, exp_data.error,
fmt='o', c='black', ms=2, ecolor='black', label='Experiment')
cplot.add_errorbar_plot(t4ds.bins['t'], t4ds.value, t4ds.error,
label='T4', drawstyle='steps-mid', fmt='-', c='orange')
cplot.add_errorbar_ratio(ratio.bins['t'], ratio.value, 0,
drawstyle='steps-mid', fmt='-', c='green')
cplot.splt[1].fill_between(
ratio.bins['t'],
np.ones(ratio.bins['t'].size) - exp_data.error/exp_data.value,
np.ones(ratio.bins['t'].size) + exp_data.error/exp_data.value,
facecolor='lightgrey', step='mid')
cplot.customize_plot()
plt.show()