"- $N_{total,sig,bkg}$ son el número de eventos totales, de señal y de fondo respectivamente. \n",
"- $PDF_{sig}$ y $PDF_{bkg}$ son las funciones de densidad de probabilidad de la señal y fondo respectivamente. \n",
"- $f_{sig}$ es la fracción de eventos de señal con respecto al número de eventos totales $\\left(=N_{sig}/(N_{sig}+N_{bkg})=N_{sig}/N_{total}\\right)$"
]
},
{
"cell_type": "markdown",
"id": "clean-sunset",
"metadata": {},
"source": [
"Primero, definimos las variables y parámetros que necesitamos: "
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "yellow-nation",
"metadata": {},
"outputs": [],
"source": [
"fSig = 0.05\n",
"nEntries = 10000\n",
"minVal = 100.000 \n",
"maxVal = 160.000"
]
},
{
"cell_type": "markdown",
"id": "shared-journey",
"metadata": {},
"source": [
"Cada componente del modelo (señal o fondo) va a ser definido como una PDF en el intervalo definido arriba (minVal,maxVal). "
]
},
{
"cell_type": "markdown",
"id": "academic-prospect",
"metadata": {},
"source": [
"Como hemos dicho, la señal está descrita por una distribución gaussiana, centrada en un valor de masa 'mass' y con una anchura 'sigma'. \n",
"En este caso tenemos herramientas que normalizan automáticamente la distribución. "
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "lesbian-ordinance",
"metadata": {},
"outputs": [],
"source": [
"#PDF de la señal, más info: https://root.cern.ch/root/html524/TMath.html#TMath:Gaus\n",
"ROOT.gRandom.SetSeed(100) #importante fijar una semilla para la reproducibilidad de resultados. \n",
"toySignal = ROOT.gRandom.Poisson(nEntries*fSig) #el número de eventos señal y fondo lo obtenemos del valor de nuestro modelo y le permitimos que fluctue de forma Poissoniana. \n",
"En la parte anterior hemos obtenido una esimación de los parámetros y sus errores a través de una minimización del $\\chi^{2}$ (en realidad no hemos sido nosotros, ROOT lo ha hecho utilizando un software que se llama MINUIT, y cuyo contenido sale un poco de la línea del curso..).\n",
"Grosso modo: en el hiperespacio de parámetros libres (en nuestro caso, 5) ha generado una hipersuperficie de $\\chi^{2}$. Lógicamente, cada conjunto de parámetros tiene un $\\chi^{2}$\n",
"calculado el gradiente de la superficie en cada punto, y apuntado al punto en el cual es mínimo. \n",
"Para \"verlo\" mejor, vamos a hacer una simplificación: vamos a fijarnos exclusivamente en dos parámetros (la masa y la anchura de la señal) y vamos a ver qué cara tiene dicha superficie en ese subespacio de dos parámetros. "
"Luego realizamos ajustes fijando tanto la masa como la anchura, de forma que nos permitan obtener el $\\chi^{2}$ en función de dichos parámetros. Sin fijarlos, obtendríamos siempre el valor que más se ajuste a los datos (en el mínimo!). "
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "liquid-rwanda",
"metadata": {},
"outputs": [],
"source": [
"#this is for the chi2 on the mass and width\n",
"chi2dPlot.Clear()\n",
"for masses in np.linspace(minVal, maxVal, num=binMass+1):\n",
" #print('Filling: mass and bin {} , {} '.format(masses,chi2dPlot.GetXaxis().FindBin(masses)))\n",
" for widths in np.linspace(0.25, 10.5, num=binWidth+1):\n",
" #print('Filling: mass and bin {} , {} '.format(widths,chi2dPlot.GetYaxis().FindBin(widths)))\n",
El modelo expuesto anteriormente sirve de base para generar "datos", que vamos a utilizar para el ajuste de los parámetros.
Los toys se generan utilizando un generador de números aleatorios de ROOT.
La siguiente celda genera entonces los toys de señal y fondo y los dibuja.
%% Cell type:code id:indonesian-charles tags:
``` python
nbins=60
ROOT.gRandom.SetSeed(100)#importante fijar una semilla para la reproducibilidad de resultados.
toySignal=ROOT.gRandom.Poisson(nEntries*fSig)#el número de eventos señal y fondo lo obtenemos del valor de nuestro modelo y le permitimos que fluctue de forma Poissoniana.
toyBkg=ROOT.gRandom.Poisson(nEntries*(1-fSig))
print('Input signal events: {}'.format(toySignal))
6 tau 4.68561e+01 1.39443e+00 3.13290e-03 -1.00685e-04
%% Cell type:markdown id:corporate-folks tags:
## ¿Qué estamos haciendo realmente?
En la parte anterior hemos obtenido una esimación de los parámetros y sus errores a través de una minimización del $\chi^{2}$ (en realidad no hemos sido nosotros, ROOT lo ha hecho utilizando un software que se llama MINUIT, y cuyo contenido sale un poco de la línea del curso..).
Grosso modo: en el hiperespacio de parámetros libres (en nuestro caso, 5) ha generado una hipersuperficie de $\chi^{2}$. Lógicamente, cada conjunto de parámetros tiene un $\chi^{2}$
calculado el gradiente de la superficie en cada punto, y apuntado al punto en el cual es mínimo.
Para "verlo" mejor, vamos a hacer una simplificación: vamos a fijarnos exclusivamente en dos parámetros (la masa y la anchura de la señal) y vamos a ver qué cara tiene dicha superficie en ese subespacio de dos parámetros.
Luego realizamos ajustes fijando tanto la masa como la anchura, de forma que nos permitan obtener el $\chi^{2}$ en función de dichos parámetros. Sin fijarlos, obtendríamos siempre el valor que más se ajuste a los datos (en el mínimo!).