Simulador de eventos de colisión con clúster MPI de Raspberry Pi. Validación cinemática contra datos reales del CMS Open Data y generación Monte Carlo con masa invariante controlada.
SIMEX-RACSO junta dos cosas que raramente conviven en un mismo proyecto: física experimental de partículas y computación distribuida de bajo costo. No es un visor de datos ni un framework genérico: es una herramienta que reproduce la cinemática relativista desde cero, la valida contra la realidad del detector del CMS, y la ejerce en un clúster de Raspberry Pi conectado por SSH.
El dataset público DoubleMu 2011A del CMS Open Data contiene 100,000 eventos con dos muones cada uno. Son colisiones protón-protón que el detector CMS registró en el LHC durante 2011 a una energía de centro de masa de √s = 7 TeV.
La aplicación recalcula la masa invariante de
cada par de muones a partir de las variables cinemáticas
publicadas (pT, η, φ) y compara el resultado contra la columna
M que el propio CMS ya calculó. Si la diferencia
media entre ambas distribuciones es casi cero, mi implementación
de la cinemática relativista es correcta.
Un segundo kernel genera eventos desde cero,
sin leer ningún archivo. El usuario fija la masa objetivo y la
resolución experimental σ. En vez de generar al azar y filtrar
por masa (lo cual sería ineficiente), el kernel despeja
cos(Δφ) de la fórmula de masa invariante, garantizando
que cada evento cumpla la restricción física por construcción.
Con σ = 0, la simulación da un pico ideal (delta de Dirac). Con σ > 0, el pico adquiere ancho, comparable al que mide el detector real. Eso permite comparar teoría y experimento en la misma gráfica y estimar la resolución efectiva del CMS.
Fórmula de masa invariante
Sale de sumar los cuadrimomentos relativistas de los dos muones y
aplicar la identidad hiperbólica cosh(a−b) = cosh a cosh b − sinh a sinh b.
Nueve módulos organizados por familia. Cada uno usa su propio kernel MPI y puede correr en la PC local o repartirse entre los nodos del clúster Raspberry Pi.
Benchmark Monte Carlo puro. Mide el overhead de MPI sin I/O de disco, para ver cuánto mejora al agregar procesos en la misma máquina.
Recalcula la masa invariante del dataset del CMS con 4 pruebas base: J/ψ, Υ, Z y Higgs. Compara contra la columna M del propio CMS.
Igual que Hilos Local pero repartido entre las Raspberry Pi detectadas en la red. La detección es automática vía tabla ARP.
Valida la cinemática contra el CMS repartiendo el trabajo entre los nodos del clúster. Mide el speedup real.
Genera eventos Monte Carlo con masa invariante controlada. Edita masa, σ, pT y η desde la interfaz sin recompilar.
Genera eventos en paralelo repartiendo el trabajo entre los nodos. Cada evento tiene exactamente la masa pedida.
Anima cada evento real del CMS como una colisión 3D de 5 segundos. Recorre eventos con un slider o pide uno al azar.
Lo mismo pero con los eventos generados por Monte Carlo. Útil para comparar visualmente un evento simulado con uno real.
Compila tablas, gráficas y estadísticas de los benchmarks en un PDF académico listo para presentar en el congreso.
La aplicación está construida en capas estrictas para separar responsabilidades. Cada capa se puede auditar, reemplazar o extender de forma independiente.
Paneles, sliders, botones, gráficas con Matplotlib, exportación de reportes con FPDF. Es la única capa que el usuario ve directamente. Se encarga de gestionar los subprocesos y de parsear las salidas de los kernels.
El trabajo pesado real. Cuatro ejecutables que se compilan
con mpicxx -O3 la primera vez que arranca la app.
Reparten la carga entre procesos con MPI_Scatterv
y juntan los resultados con MPI_Reduce / MPI_Gatherv.
WSL2 permite compilar y ejecutar binarios Linux directamente desde Windows. También funciona como punto de entrada SSH hacia las Raspberry Pi del clúster, sin necesidad de configurar red adicional.
fgets + strtod (C puro, sin excepciones).dat creado la primera ejecuciónMPI_Scatterv en lugar de MPI_Scatter para no perder eventossubprocess.Popen + terminate() para no dejar procesos zombisCada prueba base filtra el CSV del CMS a una ventana alrededor de la masa teórica de la resonancia. Los valores vienen del Particle Data Group (2012), la fuente oficial de masas y constantes en física de partículas.
24 referencias organizadas en seis bloques temáticos. Cada una respalda una decisión específica del proyecto: los datos usados, la física aplicada, las técnicas de cómputo paralelo, el hardware del clúster y las librerías de software.
colision_core. Incluye
ejemplos con Python (ROOT, pandas) y las selecciones
estándar de calidad de muones.
DoubleMu con los que se
filtraron los eventos, los cortes de calidad aplicados y el
contexto físico de la época (energía de √s = 7 TeV, luminosidad
integrada, etc.). Es la fuente de la información sobre cómo se
tomaron los datos del CSV.
pt, eta,
phi del CSV. También explica las resoluciones
típicas del detector (~1% en pT, ~0.01 en η, ~0.01 rad en φ),
que son las que justifican los valores de σ que uso en cada
resonancia.
p^μ = (E/c, px, py, pz). De aquí sale la
equivalencia masa-energía E = mc² y el concepto
de masa invariante que uso en toda la app.
E² − p²c² es
un invariante Lorentz: no cambia al pasar de un sistema
inercial a otro. Esa invariancia es lo que permite identificar
partículas por su masa en un colisionador.
m² = 2·pT₁·pT₂·[cosh(Δη) − cos(Δφ)].
MPI_Scatterv,
MPI_Gatherv, MPI_Reduce o
MPI_Bcast en los kernels. La versión 4.0 añadió
soporte para procesos en múltiples arquitecturas (útil para
mezclar x86 y ARM en el mismo clúster, como hago en este
proyecto).
mc_core y del proceso de generación
aleatoria que uso para muestrear los eventos. En la época en
que se publicó, se usaba para simular procesos de difusión de
neutrones en el proyecto Manhattan. Ahora es una técnica
estándar en física de partículas, finanzas y machine learning.
std::mt19937 en los
kernels C++. Tiene un periodo de 2¹⁹⁹³⁷ − 1 y pasa todas las
pruebas estadísticas estándar (Diehard, TestU01). Es el
generador por defecto en muchas herramientas científicas
(Python, R, GSL) porque ofrece un buen balance entre
velocidad y calidad estadística.
np.loadtxt,
manipular los arrays de eventos, calcular histogramas con
np.histogram y hacer operaciones vectoriales
sobre las masas recalculadas. El paper describe la
arquitectura de ndarray y las optimizaciones SIMD que la
hacen tan rápida.
BatchMode que uso en los comandos automáticos
vienen de aquí. Es lo que permite ejecutar mpirun
remotamente sin tener que meter contraseña cada vez.
mpicxx nativo de Linux y ejecutarlos con
mpirun directamente desde un comando de Windows.
También sirve como punto de entrada SSH para el clúster
Raspberry Pi sin necesidad de configurar red adicional.
El instalador pesa ~50 MB y no requiere permisos de administrador. Solo necesita WSL2 con OpenMPI para compilar y ejecutar los kernels C++.
Abre PowerShell como administrador y ejecuta:
Abre la terminal de Ubuntu (menú Inicio → Ubuntu) y ejecuta:
Descarga el .exe desde la sección de Releases
del repositorio. Doble clic, sigue el wizard y listo. La app
aparece en el menú Inicio y opcionalmente en el escritorio.
No requiere permisos de administrador.
Clona el repositorio, instala las dependencias con pip y ejecuta el script principal. Requiere Python 3.10 o superior.
mpicxx -O3
dentro de WSL. Tarda unos segundos y muestra el progreso en la
consola. Las siguientes veces arranca instantáneo porque ya
están compilados.
Herramientas elegidas por estabilidad, disponibilidad y licencia libre. Todas son de código abierto o se pueden usar sin costo para proyectos académicos.