From 32159b26f119efcf59572123466acb69ae8287d3 Mon Sep 17 00:00:00 2001 From: Andres Rios Tascon Date: Mon, 21 Oct 2024 16:29:04 -0400 Subject: [PATCH] feat: initial commit --- .github/dependabot.yml | 7 + .github/workflows/deploy.yml | 60 + .gitignore | 6 + .pre-commit-config.yaml | 29 + CODE_OF_CONDUCT.md | 84 + CONTRIBUTING.md | 105 + LICENSE | 395 + README.md | 35 + environment.yml | 20 + scikit_hep_tutorial/00-bienvenida.md | 12 + scikit_hep_tutorial/01-introduccion.ipynb | 700 + scikit_hep_tutorial/02-uproot.ipynb | 524 + scikit_hep_tutorial/03-ttree.ipynb | 393 + scikit_hep_tutorial/04-awkward.ipynb | 767 + scikit_hep_tutorial/05-histogramas.ipynb | 384 + scikit_hep_tutorial/06-vectores-lorentz.ipynb | 344 + scikit_hep_tutorial/07-mas-herramientas.md | 35 + scikit_hep_tutorial/_config.yml | 40 + scikit_hep_tutorial/_toc.yml | 15 + .../fig/abstraction-layers.png | Bin 0 -> 76357 bytes .../fig/abstraction-layers.svg | 867 + scikit_hep_tutorial/fig/apl-timeline.png | Bin 0 -> 28749 bytes scikit_hep_tutorial/fig/apl-timeline.svg | 1198 ++ .../fig/array3d-highlight1.png | Bin 0 -> 19627 bytes .../fig/array3d-highlight1.svg | 650 + .../fig/array3d-highlight2.png | Bin 0 -> 18731 bytes .../fig/array3d-highlight2.svg | 650 + scikit_hep_tutorial/fig/array3d.svg | 647 + .../fig/bitwise-operator-parentheses.png | Bin 0 -> 17870 bytes .../fig/bitwise-operator-parentheses.svg | 509 + scikit_hep_tutorial/fig/cartoon-cartesian.png | Bin 0 -> 5161 bytes scikit_hep_tutorial/fig/cartoon-cartesian.svg | 618 + .../fig/cartoon-combinations.png | Bin 0 -> 7564 bytes .../fig/cartoon-combinations.svg | 724 + scikit_hep_tutorial/fig/scikit-hep-logos.png | Bin 0 -> 88617 bytes scikit_hep_tutorial/fig/scikit-hep-logos.svg | 14489 ++++++++++++++++ scikit_hep_tutorial/fig/terminology.png | Bin 0 -> 48184 bytes scikit_hep_tutorial/fig/terminology.svg | 691 + scikit_hep_tutorial/hsf_logo.png | Bin 0 -> 22514 bytes 39 files changed, 24998 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100755 LICENSE create mode 100644 README.md create mode 100644 environment.yml create mode 100644 scikit_hep_tutorial/00-bienvenida.md create mode 100644 scikit_hep_tutorial/01-introduccion.ipynb create mode 100644 scikit_hep_tutorial/02-uproot.ipynb create mode 100644 scikit_hep_tutorial/03-ttree.ipynb create mode 100644 scikit_hep_tutorial/04-awkward.ipynb create mode 100644 scikit_hep_tutorial/05-histogramas.ipynb create mode 100644 scikit_hep_tutorial/06-vectores-lorentz.ipynb create mode 100644 scikit_hep_tutorial/07-mas-herramientas.md create mode 100644 scikit_hep_tutorial/_config.yml create mode 100644 scikit_hep_tutorial/_toc.yml create mode 100644 scikit_hep_tutorial/fig/abstraction-layers.png create mode 100644 scikit_hep_tutorial/fig/abstraction-layers.svg create mode 100644 scikit_hep_tutorial/fig/apl-timeline.png create mode 100644 scikit_hep_tutorial/fig/apl-timeline.svg create mode 100644 scikit_hep_tutorial/fig/array3d-highlight1.png create mode 100644 scikit_hep_tutorial/fig/array3d-highlight1.svg create mode 100644 scikit_hep_tutorial/fig/array3d-highlight2.png create mode 100644 scikit_hep_tutorial/fig/array3d-highlight2.svg create mode 100644 scikit_hep_tutorial/fig/array3d.svg create mode 100644 scikit_hep_tutorial/fig/bitwise-operator-parentheses.png create mode 100644 scikit_hep_tutorial/fig/bitwise-operator-parentheses.svg create mode 100644 scikit_hep_tutorial/fig/cartoon-cartesian.png create mode 100644 scikit_hep_tutorial/fig/cartoon-cartesian.svg create mode 100644 scikit_hep_tutorial/fig/cartoon-combinations.png create mode 100644 scikit_hep_tutorial/fig/cartoon-combinations.svg create mode 100644 scikit_hep_tutorial/fig/scikit-hep-logos.png create mode 100644 scikit_hep_tutorial/fig/scikit-hep-logos.svg create mode 100644 scikit_hep_tutorial/fig/terminology.png create mode 100644 scikit_hep_tutorial/fig/terminology.svg create mode 100644 scikit_hep_tutorial/hsf_logo.png diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..f9ecf57 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..5709454 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,60 @@ +name: Build and Deploy Book + +on: + workflow_dispatch: + pull_request: + push: + branches: + - main + +env: + BASE_URL: /${{ github.event.repository.name }} + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build-book: + name: Build Book + runs-on: ubuntu-latest + timeout-minutes: 30 + # Required for miniconda to activate conda + defaults: + run: + shell: bash -l {0} + steps: + - name: Check out repo + uses: actions/checkout@v4 + - name: Get conda + uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: "3.12" + miniforge-version: latest + use-mamba: true + environment-file: environment.yml + activate-environment: skhep-tutorial + - name: Build the book + run: | + jupyter-book build scikit_hep_tutorial + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: "scikit_hep_tutorial/_build/html" + + deploy-book: + name: Deploy Book + runs-on: ubuntu-latest + needs: build-book + if: github.event_name == 'push' + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70bd6dd --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +_build +.ipynb_* +*.root + +.DS_Store + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..ee1e0ca --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +ci: + autoupdate_schedule: monthly + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: check-added-large-files + - id: check-case-conflict + - id: check-merge-conflict + - id: check-symlinks + - id: debug-statements + - id: end-of-file-fixer + files: ^(_episodes|README.md|setup.md) + - id: mixed-line-ending + - id: trailing-whitespace + files: ^(_episodes|code|README.md|setup.md) + + - repo: https://github.com/asottile/blacken-docs + rev: 1.19.0 + hooks: + - id: blacken-docs + additional_dependencies: [black==22.6.0] + files: '.*\.md' + + - repo: https://github.com/kynan/nbstripout + rev: 0.7.1 + hooks: + - id: nbstripout \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..2784237 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,84 @@ +# Código de Conducta convenido para Contribuyentes + +## Nuestro compromiso + +Nosotros, como miembros, contribuyentes y administradores nos comprometemos a hacer de la participación en nuestra comunidad sea una experiencia libre de acoso para todo el mundo, independientemente de la edad, dimensión corporal, discapacidad visible o invisible, etnicidad, características sexuales, identidad y expresión de género, nivel de experiencia, educación, nivel socio-económico, nacionalidad, apariencia personal, raza, casta, color, religión, o identidad u orientación sexual. + +Nos comprometemos a actuar e interactuar de maneras que contribuyan a una comunidad abierta, acogedora, diversa, inclusiva y sana. + +## Nuestros estándares + +Ejemplos de comportamientos que contribuyen a crear un ambiente positivo para nuestra comunidad: + +* Demostrar empatía y amabilidad ante otras personas +* Respeto a diferentes opiniones, puntos de vista y experiencias +* Dar y aceptar adecuadamente retroalimentación constructiva +* Aceptar la responsabilidad y disculparse ante quienes se vean afectados por nuestros errores, aprendiendo de la experiencia +* Centrarse en lo que sea mejor no sólo para nosotros como individuos, sino para la comunidad en general + +Ejemplos de comportamiento inaceptable: + +* El uso de lenguaje o imágenes sexualizadas, y aproximaciones o + atenciones sexuales de cualquier tipo +* Comentarios despectivos (_trolling_), insultantes o derogatorios, y ataques personales o políticos +* El acoso en público o privado +* Publicar información privada de otras personas, tales como direcciones físicas o de correo + electrónico, sin su permiso explícito +* Otras conductas que puedan ser razonablemente consideradas como inapropiadas en un + entorno profesional + +## Aplicación de las responsabilidades + +Los administradores de la comunidad son responsables de aclarar y hacer cumplir nuestros estándares de comportamiento aceptable y tomarán acciones apropiadas y correctivas de forma justa en respuesta a cualquier comportamiento que consideren inapropiado, amenazante, ofensivo o dañino. + +Los administradores de la comunidad tendrán el derecho y la responsabilidad de eliminar, editar o rechazar comentarios, _commits_, código, ediciones de páginas de wiki, _issues_ y otras contribuciones que no se alineen con este Código de Conducta, y comunicarán las razones para sus decisiones de moderación cuando sea apropiado. + +## Alcance + +Este código de conducta aplica tanto a espacios del proyecto como a espacios públicos donde un individuo esté en representación del proyecto o comunidad. Ejemplos de esto incluyen el uso de la cuenta oficial de correo electrónico, publicaciones a través de las redes sociales oficiales, o presentaciones con personas designadas en eventos en línea o no. + +## Aplicación + +Instancias de comportamiento abusivo, acosador o inaceptable de otro modo podrán ser reportadas a los administradores de la comunidad responsables del cumplimiento a través de [INSERTAR MÉTODO DE CONTACTO]. Todas las quejas serán evaluadas e investigadas de una manera puntual y justa. + +Todos los administradores de la comunidad están obligados a respetar la privacidad y la seguridad de quienes reporten incidentes. + +## Guías de Aplicación + +Los administradores de la comunidad seguirán estas Guías de Impacto en la Comunidad para determinar las consecuencias de cualquier acción que juzguen como un incumplimiento de este Código de Conducta: + +### 1. Corrección + +**Impacto en la Comunidad**: El uso de lenguaje inapropiado u otro comportamiento considerado no profesional o no acogedor en la comunidad. + +**Consecuencia**: Un aviso escrito y privado por parte de los administradores de la comunidad, proporcionando claridad alrededor de la naturaleza de este incumplimiento y una explicación de por qué el comportamiento es inaceptable. Una disculpa pública podría ser solicitada. + +### 2. Aviso + +**Impacto en la Comunidad**: Un incumplimiento causado por un único incidente o por una cadena de acciones. + +**Consecuencia**: Un aviso con consecuencias por comportamiento prolongado. No se interactúa con las personas involucradas, incluyendo interacción no solicitada con quienes se encuentran aplicando el Código de Conducta, por un periodo especificado de tiempo. Esto incluye evitar las interacciones en espacios de la comunidad, así como a través de canales externos como las redes sociales. Incumplir estos términos puede conducir a una expulsión temporal o permanente. + +### 3. Expulsión temporal + +**Impacto en la Comunidad**: Una serie de incumplimientos de los estándares de la comunidad, incluyendo comportamiento inapropiado continuo. + +**Consecuencia**: Una expulsión temporal de cualquier forma de interacción o comunicación pública con la comunidad durante un intervalo de tiempo especificado. No se permite interactuar de manera pública o privada con las personas involucradas, incluyendo interacciones no solicitadas con quienes se encuentran aplicando el Código de Conducta, durante este periodo. Incumplir estos términos puede conducir a una expulsión permanente. + +### 4. Expulsión permanente + +**Impacto en la Comunidad**: Demostrar un patrón sistemático de incumplimientos de los estándares de la comunidad, incluyendo conductas inapropiadas prolongadas en el tiempo, acoso de individuos, o agresiones o menosprecio a grupos de individuos. + +**Consecuencia**: Una expulsión permanente de cualquier tipo de interacción pública con la comunidad del proyecto. + +## Atribución + +Este Código de Conducta es una adaptación del [Contributor Covenant][homepage], versión 2.1, +disponible en https://www.contributor-covenant.org/es/version/2/1/code_of_conduct.html + +Las Guías de Impacto en la Comunidad están inspiradas en la [escalera de aplicación del código de conducta de Mozilla](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +Para respuestas a las preguntas frecuentes de este código de conducta, consulta las FAQ en +https://www.contributor-covenant.org/faq. Hay traducciones disponibles en https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..db2a926 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,105 @@ +# Contribuyendo + +[HSF training][hsf-training] es un proyecto de código abierto, +y damos la bienvenida a contribuciones de todo tipo: +nuevas lecciones, +correcciones de material existente, +informes de errores, +y revisiones de los cambios propuestos, todos son bienvenidos. + +## Acuerdo de Contribución + +Al contribuir, +aceptas que podemos redistribuir tu trabajo bajo [nuestra licencia](LICENSE.md). +A cambio, +abordaremos tus problemas y/o evaluaremos tu propuesta de cambio lo más pronto posible, +y te ayudaremos a convertirte en miembro de nuestra comunidad. +Todos los involucrados en [HSF training][hsf-training] +aceptan cumplir con nuestro [código de conducta](CODE_OF_CONDUCT.md). + +## Cómo Contribuir + +La forma más sencilla de empezar es presentar un "issue" +para informarnos sobre un error, +una redacción incómoda, +o un error factual. +Esta es una buena manera de presentarte +y conocer a algunos de los miembros de nuestra comunidad. + +1. Si no tienes una cuenta en [GitHub][github], + puedes escribir un correo electrónico a los coordinadores. + Sin embargo, + podremos responder más rápidamente si utilizas uno de los métodos descritos a continuación. + +2. Si tienes una cuenta en [GitHub][github], + o estás dispuesto a [crear una][github-join], + pero no sabes cómo usar Git, + puedes reportar problemas o sugerir mejoras [creando un issue][issues]. + Esto nos permite asignar el elemento a alguien + y responder a él en una discusión encadenada. + +3. Si te sientes cómodo con Git, + y te gustaría agregar o cambiar material, + puedes enviar un "pull request" (PR). + Las instrucciones para hacerlo están [incluidas a continuación](#using-github). + +## Qué Contribuir + +Hay muchas formas de contribuir, +desde escribir nuevos ejercicios y mejorar los existentes, +hasta actualizar o completar la documentación +y enviar [informes de errores][issues] +sobre cosas que no funcionan, no están claras o están ausentes. +Si buscas ideas, consulta la pestaña 'Issues' para ver +una lista de problemas asociados a este repositorio, +o también puedes revisar todos los problemas en [hsf-training][hsf-training-issues]. + +También hay [una lista](hsf-training-gfis) de todos los problemas que son particularmente fáciles y adecuados +para las primeras contribuciones. + +Los comentarios sobre issues y las revisiones de pull requests son igualmente bienvenidos: +somos más inteligentes juntos que por separado. +Las revisiones de principiantes y recién llegados son especialmente valiosas: +es fácil para quienes han estado utilizando estas lecciones durante un tiempo +olvidar lo impenetrable que puede ser parte de este material, +por lo que siempre se agradecen ojos nuevos. + +## Usando GitHub + +Si decides contribuir a través de GitHub, es posible que desees consultar +[Cómo Contribuir a un Proyecto de Código Abierto en GitHub][how-contribute]. +Para gestionar cambios, seguimos [el flujo de GitHub][github-flow]. +Cada lección tiene dos mantenedores que revisan problemas y pull requests o animan a otros a hacerlo. +Los mantenedores son voluntarios de la comunidad y tienen la última palabra sobre lo que se fusiona en la lección. +Para usar la interfaz web para contribuir a una lección: + +1. Haz un fork del repositorio original a tu perfil de GitHub. +2. Dentro de tu versión del repositorio forked, muévete a la rama `main` y + crea una nueva rama para cada cambio significativo que se realice. +3. Navega a los archivos que deseas cambiar dentro de las nuevas ramas y realiza las revisiones necesarias. +4. Confirma todos los archivos cambiados dentro de las ramas correspondientes. +5. Crea pull requests individuales desde cada una de tus ramas modificadas + a la rama `main` dentro del repositorio original. +6. Si recibes comentarios, realiza cambios utilizando tus ramas específicas del problema del repositorio forked y + los pull requests se actualizarán automáticamente. +7. Repite según sea necesario hasta que se haya abordado todo el feedback. + +Al comenzar a trabajar, asegúrate de que tu clon de la rama `main` original esté actualizado +antes de crear tus propias ramas específicas de revisión a partir de allí. +Además, por favor, trabaja solo desde tus ramas recién creadas y *no* +desde tu clon de la rama `main` original. +Por último, las copias publicadas de todas las lecciones están disponibles en la rama `main` del repositorio original para referencia mientras revisas. + +## Otros Recursos + +Más información sobre cómo contribuir o cómo contactarnos: [Inicio de HSF training][hsf-training] + +[hsf-training-issues]: https://github.com/issues?q=user%3Ahsf-training+is%3Aopen +[hsf-training]: https://hepsoftwarefoundation.org/workinggroups/training.html +[email]: mailto:https://groups.google.com/forum/#!forum/hsf-training-wg +[github]: https://github.com +[github-flow]: https://guides.github.com/introduction/flow/ +[github-join]: https://github.com/join +[how-contribute]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects +[issues]: https://guides.github.com/features/issues/ +[hsf-training-gfis]: https://github.com/issues?q=is%3Aissue+is%3Aopen+archived%3Afalse+sort%3Aupdated-desc+label%3A%22good+first+issue%22+org%3Ahsf-training diff --git a/LICENSE b/LICENSE new file mode 100755 index 0000000..4ea99c2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,395 @@ +Attribution 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution 4.0 International Public License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution 4.0 International Public License ("Public License"). To the +extent this Public License may be interpreted as a contract, You are +granted the Licensed Rights in consideration of Your acceptance of +these terms and conditions, and the Licensor grants You such rights in +consideration of benefits the Licensor receives from making the +Licensed Material available under these terms and conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + d. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + e. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + f. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + g. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + h. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + i. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + j. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + k. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + 4. If You Share Adapted Material You produce, the Adapter's + License You apply must not prevent recipients of the Adapted + Material from complying with this Public License. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material; and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the “Licensor.” The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 0000000..0d6fe34 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +[![HSF Training Center](https://img.shields.io/badge/HSF%20Training%20Center-browse-ff69b4)](https://hepsoftwarefoundation.org/training/curriculum.html) +# Tutorial de Scikit-HEP + +Este es un tutorial sobre [Scikit-HEP](https://scikit-hep.org), una colección de paquetes para el análisis de física de partículas en Python. + +![ecosistema scikit hep](scikit_hep_tutorial/fig/scikit-hep-logos.png) + +Fue escrito por [Jim Pivarski][jpivarski] (originalmente en inglés [aquí](https://hsf-training.github.io/hsf-training-scikit-hep-webpage/index.html), traducido por [Andrés Ríos Tascón](https://github.com/ariostas)) y se enseñó por primera vez durante un [Taller de Software Carpentry](https://indico.cern.ch/event/1097111/timetable/#day-2021-12-15) el 15 de diciembre de 2021. La versión original en inglés se puede encontrar [aquí](https://github.com/hsf-training/hsf-training-scikit-hep-webpage). + +¡Este repositorio genera una página web que está disponible [aquí](https://hsf-training.github.io/hsf-training-scikit-hep-webpage/)! + +El tutorial de Scikit-HEP es parte del [currículo de formación del HSF](https://hepsoftwarefoundation.org/training/curriculum). + +## Contribuciones + +¡Damos la bienvenida a todas las contribuciones para mejorar el tutorial! Los mantenedores harán todo lo posible por ayudarte si tienes alguna pregunta, inquietud o experimentas alguna dificultad durante el proceso. + +Nos gustaría pedirte que te familiarices con nuestra [Guía de Contribuciones](CONTRIBUTING.md) y revises las [directrices más detalladas][lesson-example] sobre el formato adecuado, cómo renderizar la lección localmente e incluso cómo escribir nuevos episodios. + +## Mantenedores + +* [Andres Rios Tascon][ariostas] + +## Autores + +Una lista de los colaboradores de la lección se puede encontrar en [AUTORES](AUTHORS). + +## Citación + +Para citar este tutorial, consulta con [CITATION](CITATION). + +[lesson-example]: https://carpentries.github.io/lesson-example +[jpivarski]: https://github.com/jpivarski/ +[carpentries]: https://software-carpentry.org/ +[ariostas]: https://github.com/ariostas/ diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..29a661a --- /dev/null +++ b/environment.yml @@ -0,0 +1,20 @@ +name: skhep-tutorial +channels: + - conda-forge + - defaults +dependencies: + - jupyter-book=1.0.3 + - uproot=5.4.1 + - xrootd=5.7.1 + - fsspec-xrootd=0.4.0 + - awkward=2.6.9 + - hist=2.8.0 + - scikit-hep-testdata=0.4.48 + - matplotlib=3.9.2 + - particle=0.25.2 + - vector=1.5.2 + - pandas=2.2.3 + - requests=2.32.3 + - aiohttp=3.10.10 + - python=3.12 + - fastjet=3.4.0.6 diff --git a/scikit_hep_tutorial/00-bienvenida.md b/scikit_hep_tutorial/00-bienvenida.md new file mode 100644 index 0000000..0371abe --- /dev/null +++ b/scikit_hep_tutorial/00-bienvenida.md @@ -0,0 +1,12 @@ +# ¡Bienvenido/a! + +Este tutorial tiene como objetivo demostrar cómo comenzar rápidamente con [Scikit-HEP](https://scikit-hep.org), una colección de paquetes para el análisis de física de partículas en Python. + +El tutorial fue escrito por [Jim Pivarski](https://github.com/jpivarski/) (originalmente en inglés [aquí](https://hsf-training.github.io/hsf-training-scikit-hep-webpage/index.html), traducido por [Andrés Ríos Tascón](https://github.com/ariostas)) y fue enseñado por primera vez durante un [Taller de Software Carpentry](https://indico.cern.ch/event/1097111/timetable/#day-2021-12-15) el 15 de diciembre de 2021. + +```{admonition} Prerrequisitos +Conocimiento básico de Python, por ejemplo, a través de la lección [Análisis y visualización de datos usando Python](https://datacarpentry.org/python-ecology-lesson-es/) +``` + +```{tableofcontents} +``` \ No newline at end of file diff --git a/scikit_hep_tutorial/01-introduccion.ipynb b/scikit_hep_tutorial/01-introduccion.ipynb new file mode 100644 index 0000000..0639cfa --- /dev/null +++ b/scikit_hep_tutorial/01-introduccion.ipynb @@ -0,0 +1,700 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Introducción: Fundamentos de Python" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## ¿Cuánto Python necesitamos saber?\n", + "\n", + "### Python básico\n", + "\n", + "La mayoría de los estudiantes comienzan este módulo después de una introducción a Python o ya están familiarizados con los *fundamentos* de Python. Por ejemplo, deberías sentirte cómodo con lo esencial de Python, como asignar variables,\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "x = 5" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "sentencias if," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "if x < 5:\n", + " print(\"pequeño\")\n", + "else:\n", + " print(\"grande\")" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "y bucles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(x):\n", + " print(i)" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Tu análisis de datos probablemente estará lleno de declaraciones como estas, aunque los tipos de operaciones en las que nos enfocaremos en este módulo tendrán una forma más parecida a\n", + "\n", + "```python\n", + "import libreria_compilada\n", + "\n", + "libreria_compilata.operacion_computacional_costosa(array_grande)\n", + "```\n", + "\n", + "El truco está en que el código del lado de Python sea lo suficientemente expresivo y el código compilado lo suficientemente general para que no necesites una nueva `libreria_compilada` para cada cosa que quieras hacer. Las librería presentadas en este módulo están diseñadas con interfaces que te permiten expresar lo que quieres hacer en Python y ejecutarlo en código compilado." + ] + }, + { + "cell_type": "markdown", + "id": "8", + "metadata": {}, + "source": [ + "### Interfaces tipo diccionario y tipo array\n", + "\n", + "Los dos tipos de datos más importantes para estas interfaces son los diccionarios" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario = {\"palabra\": 1, \"otra palabra\": 2, \"alguna otra palabra\": 3}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario[\"alguna otra palabra\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "for clave in un_diccionario:\n", + " print(clave, un_diccionario[clave])" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "y los arrays" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "un_array = np.array([0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "un_array[4]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "for x in un_array:\n", + " print(x)" + ] + }, + { + "cell_type": "markdown", + "id": "16", + "metadata": {}, + "source": [ + "Aunque estos tipos de datos son importantes, lo que es más importante son las interfaces de estos tipos. Ambos representan funciones de claves a valores:\n", + "\n", + "- los diccionarios (usualmente) mapean de cadenas a objetos de Python,\n", + "- los arrays (siempre) mapean de enteros no negativos a valores numéricos.\n", + "\n", + "La mayoría de los tipos que veremos en este módulo también mapean cadenas o enteros a datos, y usan la misma sintaxis que los diccionarios y los arrays. Si estás familiarizado con las interfaces de diccionarios y arrays, generalmente no tendrás que consultar la documentación sobre tipos parecidos a diccionarios o arrays, a menos que estés tratando de hacer algo especial.\n" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### Repaso de la interfaz de diccionario\n", + "\n", + "Para los diccionarios, las cosas que pueden ir entre corchetes (su \"dominio,\" como una función) son sus claves (`keys`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario = {\"palabra\": 1, \"otra palabra\": 2, \"alguna otra palabra\": 3}\n", + "un_diccionario.keys()" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "Nada más que estas claves puede usarse entre corchetes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario[\"algo que inventé\"]" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "a menos que haya sido agregado al diccionario." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario[\"algo que inventé\"] = 123\n", + "un_diccionario[\"algo que inventé\"]" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "Los elementos que pueden salir de un diccionario (su \"rango,\" como una función) son sus valores (`values`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario.values()" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "Puedes obtener las claves y los valores como tuplas de 2 elementos al solicitar sus artículos (`items`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "un_diccionario.items()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "for clave, valor in un_diccionario.items():\n", + " print(clave, valor)" + ] + }, + { + "cell_type": "markdown", + "id": "28", + "metadata": {}, + "source": [ + "### Repaso de la interfaz de array\n", + "\n", + "Para los arrays, las cosas que pueden ir entre corchetes (su \"dominio,\" como una función) son enteros desde cero hasta, pero sin incluir, su longitud." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "un_array = np.array([0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9])\n", + "un_array[0] # está bien\n", + "un_array[1] # está bien\n", + "un_array[9] # está bien\n", + "un_array[10] # no está bien" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "Puedes obtener la longitud de un array (y el número de claves en un diccionario) con `len`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "len(un_array)" + ] + }, + { + "cell_type": "markdown", + "id": "32", + "metadata": {}, + "source": [ + "Es importante recordar que el índice `0` corresponde al primer elemento del array, `1` al segundo, y así sucesivamente, por lo que `len(some_array)` no es un índice válido.\n", + "\n", + "Se permiten índices negativos, pero cuentan desde el final de la lista hacia el principio. Por ejemplo," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "un_array[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "devuelve el último elemento.\n", + "\n", + "**Quiz rápido:** ¿qué valor negativo devuelve el primer elemento, equivalente a `0`?\n", + "\n", + "Los arrays también se pueden rebanar o partir colocando dos puntos (`:`) entre el índice inicial y el índice final." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "un_array[2:7]" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "**Quiz rápido:** ¿por qué `7.7` no está incluido?\n", + "\n", + "Lo anterior es común a todas las secuencias de Python. Sin embargo, los arrays pueden ser multidimensionales y esto permite más tipos de rebanado." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "array3d = np.arange(2 * 3 * 5).reshape(2, 3, 5)" + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": {}, + "source": [ + "Separando dos rebanadas en los corchetes con una coma" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "array3d[:, 1:, 1:]" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "selecciona lo siguiente:\n", + "\n", + "![array3d-highlight1](fig/array3d-highlight1.png)\n", + "\n", + "**Quiz rápido:** ¿cómo seleccionas lo siguiente?\n", + "\n", + "![array3d-highlight2](fig/array3d-highlight2.png)" + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "### Filtrado con booleanos y enteros: \"cortes\"\n", + "\n", + "Además de enteros y rebanadas, los arrays pueden incluirse en los corchetes.\n", + "\n", + "Un array de booleanos con la misma longitud que el array rebanado selecciona todos los elementos que coinciden con verdadero (`True`)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "un_array = np.array([0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9])\n", + "array_booleano = np.array(\n", + " [True, True, True, True, True, False, True, False, True, False]\n", + ")\n", + "\n", + "un_array[array_booleano]" + ] + }, + { + "cell_type": "markdown", + "id": "43", + "metadata": {}, + "source": [ + "Un array de enteros selecciona elementos por índice." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": {}, + "outputs": [], + "source": [ + "un_array = np.array([0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9])\n", + "array_de_enteros = np.array([0, 1, 2, 3, 4, 6, 8])\n", + "\n", + "un_array[array_de_enteros]" + ] + }, + { + "cell_type": "markdown", + "id": "45", + "metadata": {}, + "source": [ + "El rebanado por enteros es más general que el rebanado booleano porque un array de enteros también puede cambiar el orden de los datos y repetir elementos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [ + "un_array[np.array([4, 2, 2, 2, 9, 8, 3])]" + ] + }, + { + "cell_type": "markdown", + "id": "47", + "metadata": {}, + "source": [ + "Ambos aparecen en contextos naturales. Los arrays booleanos a menudo provienen de realizar un cálculo en todos los elementos de un array que devuelve valores booleanos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48", + "metadata": {}, + "outputs": [], + "source": [ + "elementos_pares = un_array * 10 % 2 == 0\n", + "\n", + "un_array[elementos_pares]" + ] + }, + { + "cell_type": "markdown", + "id": "49", + "metadata": {}, + "source": [ + "Así es como estaremos calculando y aplicando cortes: expresiones como\n", + "\n", + "```python\n", + "corte_muon_bueno = (muones.pt > 10) & (abs(muones.eta) < 2.4)\n", + "\n", + "muones_buenos = muones[corte_muon_bueno]\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "50", + "metadata": {}, + "source": [ + "### Operadores lógicos: `&`, `|`, `~`, y paréntesis\n", + "\n", + "Si vienes de C++, podrías esperar que \"y,\" \"o,\" \"no\" sean `&&`, `||`, `!`.\n", + "\n", + "Si vienes de Python no orientado a arrays, podrías esperar que sean `and`, `or`, `not`.\n", + "\n", + "En las expresiones de arrays (¡desafortunadamente!), tenemos que usar los operadores bit a bit de Python, `&`, `|`, `~`, y asegurarnos de que las comparaciones estén rodeadas de paréntesis. Los operadores `and`, `or`, `not` de Python no se aplican a través de arrays y los operadores bit a bit tienen una precedencia de operadores sorprendente.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "51", + "metadata": {}, + "outputs": [], + "source": [ + "x = 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52", + "metadata": {}, + "outputs": [], + "source": [ + "x > -10 & x < 10 # ¡probablemente no es lo que esperas!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53", + "metadata": {}, + "outputs": [], + "source": [ + "(x > -10) & (x < 10)" + ] + }, + { + "cell_type": "markdown", + "id": "54", + "metadata": {}, + "source": [ + "![bitwise-operator-parentheses](fig/bitwise-operator-parentheses.png)" + ] + }, + { + "cell_type": "markdown", + "id": "55", + "metadata": {}, + "source": [ + "## ¿Qué es el procesamiento \"orientado a arrays\" o \"columnar\"?\n", + "\n", + "Expresiones como" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56", + "metadata": {}, + "outputs": [], + "source": [ + "elementos_pares = un_array * 10 % 2 == 0" + ] + }, + { + "cell_type": "markdown", + "id": "57", + "metadata": {}, + "source": [ + "realizan las operaciones `*`, `%`, y `==` en cada elemento de `un_array` y devuelven arrays. Sin NumPy, lo anterior tendría que escribirse como" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58", + "metadata": {}, + "outputs": [], + "source": [ + "elementos_pares = []\n", + "\n", + "for x in un_array:\n", + " elementos_pares.append(x * 10 % 2 == 0)" + ] + }, + { + "cell_type": "markdown", + "id": "59", + "metadata": {}, + "source": [ + "Esto es más engorroso cuando deseas aplicar una fórmula matemática a cada elemento de una colección, pero también es considerablemente más lento. Cada paso en un bucle `for` en Python realiza verificaciones de sanidad que son innecesarias para valores numéricos de tipo uniforme, verificaciones que se harían en tiempo de compilación en una librería compilada. NumPy *es* una librería compilada; sus operadores `*`, `%`, y `==`, así como muchas otras funciones, se realizan en bucles rápidos y compilados.\n", + "\n", + "Así es como obtenemos expresividad y velocidad. Los lenguajes con operadores que se aplican a arrays completos, en lugar de un valor escalar a la vez, se llaman lenguajes \"orientados a arrays\" o \"columnares\" (refiriéndose, por ejemplo, a las columnas de un DataFrame de Pandas).\n", + "\n", + "Bastantes lenguajes interactivos de análisis de datos están orientados a arrays, derivando del APL original. \"Orientado a arrays\" es un paradigma de programación en el mismo sentido que \"funcional\" u \"orientado a objetos\".\n", + "\n", + "![apl-timeline](fig/apl-timeline.png)\n" + ] + }, + { + "cell_type": "markdown", + "id": "60", + "metadata": {}, + "source": [ + "## ¿Qué es un \"ecosistema de software\"?\n", + "\n", + "Algunos entornos de programación, como Mathematica, Emacs y ROOT, intentan proporcionarte todo lo que necesitas en un solo paquete. Solo hay una cosa que instalar y los componentes dentro del marco deberían funcionar bien juntos porque se desarrollaron en conjunto. Sin embargo, puede ser difícil usar el marco con otros paquetes de software no relacionados.\n", + "\n", + "Los ecosistemas, como UNIX, la App Store de iOS y Python, consisten en muchos paquetes de software pequeños que hacen una sola cosa y saben cómo comunicarse con otros paquetes a través de convenciones y protocolos. Por lo general, hay un mecanismo de instalación centralizado, y es responsabilidad del usuario reunir lo que se necesita. Sin embargo, el conjunto de posibilidades es abierto y crece a medida que surgen nuevas necesidades.\n", + "\n", + "En el Python mainstream, esto significa que\n", + "\n", + "- NumPy *solo* maneja arrays,\n", + "- Pandas *solo* maneja tablas,\n", + "- Matplotlib *solo* genera gráficos,\n", + "- Jupyter *solo* proporciona una interfaz de cuaderno,\n", + "- Scikit-Learn *solo* hace aprendizaje automático,\n", + "- h5py *solo* interactúa con archivos HDF5,\n", + "- etc.\n", + "\n", + "Los paquetes de Python para física de altas energías se están desarrollando con un modelo similar:\n", + "\n", + "- Uproot *solo* lee y escribe archivos ROOT,\n", + "- Awkward Array *solo* maneja arrays de tipos irregulares,\n", + "- hist *solo* maneja histogramas,\n", + "- iminuit *solo* optimiza,\n", + "- zfit *solo* ajusta,\n", + "- Particle *solo* proporciona datos al estilo PDG,\n", + "- etc.\n", + "\n", + "Para facilitar su localización, están catalogados bajo un nombre común en [scikit-hep.org](https://scikit-hep.org).\n", + "\n", + "![scikit-hep-logos](fig/scikit-hep-logos.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/02-uproot.ipynb b/scikit_hep_tutorial/02-uproot.ipynb new file mode 100644 index 0000000..5055993 --- /dev/null +++ b/scikit_hep_tutorial/02-uproot.ipynb @@ -0,0 +1,524 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Operaciones básicas de entrada/salida de archivos con Uproot" + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## ¿Qué es Uproot?\n", + "\n", + "Uproot es un paquete de Python que lee y escribe archivos ROOT, y está *únicamente* enfocado en la lectura y escritura (sin análisis, sin gráficos, etc.). Interactúa con NumPy, Awkward Array y Pandas para cálculos, boost-histogram/hist para manipulación y visualización de histogramas, Vector para funciones y transformaciones de vectores de Lorentz, Coffea para escalado, etc.\n", + "\n", + "Uproot está implementado solo con Python y librerías de Python. No tiene una parte compilada ni requiere una versión específica de ROOT. (Esto significa que si *usas* ROOT para algo más que entrada/salida, tu elección de versión de ROOT no estará limitada por la entrada/salida).\n", + "\n", + "![abstraction-layers](fig/abstraction-layers.png)\n", + "\n", + "Como consecuencia de ser una implementación independiente de entrata/salida de ROOT, Uproot podría no ser capaz de leer/escribir ciertos tipos de datos. Qué tipos de datos no están implementados es un objetivo en constante movimiento, ya que siempre se están agregando nuevos. Una buena forma de leer datos es simplemente intentarlo y ver si Uproot genera algún error. Para la escritura, consulta las listas de tipos compatibles en la [documentación de Uproot](https://uproot.readthedocs.io/en/latest/basic.html#writing-objects-to-a-file) (cajas azules en el texto)." + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "## Leer datos desde un archivo\n", + "\n", + "### Abrir el archivo\n", + "\n", + "Para abrir un archivo para lectura, pasa el nombre del archivo a [uproot.open](https://uproot.readthedocs.io/en/latest/uproot.reading.open.html). En los scripts, es una buena práctica usar la [instrucción with de Python](https://realpython.com/python-with-statement/) para cerrar el archivo cuando termines, pero si estás trabajando de forma interactiva, puedes usar una asignación directa." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "import skhep_testdata\n", + "\n", + "nombre_del_archivo = skhep_testdata.data_path(\n", + " \"uproot-Event.root\"\n", + ") # descarga este archivo de prueba y obtiene una ruta local hacia él\n", + "\n", + "import uproot\n", + "\n", + "archivo = uproot.open(nombre_del_archivo)" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Para acceder a un archivo remoto mediante HTTP o XRootD, utiliza una URL que comience con `\"http://...\"`, `\"https://...\"`, o `\"root://...\"`. Si la interfaz de Python para XRootD no está instalada, el mensaje de error explicará cómo instalarla." + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Listar contenidos\n", + "\n", + "Este objeto \"`archivo`\" en realidad representa un directorio, y los objetos nombrados en ese directorio son accesibles a través de una interfaz similar a un diccionario. Por lo tanto, `keys`, `values`, y `items` devuelven los nombres de las claves y/o leen los datos. Si solo quieres listar los objetos sin leerlos, utiliza `keys`. (Esto es similar a `ls()` de ROOT, excepto que obtienes una lista en Python)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "archivo.keys()" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "A menudo, también querrás conocer el tipo de cada objeto, por lo que los objetos [uproot.ReadOnlyDirectory](https://uproot.readthedocs.io/en/latest/uproot.reading.ReadOnlyDirectory.html) también tienen un método `classnames`, que devuelve un diccionario de nombres de objetos a nombres de clases (sin leerlos)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "archivo.classnames()" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Lectura de un histograma\n", + "\n", + "Si estás familiarizado con ROOT, `TH1F` te resultará reconocible como histogramas y `TTree` como un conjunto de datos. Para leer uno de los histogramas, coloca su nombre entre corchetes:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "h = archivo[\"hstat\"]\n", + "h" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "Uproot no realiza ningún tipo de graficación ni manipulación de histogramas, por lo que los métodos más útiles de `h` comienzan con \"to\": `to_boost` (boost-histogram), `to_hist` (hist), `to_numpy` (la tupla de 2 elementos de NumPy que contiene el contenido y los bordes), `to_pyroot` (PyROOT), etc." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "h.to_hist().plot()" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "Los histogramas de Uproot también cumplen con el [protocolo de graficación UHI](https://uhi.readthedocs.io/en/latest/plotting.html), por lo que tienen métodos como `values` (contenidos de los bins), `variances` (errores al cuadrado) y `axes`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "h.values()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "h.variances()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "list(h.axes[0]) # \"x\", \"y\", \"z\" o 0, 1, 2" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "### Lectura de un TTree\n", + "\n", + "Un TTree representa un conjunto de datos potencialmente grande. Obtenerlo del [uproot.ReadOnlyDirectory](https://uproot.readthedocs.io/en/latest/uproot.reading.ReadOnlyDirectory.html) solo devuelve los nombres y tipos de sus TBranch. El método `show` es una forma conveniente de listar su contenido:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "t = archivo[\"T\"]\n", + "t.show()" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "Ten en cuenta que puedes obtener la misma información de `keys` (un [uproot.TTree](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html) es similar a un diccionario), `typename` e `interpretation`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "t.keys()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "t[\"event/fNtrack\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "t[\"event/fNtrack\"].typename" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "t[\"event/fNtrack\"].interpretation" + ] + }, + { + "cell_type": "markdown", + "id": "24", + "metadata": {}, + "source": [ + "(Si un [uproot.TBranch](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TBranch.TBranch.html) no tiene `interpretation`, no se puede leer con Uproot.)\n", + "\n", + "La forma más directa de leer datos de un [uproot.TBranch](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TBranch.TBranch.html) es llamando a su método `array`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25", + "metadata": {}, + "outputs": [], + "source": [ + "t[\"event/fNtrack\"].array()" + ] + }, + { + "cell_type": "markdown", + "id": "26", + "metadata": {}, + "source": [ + "Consideraremos otros métodos en la próxima lección." + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "### Leyendo un... ¿qué es eso?\n", + "\n", + "Este archivo también contiene una instancia del tipo [TProcessID](https://root.cern.ch/doc/master/classTProcessID.html). Estos tipos de objetos no son típicamente útiles en el análisis de datos, pero Uproot logra leerlo de todos modos porque sigue ciertas convenciones (tiene \"streamers de clase\"). Se presenta como un objeto genérico con una propiedad `all_members` para sus miembros de datos (a través de todas las superclases)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "archivo[\"ProcessID0\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29", + "metadata": {}, + "outputs": [], + "source": [ + "archivo[\"ProcessID0\"].all_members" + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "Aquí hay un ejemplo más útil de eso: una búsqueda de supernovas con el experimento IceCube tiene clases personalizadas para sus datos, que Uproot lee y representa como objetos con `all_members`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "31", + "metadata": {}, + "outputs": [], + "source": [ + "icecube = uproot.open(skhep_testdata.data_path(\"uproot-issue283.root\"))\n", + "icecube.classnames()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "icecube[\"config/detector\"].all_members" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "33", + "metadata": {}, + "outputs": [], + "source": [ + "icecube[\"config/detector\"].all_members[\"ChannelIDMap\"]" + ] + }, + { + "cell_type": "markdown", + "id": "34", + "metadata": {}, + "source": [ + "## Escribiendo datos en un archivo\n", + "\n", + "La capacidad de Uproot para *escribir* datos es más limitada que su capacidad para *leer* datos, pero algunos casos útiles son posibles.\n", + "\n", + "### Abrir archivos para escribir\n", + "\n", + "Primero que nada, un archivo debe ser abierto para escribir, ya sea creando un archivo completamente nuevo o actualizando uno existente." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "archivo_nuevo = uproot.recreate(\"archivo-completamente-nuevo.root\")" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "```python\n", + "archivo_existente = uproot.update(\"archivo-existente.root\")\n", + "```" + ] + }, + { + "cell_type": "markdown", + "id": "37", + "metadata": {}, + "source": [ + "(Uproot no puede escribir a través de una red; los archivos de salida deben ser locales.)" + ] + }, + { + "cell_type": "markdown", + "id": "38", + "metadata": {}, + "source": [ + "### Escribiendo cadenas y histogramas\n", + "\n", + "Estos objetos [uproot.WritableDirectory](https://uproot.readthedocs.io/en/latest/uproot.writing.writable.WritableDirectory.html) tienen una interfaz similar a un diccionario: puedes poner datos en ellos asignando a corchetes.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39", + "metadata": {}, + "outputs": [], + "source": [ + "archivo_nuevo[\"una_cadena\"] = \"Este objeto va a ser un TObjString.\"\n", + "\n", + "archivo_nuevo[\"un_histograma\"] = archivo[\"hstat\"]\n", + "\n", + "import numpy as np\n", + "\n", + "archivo_nuevo[\"un_directorio/otro_histograma\"] = np.histogram(\n", + " np.random.normal(0, 1, 1000000)\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "40", + "metadata": {}, + "source": [ + "En ROOT, el nombre de un objeto es una propiedad del objeto, pero en Uproot, es una clave en el TDirectory que contiene el objeto, por lo que el nombre está en el lado izquierdo de la asignación, entre corchetes. Solo se admiten los tipos de datos enumerados en el cuadro azul [en la documentación](https://uproot.readthedocs.io/en/latest/basic.html#writing-objects-to-a-file): principalmente solo histogramas." + ] + }, + { + "cell_type": "markdown", + "id": "41", + "metadata": {}, + "source": [ + "### Escribiendo TTrees\n", + "\n", + "Los TTrees son potencialmente grandes y pueden no caber en la memoria. Generalmente, necesitarás escribirlos en lotes.\n", + "\n", + "Una forma de hacer esto es asignar el primer lote y `extend` con lotes posteriores:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "archivo_nuevo[\"tree1\"] = {\n", + " \"x\": np.random.randint(0, 10, 1000000),\n", + " \"y\": np.random.normal(0, 1, 1000000),\n", + "}\n", + "archivo_nuevo[\"tree1\"].extend(\n", + " {\"x\": np.random.randint(0, 10, 1000000), \"y\": np.random.normal(0, 1, 1000000)}\n", + ")\n", + "archivo_nuevo[\"tree1\"].extend(\n", + " {\"x\": np.random.randint(0, 10, 1000000), \"y\": np.random.normal(0, 1, 1000000)}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "43", + "metadata": {}, + "source": [ + "Otra forma es crear un TTree vacío con [uproot.WritableDirectory.mktree](https://uproot.readthedocs.io/en/latest/uproot.writing.writable.WritableDirectory.html#mktree), de modo que cada escritura sea una extensión." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "44", + "metadata": {}, + "outputs": [], + "source": [ + "archivo_nuevo.mktree(\"tree2\", {\"x\": np.int32, \"y\": np.float64})\n", + "archivo_nuevo[\"tree2\"].extend(\n", + " {\"x\": np.random.randint(0, 10, 1000000), \"y\": np.random.normal(0, 1, 1000000)}\n", + ")\n", + "archivo_nuevo[\"tree2\"].extend(\n", + " {\"x\": np.random.randint(0, 10, 1000000), \"y\": np.random.normal(0, 1, 1000000)}\n", + ")\n", + "archivo_nuevo[\"tree2\"].extend(\n", + " {\"x\": np.random.randint(0, 10, 1000000), \"y\": np.random.normal(0, 1, 1000000)}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "45", + "metadata": {}, + "source": [ + "Se dan consejos de rendimiento en la próxima lección, pero en general, es más beneficioso escribir pocos lotes grandes en lugar de muchos lotes pequeños.\n", + "\n", + "Los únicos tipos de datos que se pueden asignar o pasar a `extend` están listados en la caja azul [en esta documentación](https://uproot.readthedocs.io/en/latest/basic.html#writing-ttrees-to-a-file). Esto incluye arrays dentados (descritos en la lección después de la próxima), pero no tipos más complejos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "46", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/03-ttree.ipynb b/scikit_hep_tutorial/03-ttree.ipynb new file mode 100644 index 0000000..df5b417 --- /dev/null +++ b/scikit_hep_tutorial/03-ttree.ipynb @@ -0,0 +1,393 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Detalles de TTree\n", + "\n", + "## Estructura y terminología de archivos ROOT\n", + "\n", + "Un archivo ROOT ([ROOT TFile](https://root.cern.ch/doc/master/classTFile.html), [uproot.ReadOnlyFile](https://uproot.readthedocs.io/en/latest/uproot.reading.ReadOnlyFile.html)) es como un pequeño sistema de archivos que contiene directorios anidados ([ROOT TDirectory](https://root.cern.ch/doc/master/classTDirectory.html), [uproot.ReadOnlyDirectory](https://uproot.readthedocs.io/en/latest/uproot.reading.ReadOnlyDirectory.html)). En Uproot, los directorios anidados se presentan como diccionarios anidados.\n", + "\n", + "Cualquier instancia de clase ([ROOT TObject](https://root.cern.ch/doc/master/classTObject.html), [uproot.Model](https://uproot.readthedocs.io/en/latest/uproot.model.Model.html)) puede almacenarse en un directorio, incluidos tipos como histogramas (por ejemplo, [ROOT TH1](https://root.cern.ch/doc/master/classTH1.html), [uproot.behaviors.TH1.TH1](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TH1.TH1.html)).\n", + "\n", + "Una de estas clases, TTree ([ROOT TTree](https://root.cern.ch/doc/master/classTTree.html), [uproot.TTree](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html)), es una puerta de entrada a conjuntos de datos grandes. Un TTree es algo parecido a un DataFrame de Pandas en el sentido de que representa una tabla de datos. Las columnas se llaman TBranches ([ROOT TBranch](https://root.cern.ch/doc/master/classTBranch.html), [uproot.TBranch](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TBranch.TBranch.html)), que pueden ser anidadas (a diferencia de Pandas), y los datos pueden tener cualquier tipo de C++ (a diferencia de Pandas, que puede almacenar cualquier tipo de Python).\n", + "\n", + "Un TTree a menudo es demasiado grande para caber en la memoria, y a veces (raramente) incluso una sola TBranch es demasiado grande para caber en la memoria. Cada TBranch se divide en TBaskets ([ROOT TBasket](https://root.cern/doc/master/classTBasket.html), [uproot.models.TBasket.Model_TBasket](https://uproot.readthedocs.io/en/latest/uproot.models.TBasket.Model_TBasket.html)), que son \"lotes\" de datos. (Estos son los mismos lotes que cada llamada a `extend` escribe en la lección anterior.) Los TBaskets son la unidad más pequeña que se puede leer de un TTree: si deseas leer la primera entrada, debes leer el primer TBasket.\n", + "\n", + "![terminology](fig/terminology.png)\n", + "\n", + "Como analista de datos, probablemente te ocuparás de los TTrees y TBranches de manera directa, pero solo de los TBaskets cuando surjan problemas de eficiencia. Los archivos con TBaskets grandes pueden requerir mucha memoria para leer; los archivos con TBaskets pequeños serán más lentos de leer (en ROOT también, pero especialmente en Uproot). Los TBaskets del tamaño de megabytes suelen ser ideales." + ] + }, + { + "cell_type": "markdown", + "id": "1", + "metadata": {}, + "source": [ + "## Ejemplos con un TTree grande\n", + "\n", + "[Este archivo](http://opendata.web.cern.ch/record/12341) tiene 2.1 GB y está alojado en el Portal de Datos Abiertos de CERN." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "import uproot\n", + "\n", + "archivo = uproot.open(\n", + " \"root://eospublic.cern.ch//eos/opendata/cms/derived-data/AOD2NanoAODOutreachTool/Run2012BC_DoubleMuParked_Muons.root\"\n", + ")\n", + "archivo.classnames()" + ] + }, + { + "cell_type": "markdown", + "id": "3", + "metadata": {}, + "source": [ + "```{admonition} ¿Por qué el ;74 y ;75?\n", + "Tal vez te hayas preguntado sobre los números después de los puntos y comas. Estos son los \"números de ciclo\" de ROOT, que permiten distinguir objetos con el mismo nombre. Se utilizan cuando un objeto necesita sobrescribirse a medida que crece sin perder la última copia válida de ese objeto, de modo que un archivo ROOT pueda leerse incluso si el proceso de escritura falló a mitad de camino.\n", + "\n", + "En este caso, la última versión de este TTree es el número 75, y el número 74 es la penúltima.\n", + "\n", + "Si no especificas números de ciclo, Uproot seleccionará el último por ti, lo cual es casi siempre lo que deseas. (En otras palabras, puedes ignorarlos.)\n", + "```\n", + "\n", + "Simplemente solicitando el objeto [uproot.TTree](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html) e imprimiendolo *no* lee todo el conjunto de datos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "tree = archivo[\"Events\"]\n", + "tree.show()" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Leyendo una parte de un TTree\n", + "\n", + "En la lección anterior, aprendimos que la forma más directa de leer una TBranch es llamando a [uproot.TBranch.array](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TBranch.TBranch.html#array)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "tree[\"nMuon\"].array()" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Sin embargo, toma mucho tiempo porque se tiene que enviar una gran cantidad de datos a través de la red.\n", + "\n", + "Para limitar la cantidad de datos leídos, establece `entry_start` y `entry_stop` en el rango que desees. El `entry_start` es inclusivo, `entry_stop` es exclusivo, y la primera entrada se indexaría por `0`, al igual que los cortes en una interfaz de arreglo (primera lección). Uproot solo lee la cantidad de TBaskets necesarias para proporcionar estas entradas." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "tree[\"nMuon\"].array(entry_start=1_000, entry_stop=2_000)" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "Estos son los bloques de construcción de un lector de datos en paralelo: cada uno es responsable de un fragmento diferente. (Consulta también [uproot.TTree.num_entries_for](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#num-entries-for) y [uproot.TTree.common_entry_offsets](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#common-entry-offsets), que se pueden usar para elegir `entry_start`/`entry_stop` de manera óptima.)" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "### Leer múltiples TBranches a la vez\n", + "\n", + "Supongamos que sabes que necesitarás todos los TBranches de muones. Pedirlos en una sola solicitud es más eficiente que solicitarlos individualmente, porque el servidor puede estar trabajando en la lectura de los TBaskets posteriores del disco mientras los TBaskets anteriores se envían a ti a través de la red. Mientras que un TBranch tiene un método `array`, el TTree tiene un método `arrays` (en plural) para obtener múltiples arreglos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "muones = tree.arrays(\n", + " [\"Muon_pt\", \"Muon_eta\", \"Muon_phi\", \"Muon_mass\", \"Muon_charge\"], entry_stop=1_000\n", + ")\n", + "muones" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "Ahora, los cinco TBranches están en la salida, `muones`, que es un Awkward Array. Un Awkward Array de múltiples TBranches tiene una interfaz similar a un diccionario, por lo que podemos obtener cada variable de él por" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "muones[\"Muon_pt\"]\n", + "muones[\"Muon_eta\"]\n", + "muones[\"Muon_phi\"] # etc." + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "````{admonition} ¡Cuidado! ¡Es tree.arrays lo que realmente lee los datos!\n", + "Si no tienes cuidado con la llamada a [uproot.TTree.arrays](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#arrays), podrías terminar esperando mucho tiempo por datos que no necesitas o podrías quedarte sin memoria. Leer todo con\n", + "\n", + "```python\n", + "todo = tree.arrays()\n", + "```\n", + "y luego seleccionar los arrays que deseas generalmente no es una buena idea. Al menos, establece un `entry_stop`.\n", + "````" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "### Selección de TBranches por nombre\n", + "\n", + "Supongamos que tienes muchos TBranches de muones y no quieres enumerarlos todos. Tanto [uproot.TTree.keys](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#keys) como [uproot.TTree.arrays](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#arrays) aceptan un argumento `filter_name` que puede seleccionarlos de varias maneras (consulta la documentación). En particular, es recomendable usar primero `keys` para saber qué ramas coinciden con tu filtro, seguido de `arrays` para leerlas realmente." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "tree.keys(filter_name=\"Muon_*\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "tree.arrays(filter_name=\"Muon_*\", entry_stop=1_000)" + ] + }, + { + "cell_type": "markdown", + "id": "18", + "metadata": {}, + "source": [ + "(También hay `filter_typename` y `filter_branch` para más opciones.)" + ] + }, + { + "cell_type": "markdown", + "id": "19", + "metadata": {}, + "source": [ + "## Escalando, haciendo un gráfico\n", + "\n", + "La mejor manera de entender lo que estás haciendo es experimentar con conjuntos de datos pequeños y luego escalarlos. Aquí, tomamos 1000 eventos y calculamos las masas de dimuones." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "muones = tree.arrays(entry_stop=1_000)\n", + "corte = muones[\"nMuon\"] == 2\n", + "\n", + "pt0 = muones[\"Muon_pt\", corte, 0]\n", + "pt1 = muones[\"Muon_pt\", corte, 1]\n", + "eta0 = muones[\"Muon_eta\", corte, 0]\n", + "eta1 = muones[\"Muon_eta\", corte, 1]\n", + "phi0 = muones[\"Muon_phi\", corte, 0]\n", + "phi1 = muones[\"Muon_phi\", corte, 1]\n", + "\n", + "import numpy as np\n", + "\n", + "masa = np.sqrt(2 * pt0 * pt1 * (np.cosh(eta0 - eta1) - np.cos(phi0 - phi1)))\n", + "\n", + "import hist\n", + "\n", + "histmasa = hist.Hist(hist.axis.Regular(120, 0, 120, label=\"masa [GeV]\"))\n", + "histmasa.fill(masa)\n", + "histmasa.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "21", + "metadata": {}, + "source": [ + "Eso funcionó (hay un pico en Z). Ahora, para hacer esto en todo el archivo, debemos tener más cuidado con lo que estamos leyendo." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22", + "metadata": {}, + "outputs": [], + "source": [ + "tree.keys(filter_name=[\"nMuon\", \"/Muon_(pt|eta|phi)/\"])" + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "y acumular datos gradualmente con [uproot.TTree.iterate](https://uproot.readthedocs.io/en/latest/uproot.behaviors.TTree.TTree.html#iterate). Esto maneja `entry_start`/`entry_stop` en un bucle." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "histmasa = hist.Hist(hist.axis.Regular(120, 0, 120, label=\"masa [GeV]\"))\n", + "\n", + "for muones in tree.iterate(filter_name=[\"nMuon\", \"/Muon_(pt|eta|phi)/\"]):\n", + " cut = muones[\"nMuon\"] == 2\n", + " pt0 = muones[\"Muon_pt\", cut, 0]\n", + " pt1 = muones[\"Muon_pt\", cut, 1]\n", + " eta0 = muones[\"Muon_eta\", cut, 0]\n", + " eta1 = muones[\"Muon_eta\", cut, 1]\n", + " phi0 = muones[\"Muon_phi\", cut, 0]\n", + " phi1 = muones[\"Muon_phi\", cut, 1]\n", + " masa = np.sqrt(2 * pt0 * pt1 * (np.cosh(eta0 - eta1) - np.cos(phi0 - phi1)))\n", + " histmasa.fill(masa)\n", + " print(histmasa.sum() / tree.num_entries)\n", + "\n", + "histmasa.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "### Obtener datos en NumPy o Pandas\n", + "\n", + "En todos los ejemplos anteriores, los métodos `array`, `arrays` e `iterate` devuelven arreglos Awkward. La biblioteca Awkward es útil para este tipo de datos (arreglos irregulares: más en la próxima lección), pero es posible que estés trabajando con bibliotecas que solo reconocen arreglos de NumPy o DataFrames de Pandas.\n", + "\n", + "Utiliza `library=\"np\"` o `library=\"pd\"` para obtener NumPy o Pandas, respectivamente." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "tree[\"nMuon\"].array(library=\"np\", entry_stop=10_000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27", + "metadata": {}, + "outputs": [], + "source": [ + "tree.arrays(library=\"np\", entry_stop=10_000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "tree.arrays(library=\"pd\", entry_stop=10_000)" + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": {}, + "source": [ + "NumPy es excelente para datos no irregulares como la rama `\"nMuon\"`, pero tiene que representar un número desconocido de muones por evento como un arreglo de arreglos de NumPy (es decir, objetos de Python).\n", + "\n", + "Pandas se puede hacer representar múltiples partículas por evento colocando esta estructura en un [pd.MultiIndex](https://pandas.pydata.org/pandas-docs/stable/user_guide/advanced.html), pero no cuando el DataFrame contiene más de un tipo de partícula (por ejemplo, muones *y* electrones). Usa DataFrames separados para estos casos. Si ayuda, ten en cuenta que hay otra ruta a DataFrames: leyendo los datos como un Arreglo Awkward y llamando a [ak.to_pandas](https://awkward-array.readthedocs.io/en/latest/_auto/ak.to_pandas.html) sobre él. (Algunos métodos usan más memoria que otros, y he encontrado que Pandas es inusualmente intensivo en memoria.)\n", + "\n", + "O usa Arreglos Awkward (próxima lección)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "30", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/04-awkward.ipynb b/scikit_hep_tutorial/04-awkward.ipynb new file mode 100644 index 0000000..29ff476 --- /dev/null +++ b/scikit_hep_tutorial/04-awkward.ipynb @@ -0,0 +1,767 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Arreglos irregulares, desiguales y Awkward Array\n", + "\n", + "## ¿Qué es Awkward Array?\n", + "\n", + "La lección anterior incluía un corte complicado:\n", + "\n", + "```python\n", + "corte = muones[\"nMuon\"] == 2\n", + "\n", + "pt0 = muones[\"Muon_pt\", corte, 0]\n", + "```\n", + "\n", + "Las tres partes de `muones[\"Muon_pt\", corte, 0]` son:\n", + "\n", + "1. selecciona el campo `\"Muon_pt\"` de todos los registros en la matriz,\n", + "2. aplica `corte`, una matriz booleana, para seleccionar solo los eventos con dos muones,\n", + "3. selecciona el primer (`0`) muón de cada uno de esos pares. De manera similar, para el segundo (`1`) muón.\n", + "\n", + "NumPy no podría realizar un corte así, ni siquiera representar una matriz de listas de longitud variable sin recurrir a arreglos de objetos." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "np.array([[0.0, 1.1, 2.2], [], [3.3, 4.4], [5.5], [6.6, 7.7, 8.8, 9.9]])" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "Awkward Array está diseñado para llenar este vacío:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "import awkward as ak\n", + "\n", + "ak.Array([[0.0, 1.1, 2.2], [], [3.3, 4.4], [5.5], [6.6, 7.7, 8.8, 9.9]])" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Arreglos como este se llaman \"irregulares\" o \"desiguales\" (en inglés, [\"jagged arrays\"](https://en.wikipedia.org/wiki/Jagged_array) o a veces \"ragged arrays\")." + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Rebanadas en Awkward Array\n", + "\n", + "Las rebanadas básicas son una generalización de los de NumPy. Lo que NumPy haría si tuviera listas de longitud variable." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "array = ak.Array([[0.0, 1.1, 2.2], [], [3.3, 4.4], [5.5], [6.6, 7.7, 8.8, 9.9]])\n", + "array.tolist()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "array[2]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "array[-1, 1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "array[2:, 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "array[2:, 1:]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "array[:, 0]" + ] + }, + { + "cell_type": "markdown", + "id": "12", + "metadata": {}, + "source": [ + "**Quiz rápido:** ¿por qué el último genera un error?\n", + "\n", + "Las rebanadas con booleanos y enteros también funcionan." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "array[[True, False, True, False, True]]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "array[[2, 3, 3, 1]]" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "Como en NumPy, se pueden calcular arreglos booleanos para rebanadas, y funciones como [ak.num](https://awkward-array.readthedocs.io/en/latest/_auto/ak.num.html) son útiles para eso." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "ak.num(array)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "ak.num(array) > 0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "array[ak.num(array) > 0, 0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "array[ak.num(array) > 1, 1]" + ] + }, + { + "cell_type": "markdown", + "id": "20", + "metadata": {}, + "source": [ + "Ahora considera esto (similar a un ejemplo de la primera lección):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "corte = array * 10 % 2 == 0\n", + "\n", + "array[corte]" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "Este arreglo, `corte`, no es solo un arreglo de booleanos. Es un arreglo irrecular de booleanos. Todas sus listas anidadas encajan en las listas anidadas de `array`, por lo que puede seleccionar profundamente números, en lugar de seleccionar listas." + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "### Aplicación: seleccionando partículas, en lugar de eventos\n", + "\n", + "Volviendo al TTree grande de la lección anterior," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "import uproot\n", + "\n", + "archivo = uproot.open(\n", + " \"root://eospublic.cern.ch//eos/opendata/cms/derived-data/AOD2NanoAODOutreachTool/Run2012BC_DoubleMuParked_Muons.root\"\n", + ")\n", + "tree = archivo[\"Events\"]\n", + "\n", + "muon_pt = tree[\"Muon_pt\"].array(entry_stop=10)\n", + "muon_pt" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "Este arreglo irregular de booleanos selecciona todos los *muones* con al menos 20 GeV:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "corte_particula = muon_pt > 20\n", + "\n", + "muon_pt[corte_particula]" + ] + }, + { + "cell_type": "markdown", + "id": "27", + "metadata": {}, + "source": [ + "y este arreglo de booleanos no irregular (hecho con [ak.any](https://awkward-array.readthedocs.io/en/latest/_auto/ak.any.html)) selecciona todos los eventos *que tienen* un muón con al menos 20 GeV:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "28", + "metadata": {}, + "outputs": [], + "source": [ + "corte_evento = ak.any(muon_pt > 20, axis=1)\n", + "\n", + "muon_pt[corte_evento]" + ] + }, + { + "cell_type": "markdown", + "id": "29", + "metadata": {}, + "source": [ + "**Quiz rápido:** construye exactamente el mismo `corte_evento` utilizando [ak.max](https://awkward-array.readthedocs.io/en/latest/_auto/ak.max.html).\n", + "\n", + "**Quiz rápido:** aplica ambos cortes; es decir, selecciona muones con más de 20 GeV de los eventos que los tienen.\n", + "\n", + "Sugerencia: querrás hacer un\n", + "\n", + "```python\n", + "muones_seleccionados = muon_pt[corte_particula]\n", + "```\n", + "intermediario y no puedes usar la variable `corte_evento` tal como está.\n", + "\n", + "Sugerencia: el resultado final debería ser un arreglo irregular, al igual que `muon_pt`, pero con menos listas y menos elementos en esas listas." + ] + }, + { + "cell_type": "markdown", + "id": "30", + "metadata": {}, + "source": [ + "````{admonition} Solución\n", + ":class: dropdown\n", + "```python\n", + "muones_seleccionados = muon_pt[corte_particula]\n", + "resultado_final = muones_seleccionados[corte_evento]\n", + "resultado_final.tolist()\n", + "```\n", + "````" + ] + }, + { + "cell_type": "markdown", + "id": "31", + "metadata": {}, + "source": [ + "## Combinatoria en Awkward Array\n", + "\n", + "Las listas de longitud variable presentan más problemas que solo el corte y el cálculo de fórmulas en arrays. A menudo, queremos combinar partículas en todos los pares posibles (dentro de cada evento) para buscar cadenas de descomposición.\n", + "\n", + "### Pares de dos arrays, pares de un solo array\n", + "\n", + "Awkward Array tiene funciones que generan estas combinaciones. Por ejemplo, [ak.cartesian](https://awkward-array.readthedocs.io/en/latest/_auto/ak.cartesian.html) toma un producto cartesiano por evento (cuando `axis=1`, el valor predeterminado).\n", + "\n", + "![cartoon-cartesian](fig/cartoon-cartesian.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "32", + "metadata": {}, + "outputs": [], + "source": [ + "numeros = ak.Array([[1, 2, 3], [], [5, 7], [11]])\n", + "letras = ak.Array([[\"a\", \"b\"], [\"c\"], [\"d\"], [\"e\", \"f\"]])\n", + "\n", + "pares = ak.cartesian((numeros, letras))\n", + "pares" + ] + }, + { + "cell_type": "markdown", + "id": "33", + "metadata": {}, + "source": [ + "Estos `pares` son 2-tuplas, que son como registros en cómo se extraen de un array: usando cadenas." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34", + "metadata": {}, + "outputs": [], + "source": [ + "pares[\"0\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "35", + "metadata": {}, + "outputs": [], + "source": [ + "pares[\"1\"]" + ] + }, + { + "cell_type": "markdown", + "id": "36", + "metadata": {}, + "source": [ + "También hay [ak.unzip](https://awkward-array.readthedocs.io/en/latest/_auto/ak.unzip.html), que extrae cada campo en un array separado (lo opuesto de [ak.zip](https://awkward-array.readthedocs.io/en/latest/_auto/ak.zip.html))." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37", + "metadata": {}, + "outputs": [], + "source": [ + "izquierda, derecha = ak.unzip(pares)\n", + "izquierda" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "38", + "metadata": {}, + "outputs": [], + "source": [ + "derecha" + ] + }, + { + "cell_type": "markdown", + "id": "39", + "metadata": {}, + "source": [ + "Tenga en cuenta que estos `izquierda` y `derecha` no son los `numeros` y `letras` originales: han sido duplicados y tienen la misma forma.\n", + "\n", + "El producto cartesiano es equivalente a este bucle `for` en C++ sobre dos colecciones:\n", + "\n", + "```cpp\n", + "for (int i = 0; i < numeros.size(); i++) {\n", + " for (int j = 0; j < letras.size(); j++) {\n", + " // formula con numeros[i] y letras[j]\n", + " }\n", + "}\n", + "```\n", + "\n", + "A veces, sin embargo, queremos encontrar todos los pares dentro de una sola colección, sin repetición. Eso sería equivalente a este bucle `for` en C++:\n", + "\n", + "```cpp\n", + "for (int i = 0; i < numeros.size(); i++) {\n", + " for (int j = i + 1; i < numeros.size(); j++) {\n", + " // formula con numeros[i] y numeros[j]\n", + " }\n", + "}\n", + "```\n", + "\n", + "La función Awkward para este caso es [ak.combinations](https://awkward-array.readthedocs.io/en/latest/_auto/ak.combinations.html).\n", + "\n", + "![cartoon-combinations](fig/cartoon-combinations.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "40", + "metadata": {}, + "outputs": [], + "source": [ + "pares = ak.combinations(numeros, 2)\n", + "pares" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "41", + "metadata": {}, + "outputs": [], + "source": [ + "izquierda, derecha = ak.unzip(pares)\n", + "izquierda * derecha # Se alinean, por lo que podemos calcular fórmulas" + ] + }, + { + "cell_type": "markdown", + "id": "42", + "metadata": {}, + "source": [ + "### Aplicación a los dimuones\n", + "\n", + "La búsqueda de dimuones en la lección anterior fue un poco ingenua en el sentido de que requeríamos *exactamente dos* muones en cada evento y solo calculamos la masa de esa combinación. Si hubiera un tercer muón presente debido a una compleja descomposición electrodébil o porque algo fue medido incorrectamente, estaríamos ciegos a los otros dos muones. Podrían ser dimuones reales.\n", + "\n", + "Un mejor procedimiento sería buscar todos los pares de muones en un evento y aplicar algunos criterios para seleccionarlos.\n", + "\n", + "En este ejemplo, juntaremos (usando [ak.zip](https://awkward-array.readthedocs.io/en/latest/_auto/ak.zip.html)) las variables de los muones en registros." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43", + "metadata": {}, + "outputs": [], + "source": [ + "import uproot\n", + "import awkward as ak\n", + "\n", + "archivo = uproot.open(\n", + " \"root://eospublic.cern.ch//eos/opendata/cms/derived-data/AOD2NanoAODOutreachTool/Run2012BC_DoubleMuParked_Muons.root\"\n", + ")\n", + "tree = archivo[\"Events\"]\n", + "\n", + "arrays = tree.arrays(filter_name=\"/Muon_(pt|eta|phi|charge)/\", entry_stop=10000)\n", + "\n", + "muones = ak.zip(\n", + " {\n", + " \"pt\": arrays[\"Muon_pt\"],\n", + " \"eta\": arrays[\"Muon_eta\"],\n", + " \"phi\": arrays[\"Muon_phi\"],\n", + " \"charge\": arrays[\"Muon_charge\"],\n", + " }\n", + ")\n", + "\n", + "print(arrays.type)\n", + "print(muones.type)" + ] + }, + { + "cell_type": "markdown", + "id": "44", + "metadata": {}, + "source": [ + "La diferencia entre `arrays` y `muones` es que `arrays` contiene listas separadas de `\"Muon_pt\"`, `\"Muon_eta\"`, `\"Muon_phi\"`, `\"Muon_charge\"`, mientras que `muons` contiene listas de registros con los campos `\"pt\"`, `\"eta\"`, `\"phi\"`, `\"charge\"`.\n", + "\n", + "Ahora podemos calcular pares de *objetos* muones." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45", + "metadata": {}, + "outputs": [], + "source": [ + "pares = ak.combinations(muons, 2)\n", + "pares.type" + ] + }, + { + "cell_type": "markdown", + "id": "46", + "metadata": {}, + "source": [ + "y separarlos en arreglos del primer muón y del segundo muón en cada par." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47", + "metadata": {}, + "outputs": [], + "source": [ + "mu1, mu2 = ak.unzip(pares)" + ] + }, + { + "cell_type": "markdown", + "id": "48", + "metadata": {}, + "source": [ + "**Quiz rápido:** ¿cómo garantizarías que todas las listas de registros en `mu1` y `mu2` tengan las mismas longitudes? Sugerencia: consulta [ak.num](https://awkward-array.readthedocs.io/en/latest/_auto/ak.num.html) y [ak.all](https://awkward-array.readthedocs.io/en/latest/_auto/ak.all.html).\n", + "\n", + "Dado que tienen las mismas longitudes, podemos usarlos en una fórmula." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "masa = np.sqrt(\n", + " 2 * mu1.pt * mu2.pt * (np.cosh(mu1.eta - mu2.eta) - np.cos(mu1.phi - mu2.phi))\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "50", + "metadata": {}, + "source": [ + "**Quiz rápido:** ¿cuántas masas tenemos en cada evento? ¿Cómo se compara esto con `muons`, `mu1` y `mu2`?" + ] + }, + { + "cell_type": "markdown", + "id": "51", + "metadata": {}, + "source": [ + "### Graficando el arreglo irregular\n", + "\n", + "Dado que esta `masa` es un arreglo irregular, no se puede histogramar directamente. Los histogramas toman un conjunto de *números* como entradas, pero este arreglo contiene *listas*.\n", + "\n", + "Suponiendo que solo deseas graficar los números de las listas, puedes usar [ak.flatten](https://awkward-array.readthedocs.io/en/latest/_auto/ak.flatten.html) para aplanar un nivel de lista o [ak.ravel](https://awkward-array.readthedocs.io/en/latest/_auto/ak.ravel.html) para aplanar todos los niveles." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52", + "metadata": {}, + "outputs": [], + "source": [ + "import hist\n", + "\n", + "hist.Hist(hist.axis.Regular(120, 0, 120, label=\"masa [GeV]\")).fill(\n", + " ak.ravel(masa)\n", + ").plot()" + ] + }, + { + "cell_type": "markdown", + "id": "53", + "metadata": {}, + "source": [ + "Alternativamente, supongamos que deseas graficar la *máxima* masa candidata en cada evento, sesgándola hacia los bosones Z. [ak.max](https://awkward-array.readthedocs.io/en/latest/_auto/ak.max.html) es una función diferente que selecciona un elemento de cada lista, cuando se utiliza con `axis=1`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "54", + "metadata": {}, + "outputs": [], + "source": [ + "ak.max(masa, axis=1)" + ] + }, + { + "cell_type": "markdown", + "id": "55", + "metadata": {}, + "source": [ + "Algunos valores son `None` porque no hay un máximo en una lista vacía. [ak.flatten](https://awkward-array.readthedocs.io/en/latest/_auto/ak.flatten.html)/[ak.ravel](https://awkward-array.readthedocs.io/en/latest/_auto/ak.ravel.html) eliminan los valores faltantes (`None`) así como aplastan las listas," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56", + "metadata": {}, + "outputs": [], + "source": [ + "ak.flatten(ak.max(masa, axis=1), axis=0)" + ] + }, + { + "cell_type": "markdown", + "id": "57", + "metadata": {}, + "source": [ + "pero también lo hace eliminar las listas vacías en primer lugar." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58", + "metadata": {}, + "outputs": [], + "source": [ + "ak.max(masa[ak.num(masa) > 0], axis=1)" + ] + }, + { + "cell_type": "markdown", + "id": "59", + "metadata": {}, + "source": [ + "`````{admonition} Ejercicio: seleccionar pares de muones con cargas opuestas\n", + "Este no es un corte a nivel de evento ni un corte a nivel de partículas, es un corte sobre *pares* de partículas.\n", + "\n", + "````{toggle} Solución\n", + "Las variables `mu1` y `mu2` son las mitades izquierda y derecha de los pares de muones. Por lo tanto,\n", + "\n", + "```python\n", + "corte = (mu1.charge != mu2.charge)\n", + "```\n", + "tiene la multiplicidad correcta para aplicarse a la matriz `masa`.\n", + "\n", + "```python\n", + "hist.Hist(hist.axis.Regular(120, 0, 120, label=\"masa [GeV]\")).fill(\n", + " ak.ravel(mass[cut])\n", + ").plot()\n", + "```\n", + "plotea los pares de muones seleccionados.\n", + "````\n", + "`````" + ] + }, + { + "cell_type": "markdown", + "id": "60", + "metadata": {}, + "source": [ + "`````{admonition} Ejercicio (más difícil): traza el candidato a masa por evento que esté estrictamente más cercano a la masa del Z\n", + "En lugar de solo tomar la masa máxima en cada evento, encuentra la que tenga la diferencia mínima entre la masa calculada y `masa_z = 91`.\n", + "\n", + "Sugerencia: usa [ak.argmin](https://awkward-array.readthedocs.io/en/latest/_auto/ak.argmin.html) con `keepdims=True`.\n", + "\n", + "Anticipando una de las futuras lecciones, podrías obtener una masa más precisa pidiendo a la librería Particle:\n", + "\n", + "```python\n", + "import particle, hepunits\n", + "\n", + "masa_z = particle.Particle.findall(\"Z0\")[0].mass / hepunits.GeV\n", + "```\n", + "\n", + "````{toggle} Solución\n", + "En lugar de maximizar `masa`, queremos minimizar `abs(masa - masa_z)` y aplicar esa elección a `masa`. [ak.argmin](https://awkward-array.readthedocs.io/en/latest/_auto/ak.argmin.html) devuelve la *posición del índice* de esta diferencia mínima, que luego podemos aplicar a la `masa` original. Sin embargo, sin `keepdims=True`, [ak.argmin](https://awkward-array.readthedocs.io/en/latest/_auto/ak.argmin.html) elimina la dimensión que necesitaríamos para que esta matriz tenga la misma forma anidada que `masa`. Por lo tanto, usamos `keepdims=True` y luego utilizamos [ak.ravel](https://awkward-array.readthedocs.io/en/latest/_auto/ak.ravel.html) para deshacernos de los valores faltantes y aplanar las listas.\n", + "\n", + "El último paso requeriría dos aplicaciones de [ak.flatten](https://awkward-array.readthedocs.io/en/latest/_auto/ak.flatten.html): una para aplastar listas en el primer nivel y otra para eliminar `None` en el segundo nivel.\n", + "\n", + "```python\n", + "cual = ak.argmin(abs(masa - masa_z), axis=1, keepdims=True)\n", + "\n", + "hist.Hist(hist.axis.Regular(120, 0, 120, label=\"masa [GeV]\")).fill(\n", + " ak.ravel(masa[cual])\n", + "\n", + ").plot()\n", + "```\n", + "````\n", + "`````" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/05-histogramas.ipynb b/scikit_hep_tutorial/05-histogramas.ipynb new file mode 100644 index 0000000..3823a0b --- /dev/null +++ b/scikit_hep_tutorial/05-histogramas.ipynb @@ -0,0 +1,384 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Manipulaciones y ajustes de histogramas\n", + "\n", + "## Librerías de histogramas\n", + "\n", + "Python tiene librerías para llenar histogramas.\n", + "\n", + "### NumPy\n", + "\n", + "NumPy, por ejemplo, tiene una función [np.histogram](https://numpy.org/doc/stable/reference/generated/numpy.histogram.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import skhep_testdata, uproot\n", + "\n", + "tree = uproot.open(skhep_testdata.data_path(\"uproot-Zmumu.root\"))[\"events\"]\n", + "\n", + "import numpy as np\n", + "\n", + "np.histogram(tree[\"M\"].array())" + ] + }, + { + "cell_type": "markdown", + "id": "2", + "metadata": {}, + "source": [ + "Debido a la prominencia de NumPy, este 2-tupla de arreglos (contenidos de los bins y bordes) es un formato de histograma ampliamente reconocido, aunque carece de muchas de las características que los físicos de alta energía esperan (sub/sobre flujo, etiquetas de ejes, incertidumbres, etc.).\n", + "\n", + "### Matplotlib\n", + "\n", + "Matplotlib también tiene una función [plt.hist](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.hist.html)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "plt.hist(tree[\"M\"].array())" + ] + }, + { + "cell_type": "markdown", + "id": "4", + "metadata": {}, + "source": [ + "Además de los mismos contenidos de bins y bordes que NumPy, Matplotlib incluye un gráfico que se puede graficar." + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "### Boost-histogram y hist\n", + "\n", + "La característica principal que falta en estas funciones (sin algún esfuerzo) es la posibilidad de rellenar nuevamente. Los físicos de altas energías generalmente quieren llenar histogramas con más datos de los que pueden caber en memoria, lo que significa establecer intervalos de bins en un contenedor vacío y llenarlo en lotes (secuencialmente o en paralelo).\n", + "\n", + "Boost-histogram es una biblioteca diseñada para ese propósito. Está destinada a ser un componente de infraestructura. Puedes explorar su funcionalidad \"de bajo nivel\" al importarla:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "import boost_histogram as bh" + ] + }, + { + "cell_type": "markdown", + "id": "7", + "metadata": {}, + "source": [ + "Una capa más amigable para el usuario (con gráficos, por ejemplo) es proporcionada por una biblioteca llamada \"hist.\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "import hist\n", + "\n", + "h = hist.Hist(hist.axis.Regular(120, 60, 120, name=\"masa\"))\n", + "\n", + "h.fill(tree[\"M\"].array())\n", + "\n", + "h.plot()" + ] + }, + { + "cell_type": "markdown", + "id": "9", + "metadata": {}, + "source": [ + "### Indexación Universal de Histogramas (UHI)\n", + "\n", + "Hay un intento dentro de Scikit-HEP para estandarizar lo que significan las rebanadas similares a arreglos para un histograma. ([Ver documentación](https://uhi.readthedocs.io/en/latest/indexing.html).)\n", + "\n", + "Naturalmente, las rebanadas enteras deberían seleccionar un rango de bins," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10", + "metadata": {}, + "outputs": [], + "source": [ + "h[10:110].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "11", + "metadata": {}, + "source": [ + "pero a menudo deseamos seleccionar bins por valor de coordenada." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "# Versión explícita\n", + "h[hist.loc(90) :].plot()\n", + "\n", + "# Versión corta\n", + "h[90j:].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "13", + "metadata": {}, + "source": [ + "o rebinar por un factor," + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "14", + "metadata": {}, + "outputs": [], + "source": [ + "# Versión explícita\n", + "h[:: hist.rebin(2)].plot()\n", + "\n", + "# Versión corta\n", + "h[::2j].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "15", + "metadata": {}, + "source": [ + "o sumar sobre un rango." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "# Versión explícita\n", + "h[hist.loc(80) : hist.loc(100) : sum]\n", + "\n", + "# Versión corta\n", + "h[90j:100j:sum]" + ] + }, + { + "cell_type": "markdown", + "id": "17", + "metadata": {}, + "source": [ + "Las cosas se vuelven más interesantes cuando un histograma tiene múltiples dimensiones." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "import uproot\n", + "import hist\n", + "import awkward as ak\n", + "\n", + "picodst = uproot.open(\n", + " \"https://pivarski-princeton.s3.amazonaws.com/pythia_ppZee_run17emb.picoDst.root:PicoDst\"\n", + ")\n", + "\n", + "hist_vertices = hist.Hist(\n", + " hist.axis.Regular(600, -1, 1, label=\"x\"),\n", + " hist.axis.Regular(600, -1, 1, label=\"y\"),\n", + " hist.axis.Regular(40, -200, 200, label=\"z\"),\n", + ")\n", + "\n", + "datos_vertices = picodst.arrays(filter_name=\"*mPrimaryVertex[XYZ]\")\n", + "\n", + "hist_vertices.fill(\n", + " ak.flatten(datos_vertice[\"Event.mPrimaryVertexX\"]),\n", + " ak.flatten(datos_vertice[\"Event.mPrimaryVertexY\"]),\n", + " ak.flatten(datos_vertice[\"Event.mPrimaryVertexZ\"]),\n", + ")\n", + "\n", + "hist_vertices[:, :, sum].plot2d_full()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "hist_vertices[-0.25j:0.25j, -0.25j:0.25j, sum].plot2d_full()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "hist_vertices[sum, sum, :].plot()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "hist_vertices[-0.25j:0.25j:sum, -0.25j:0.25j:sum, :].plot()" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "Un objeto de histograma puede tener más dimensiones de las que se pueden visualizar razonablemente; puedes rebanar, rebin y proyectar en algo visual más tarde." + ] + }, + { + "cell_type": "markdown", + "id": "23", + "metadata": {}, + "source": [ + "## Ajuste de histogramas\n", + "\n", + "Escribiendo directamente una función de pérdida en Minuit:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import iminuit.cost\n", + "\n", + "norm = len(h.axes[0].widths) / (h.axes[0].edges[-1] - h.axes[0].edges[0]) / h.sum()\n", + "\n", + "\n", + "def f(x, background, mu, gamma):\n", + " return (\n", + " background\n", + " + (1 - background) * gamma**2 / ((x - mu) ** 2 + gamma**2) / np.pi / gamma\n", + " )\n", + "\n", + "\n", + "loss = iminuit.cost.LeastSquares(\n", + " h.axes[0].centers, h.values() * norm, np.sqrt(h.variances()) * norm, f\n", + ")\n", + "loss.mask = h.variances() > 0\n", + "\n", + "minimizer = iminuit.Minuit(loss, background=0, mu=91, gamma=4)\n", + "\n", + "minimizer.migrad()\n", + "minimizer.hesse()\n", + "\n", + "(h * norm).plot()\n", + "plt.plot(loss.x, f(loss.x, *minimizer.values))" + ] + }, + { + "cell_type": "markdown", + "id": "25", + "metadata": {}, + "source": [ + "O a través de zfit, un ajustador similar a RooFit en Python:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26", + "metadata": {}, + "outputs": [], + "source": [ + "import zfit\n", + "\n", + "binned_data = zfit.data.BinnedData.from_hist(h)\n", + "\n", + "binning = zfit.binned.RegularBinning(120, 60, 120, name=\"masa\")\n", + "space = zfit.Space(\"masa\", binning=binning)\n", + "\n", + "background = zfit.Parameter(\"background\", 0)\n", + "mu = zfit.Parameter(\"mu\", 91)\n", + "gamma = zfit.Parameter(\"gamma\", 4)\n", + "unbinned_model = zfit.pdf.SumPDF(\n", + " [zfit.pdf.Uniform(60, 120, space), zfit.pdf.Cauchy(mu, gamma, space)], [background]\n", + ")\n", + "\n", + "model = zfit.pdf.BinnedFromUnbinnedPDF(unbinned_model, space)\n", + "loss = zfit.loss.BinnedNLL(model, binned_data)\n", + "\n", + "minimizer = zfit.minimize.Minuit()\n", + "result = minimizer.minimize(loss)\n", + "\n", + "binned_data.to_hist().plot(density=1)\n", + "model.to_hist().plot(density=1)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/06-vectores-lorentz.ipynb b/scikit_hep_tutorial/06-vectores-lorentz.ipynb new file mode 100644 index 0000000..15d732c --- /dev/null +++ b/scikit_hep_tutorial/06-vectores-lorentz.ipynb @@ -0,0 +1,344 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0", + "metadata": {}, + "source": [ + "# Vectores de Lorentz, IDs de partículas PDG, agrupamiento de jets, ¡ay!\n", + "\n", + "## Vectores de Lorentz\n", + "\n", + "Siguiendo con la filosofía de \"muchos paquetes pequeños\", los vectores 2D/3D/Lorentz son manejados por un paquete llamado Vector. Aquí es donde puedes encontrar cálculos como `deltaR` y transformaciones de coordenadas." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1", + "metadata": {}, + "outputs": [], + "source": [ + "import vector\n", + "\n", + "uno = vector.obj(px=1, py=0, pz=0)\n", + "dos = vector.obj(px=0, py=1, pz=1)\n", + "\n", + "uno + dos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2", + "metadata": {}, + "outputs": [], + "source": [ + "uno.deltaR(dos)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3", + "metadata": {}, + "outputs": [], + "source": [ + "uno.to_rhophieta()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4", + "metadata": {}, + "outputs": [], + "source": [ + "dos.to_rhophieta()" + ] + }, + { + "cell_type": "markdown", + "id": "5", + "metadata": {}, + "source": [ + "Para integrarse con el resto del ecosistema, Vector debe ser una librería orientada a arreglos. Los arreglos de vectores 2D/3D/Lorentz se procesan en masa.\n", + "\n", + "`MomentumNumpy2D`, `MomentumNumpy3D`, `MomentumNumpy4D` son subtipos de arreglos NumPy: los arreglos de NumPy pueden ser *convertidos* a estos tipos y obtener todas las funciones vectoriales." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6", + "metadata": {}, + "outputs": [], + "source": [ + "import skhep_testdata, uproot\n", + "import awkward as ak\n", + "import vector\n", + "\n", + "tree = uproot.open(skhep_testdata.data_path(\"uproot-Zmumu.root\"))[\"events\"]\n", + "\n", + "uno = ak.to_numpy(tree.arrays(filter_name=[\"E1\", \"p[xyz]1\"]))\n", + "dos = ak.to_numpy(tree.arrays(filter_name=[\"E2\", \"p[xyz]2\"]))\n", + "\n", + "uno.dtype.names = (\"E\", \"px\", \"py\", \"pz\")\n", + "dos.dtype.names = (\"E\", \"px\", \"py\", \"pz\")\n", + "\n", + "uno = uno.view(vector.MomentumNumpy4D)\n", + "dos = dos.view(vector.MomentumNumpy4D)\n", + "\n", + "uno + dos" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7", + "metadata": {}, + "outputs": [], + "source": [ + "uno.deltaR(dos)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8", + "metadata": {}, + "outputs": [], + "source": [ + "uno.to_rhophieta()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9", + "metadata": {}, + "outputs": [], + "source": [ + "dos.to_rhophieta()" + ] + }, + { + "cell_type": "markdown", + "id": "10", + "metadata": {}, + "source": [ + "Después de llamar a `vector.register_awkward()`, `\"Momentum2D\"`, `\"Momentum3D\"`, `\"Momentum4D\"` son nombres de registros que Awkward Array reconocerá para obtener todas las funciones vectoriales." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11", + "metadata": {}, + "outputs": [], + "source": [ + "vector.register_awkward()\n", + "\n", + "tree = uproot.open(skhep_testdata.data_path(\"uproot-HZZ.root\"))[\"events\"]\n", + "\n", + "array = tree.arrays(filter_name=[\"Muon_E\", \"Muon_P[xyz]\"])\n", + "\n", + "muones = ak.zip(\n", + " {\"px\": array.Muon_Px, \"py\": array.Muon_Py, \"pz\": array.Muon_Pz, \"E\": array.Muon_E},\n", + " with_name=\"Momentum4D\",\n", + ")\n", + "mu1, mu2 = ak.unzip(ak.combinations(muones, 2))\n", + "\n", + "mu1 + mu2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12", + "metadata": {}, + "outputs": [], + "source": [ + "mu1.deltaR(mu2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13", + "metadata": {}, + "outputs": [], + "source": [ + "muones.to_rhophieta()" + ] + }, + { + "cell_type": "markdown", + "id": "14", + "metadata": {}, + "source": [ + "## Propiedades de partículas e identificadores PDG\n", + "\n", + "La librería Particle proporciona todas las masas de partículas, anchos de decaimiento y más del PDG.\n", + "Además, contiene una serie de herramientas para consultar programáticamente las propiedades de las partículas y usar varios esquemas de identificación." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15", + "metadata": {}, + "outputs": [], + "source": [ + "import particle\n", + "from hepunits import GeV\n", + "\n", + "particle.Particle.findall(\"pi\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16", + "metadata": {}, + "outputs": [], + "source": [ + "boson_z = particle.Particle.from_name(\"Z0\")\n", + "boson_z.mass / GeV, boson_z.width / GeV" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17", + "metadata": {}, + "outputs": [], + "source": [ + "print(boson_z.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18", + "metadata": {}, + "outputs": [], + "source": [ + "particle.Particle.from_pdgid(111)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "19", + "metadata": {}, + "outputs": [], + "source": [ + "particle.Particle.findall(\n", + " lambda p: p.pdgid.is_meson and p.pdgid.has_strange and p.pdgid.has_charm\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "20", + "metadata": {}, + "outputs": [], + "source": [ + "print(particle.PDGID(211).info())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "21", + "metadata": {}, + "outputs": [], + "source": [ + "pdgid = particle.Corsika7ID(11).to_pdgid()\n", + "particle.Particle.from_pdgid(pdgid)" + ] + }, + { + "cell_type": "markdown", + "id": "22", + "metadata": {}, + "source": [ + "# Agrupamiento de jets\n", + "\n", + "En una colisión pp de alta energía, por ejemplo, se produce una lluvia de hadrones que se agrupan en `jets` de partículas, y este método/proceso se llama agrupamiento de jets (jet-clustering). El algoritmo de agrupamiento de jets anti-kt es uno de los algoritmos utilizados para combinar partículas/hadrones que están cerca entre sí en jets.\n", + "\n", + "Algunas personas necesitan realizar agrupamiento de jets a nivel de análisis. El paquete fastjet hace posible hacerlo un array (Awkward) a la vez." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "23", + "metadata": {}, + "outputs": [], + "source": [ + "import skhep_testdata, uproot\n", + "import awkward as ak\n", + "import particle\n", + "from hepunits import GeV\n", + "import vector\n", + "\n", + "vector.register_awkward()\n", + "\n", + "picodst = uproot.open(\n", + " \"https://pivarski-princeton.s3.amazonaws.com/pythia_ppZee_run17emb.picoDst.root:PicoDst\"\n", + ")\n", + "px, py, pz = ak.unzip(\n", + " picodst.arrays(filter_name=[\"Track/Track.mPMomentum[XYZ]\"], entry_stop=100)\n", + ")\n", + "\n", + "probable_mass = particle.Particle.from_name(\"pi+\").mass / GeV\n", + "\n", + "pseudojets = ak.zip(\n", + " {\"px\": px, \"py\": py, \"pz\": pz, \"mass\": probable_mass}, with_name=\"Momentum4D\"\n", + ")\n", + "good_pseudojets = pseudojets[pseudojets.pt > 0.1]\n", + "\n", + "import fastjet\n", + "\n", + "jetdef = fastjet.JetDefinition(fastjet.antikt_algorithm, 1.0)\n", + "\n", + "clusterseq = fastjet.ClusterSequence(good_pseudojets, jetdef)\n", + "clusterseq.inclusive_jets()\n", + "\n", + "ak.num(good_pseudojets), ak.num(clusterseq.inclusive_jets())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "24", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/scikit_hep_tutorial/07-mas-herramientas.md b/scikit_hep_tutorial/07-mas-herramientas.md new file mode 100644 index 0000000..2f5a3d2 --- /dev/null +++ b/scikit_hep_tutorial/07-mas-herramientas.md @@ -0,0 +1,35 @@ +# Herramientas para seguir escalando + +Las herramientas descritas en estas lecciones están destinadas a ser utilizadas *dentro* de un script que se escale para conjuntos de datos grandes. + +Puedes usar cualquiera de ellas en un trabajo GRID ordinario (u otro procesador por lotes). + +Sin embargo, el [proyecto Coffea](https://github.com/CoffeaTeam) ([documentación](https://coffeateam.github.io/coffea/)) está construyendo un ecosistema *distribuido* que integra el análisis en Python con granjas de análisis de datos. Este es un tema demasiado amplio para cubrir aquí, pero consulta el software y únete a las [reuniones de usuarios de Coffea](https://indico.cern.ch/category/11674/) si estás interesado. + +# Recursos de Scikit-HEP + +- [scikit-hep.org](https://scikit-hep.org) +- Uproot [GitHub](https://github.com/scikit-hep/uproot5), [documentación](https://uproot.readthedocs.io) +- Awkward Array [GitHub](https://github.com/scikit-hep/awkward-1.0), [documentación](https://awkward-array.org) +- boost-histogram [GitHub](https://github.com/scikit-hep/boost-histogram), [documentación](https://boost-histogram.readthedocs.io) +- hist [GitHub](https://github.com/scikit-hep/hist), [documentación](https://hist.readthedocs.io) +- Unified Histogram Interface [GitHub](https://github.com/scikit-hep/uhi), [documentación](https://uhi.readthedocs.io) +- mplhep [GitHub](https://github.com/scikit-hep/mplhep), [documentación](https://mplhep.readthedocs.io) +- iminuit [GitHub](https://github.com/scikit-hep/iminuit), [documentación](https://iminuit.readthedocs.io) +- zfit [GitHub](https://github.com/zfit/zfit), [documentación](https://zfit.readthedocs.io) +- Vector [GitHub](https://github.com/scikit-hep/vector), [documentación](https://vector.readthedocs.io) +- Particle [GitHub](https://github.com/scikit-hep/particle), [documentación](https://github.com/scikit-hep/particle/blob/master/notebooks/ParticleDemo.ipynb) +- hepunits [GitHub](https://github.com/scikit-hep/hepunits) +- fastjet [GitHub](https://github.com/scikit-hep/fastjet), [documentación](https://fastjet.readthedocs.io) +- pyhf [GitHub](https://github.com/scikit-hep/pyhf), [documentación](https://pyhf.readthedocs.io) +- hepstats [GitHub](https://github.com/scikit-hep/hepstats), [documentación](https://scikit-hep.org/hepstats) +- cabinetry [GitHub](https://github.com/scikit-hep/cabinetry), [documentación](https://iris-hep.org/projects/cabinetry.html) +- histoprint [GitHub](https://github.com/scikit-hep/histoprint) +- decaylanguage [GitHub](https://github.com/scikit-hep/decaylanguage), [documentación](https://github.com/scikit-hep/decaylanguage/blob/master/notebooks/DecayLanguageDemo.ipynb) +- GooFit [GitHub](https://github.com/GooFit/GooFit), [documentación](https://goofit.github.io/) +- pyhepmc [GitHub](https://github.com/scikit-hep/pyhepmc) +- pylhe [GitHub](https://github.com/scikit-hep/pylhe) + +y finalmente + +- cookie [GitHub](https://github.com/scientific-python/cookie), [documentación](https://learn.scientific-python.org/development), una plantilla para crear la tuya propia... \ No newline at end of file diff --git a/scikit_hep_tutorial/_config.yml b/scikit_hep_tutorial/_config.yml new file mode 100644 index 0000000..a4ef932 --- /dev/null +++ b/scikit_hep_tutorial/_config.yml @@ -0,0 +1,40 @@ +####################################################################################### +# A default configuration that will be loaded for all jupyter books +# See the documentation for help and more options: +# https://jupyterbook.org/customize/config.html + +####################################################################################### +# Book settings +title: Scikit-HEP Tutorial # The title of the book. Will be placed in the left navbar. +author: HSF Training # The author of the book +copyright: "2024" # Copyright year to be placed in the footer +logo: hsf_logo.png # A path to the book logo + +# Force re-execution of notebooks on each build. +# See https://jupyterbook.org/content/execute.html +execute: + execute_notebooks: "force" + run_in_temp: true + timeout: 500 + +# Define the name of the latex output file for PDF builds +latex: + latex_documents: + targetname: book.tex + +# Add a bibtex file so that we can create citations +# bibtex_bibfiles: +# - references.bib + +# Information about where the book exists on the web +repository: + url: https://github.com/hsf-training/Scikit-HEP Tutorial # Online location of your book + path_to_book: docs # Optional path to your book, relative to the repository root + branch: main # Which branch of the repository should be used when creating links (optional) + +# Add GitHub buttons to your book +# See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository +html: + home_page_in_navbar: false + use_issues_button: true + use_repository_button: true diff --git a/scikit_hep_tutorial/_toc.yml b/scikit_hep_tutorial/_toc.yml new file mode 100644 index 0000000..223c3e9 --- /dev/null +++ b/scikit_hep_tutorial/_toc.yml @@ -0,0 +1,15 @@ +# Table of contents +# Learn more at https://jupyterbook.org/customize/toc.html + +format: jb-book +root: 00-bienvenida +parts: +- caption: Lecciones + chapters: + - file: 01-introduccion + - file: 02-uproot + - file: 03-ttree + - file: 04-awkward + - file: 05-histogramas + - file: 06-vectores-lorentz + - file: 07-mas-herramientas diff --git a/scikit_hep_tutorial/fig/abstraction-layers.png b/scikit_hep_tutorial/fig/abstraction-layers.png new file mode 100644 index 0000000000000000000000000000000000000000..729d675e2413d3ad54a70e57a3b834f00d95b107 GIT binary patch literal 76357 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + zstandard + + + + + + + + + + + + Analysis scripts + Coffea + hist + + ROOT + + PyROOT + + root_numpy + root_pandas + + Uproot: only ROOT I/O, everything else in other libs + Awkward Array + + + + + + + + + Analysis scripts + + + + + + + + Analysis scripts + lz4 & xxhash + Pandas + NumPy + + XRootD + + Vector + + diff --git a/scikit_hep_tutorial/fig/apl-timeline.png b/scikit_hep_tutorial/fig/apl-timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..d0fe389bec995ae4fb8065880e1c446192bd9e36 GIT binary patch literal 28749 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 + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + Nial + + + + + + + + + + + + + + S-PLUS + + + + APL + + + + S + + + + NumPy + + + + MATLAB + + + + J + + + + IDL + + S-PLUS + + + R + + 1960 + 1970 + 1980 + 1990 + 2000 + 2010 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julia + + + + K + + + + Q + + + + ZPL + + J + + + A+ + + + + PDL + + + APL + MATLAB + Nail + IDL + S + ZPL + K + A+ + R + PDL + Q + NumPy + Julia + 1960 + 1970 + 1980 + 1990 + 2000 + 2010 + + diff --git a/scikit_hep_tutorial/fig/array3d-highlight1.png b/scikit_hep_tutorial/fig/array3d-highlight1.png new file mode 100644 index 0000000000000000000000000000000000000000..e86c9306d00cf5e5e248b785cdefea983dd02b66 GIT binary patch literal 19627 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 + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + diff --git a/scikit_hep_tutorial/fig/array3d-highlight2.png b/scikit_hep_tutorial/fig/array3d-highlight2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b1cb1fe577a42b41f4482f675f0acb4995a9ce GIT binary patch literal 18731 zcma%@Wl)u0_^vl0sURQ?KR~)ukVd4tyBjG1=~TMAySux)8>JhhQ@S~e|IGPtX3m*8 z%xn;J^X|RgwVt@{`!PsPM)VyL9ufosc_%I=qyT|H(SbkrAi#mopK<8o!53J2L2)Gn z@ZpYN6bQaY{4S<$4}riFy*{8YRlU8y4{?78tNl>4G5O)7Z)Xf~a&lrYx3;i1)c9cLfe=H)g}x{`ryi#{seKT|@AOiF>MNhGx(R>Nf@Wb5LT+YYSyUiG`zL=CEaOHIvbrQ7M) zc|!1i95Z3{(G8NxPC0T@WCQ~Sb%+fyVqilxU4G=7jh7T*3tem9_Fkx= z+4nSQMl)3vRC06{D%t^-F@OIWZEkJ~G@^d1hOCZ{j~fj|3*Q8>i@Ce=h>MG7Zr$10 z+xH9&4RQU-^GQs^frwg+kYGAMkykD+{z@D?MX;NjU2G7jtH@I(li;`UKD)VI8A<1D znNFXtF^xdqcL=)4GmqqoKgH< zp2f-~{sjdEb;7KOc?v@_C8|wMr~e@$B09Uc$d_q+sx}^>xT|9c=^lpr1MBXsQQUE- zJn%t4hjhvOT`B8E^ShrG6n{AUyUp(9kPG1&OTwREU~_ZE2s+6!;n(xFZa=}QX8Y}% zX;Ok^^Y!;fCm$YpeXC7Z@2++?>c z#V3nxv(~=d?T1W#e}1{I`0q9Zn^EeU&CBzXR0dy~;XrsE*UsO+LWi?uNz8_DpT7NJ z(!9QLx!gnR>gw8b+@B^lFf@ePo6LeKQ7L0-F3Zg&!(!Bt($gbGCE}B^9qsAync#Z} zy}Q_rVbtXt`aAI!X$0BX_jyj!57DX#(j-;LSQoHQtY?ll@O#T#3x6KvgH(=;a3%~o zO=rrp{4m$m^6bo9_~yT?lnt?qZzxfa~q+%eov);*YE>kBoeAL!H~{~DRQ&+LvS z_4Ec|2=_hlfrU6)Zi;DhyQwxA!)tarWf*dR0>7@m^XI(}XJKk&*yc)$(~qP1D36Eh zy!q4hb#H~Dzu-ruI&I0|i~a4H{*WgRi%+*5SzfgSwBXO`+)E>lIPFeM7>D$vsdk3d z4x%XpnXI_!1s!EQR6KI`4{AT(hm-xM&!&pC7n)g0{uNVPAXf~H1bxg09#!hwZp{QA z>$hCn>mzkrvg>~XM3UDf<#JRCRJ5k1rZh^0ont8+K@lAE&VyY(@JUSi(8TUl9d|qU z(9qCSiurGYf`VS}EDp}#n%9f8fx$l~beV?@&zK?|f;+lliKzcenox^Aw7dP>A@n=tJzb`op4KA0O`Sf~;(o z>ZMK7E`=<>OY^G+XJk0T^IqI#vlr1=N-7jQg$5a$flg;aZL!XRGM&|Ynyl^W_2$ju zbK2#ObL|JsRvHeVY@coP#Cbjb3pfY=Y#79o?V%XTJ`0EA#hF6SR6Y+49!lMI_u;@m zgtV*va6;PI6n3lR)oZDsSv}NTj@D3K8anM{O7m5y-l8O|MKk7b`?&*`El0bPhr$Jmx5n{ctkhe=kJ-$ z z@>qoh9RmaEyMqI!Zj?jT6O!4HRt7nz%XzMv^;~({s;jlNb*&}!BYTJY9gB7d8QB00Pjc>QDAL09d58-mfl$Mr_J5fHaAUK9GF;YMY#8|lR2Uhm$NPQyE4W0mO+DJ zV_ScZkJC(6(8(nNjn(yy>EhlS7`?oGgq9LbG^`Ft>|Crs6jk=Jhko)F?yNv~GJn^o zp~7aq&|pJ!bFu=H`NaoLsZg$K7=6D$G~z!4m*d4c*F*CZtjnVX*007As1m%iss0G> z-hFylOwx~I%DGjUcuo)?X2M$sS$TLo$4f)ByMbM7~IX4X`1M2{->WeCb`Z|J%()u#rl(Ylr?2gtTrt25luvC z;r)FT_Gd_|0wH5~V4OJL9(g@qAz1VVcXmrshH?cmgjKEf13CsVIz}w~By0 z?AK|RVy^H`mdxBY#%wA4FOQ0~e&;tg4af;ts;a67vt=pW^>hpjGO1cl-@j*CuQcD@ z-mb6frKsOFI~-EPn@*&UZ4ET@wwR12Ms<^}gAfT8Lq(066ZTS&3D0Bg=mv!e{q}9x z)guJf&%~mYe~1ZwBTjC~jtNCS+`8_dhWlRE$0{16q!43GFG5)T>NbnH@*jJXKSAtN zsMP!7{|>)@voGWhM6CU_4t@}CO~E;5vtCY=&k@OUYo{VLU#KPr!3%yJ`9#`xP*z$gWlCGAqwEOBr7n-8Eeb*9nMuq+cAVkM3_Fg>PH?P9Z9t~9*0Jga&c*B|M>bl z;pl)}dOyVVPo}h;9ZQ97$E^AbNG+HicZ;>=Uo9<5Z;`I}Kn!}lqfZYv7?_xSSziMb zq<)la&qVY0U0@OtTK&+irR7HkT`;aF;|Hdp0K40^@w;7fq z5BtW5{;{4__G8KtYdD<&^c0gJ;jJCRgp_)V@P>wlnQdlMMSGALOGXUFcXoG8V=cm| z!3h+#)Xj(}pf2YWS<>g^9iDw-hs{1Ne}{I3|3w?q)5+gAIdO#U%H}!w zJKvp?gA4)PIWiK$Znc=Wl0St+t66VJ!0Y(ueFwP9gla}#T( zOfLVv`D0@c%vk48q{slzY@@ie)!5`#=~(i_qe~fal=re*_TxW`%^O5k=&>t~1_DKq z8`Fzs%;*O0Z-1z!V)X|jNgA7zPnAeyn@0u*6G#1!v4t#dZi2$Xwo`1{(Y%akK~0dz z?4ON~I}os*yajr+XCdz+Ik#ZGQe zKyP<_w4j8sMJf`y9>UlzrtAcw_T%Hl#O>Xke3PAVFea@(sCN3p@GU_;{&8}Ber_-l zPj58zaqQ{o{Rgc1{QWPkXJj##!rULBylV()OYL{Z)iq(o1H;2*X0Sc%3y2e$j#k@J zK%sQVqf=ud{d|AO2!bSIQYg`{?&hC*A+X)&6&aYu%n2|ECP>6&1(g{|+Vng;Jhy*i zWP2yLolbh|%L*?Q>n+tmX$*%jM1?}|S^Ps+e_vUfA zsJ6}Nzpe+R22TVF{Y7ZmWVtps7TtRS#OH_84y9{_>s}E43pE?cH-ZK7B;pc5dCO`t z3h~YT;4NdQMt%4G1E}();9{nNCBj-IsQxeYe;sEjK8N-9^-iddq@=bE4tYvN3a{nX z-$4>Tn`&cust-a!LV+l)E*CrG;PAtZR}+3fdXuF(j$wC4Ap4OhIyP2pT+4+@yB?j- z0e>TE#uHtSFUWoHlQO@K2rnu7H6f?{c9u|)-JjCmkp!H1LkL#%I&Gnw$M|7B4$r^* zY#r)!W8N!PHFgIF24;G_JRdF8P|h%erW4dXBcK+xb*x{x@^-s9u?02OFCQOHrxOBf z2Cd0(*iI1Cak+jJVv@6kzsL}pOmw8o6J4TCq#uOiC5^FiKkK3xoi!-h+W*ET=)Nyi zV@bHOh)2Jp60}L9Q(rclYl80?m>^L-X~l|_!82Ivn>>zb7FuqhKUr$s<-w%E9}i7a zuPjt)1dUF6d%Hn0G03A52@KMfmUR01`n~=AEDi@s<=QR%Ad*|M_fPFj

wZxa}Oa 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 + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + diff --git a/scikit_hep_tutorial/fig/array3d.svg b/scikit_hep_tutorial/fig/array3d.svg new file mode 100644 index 0000000..397cd2e --- /dev/null +++ b/scikit_hep_tutorial/fig/array3d.svg @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + + diff --git a/scikit_hep_tutorial/fig/bitwise-operator-parentheses.png b/scikit_hep_tutorial/fig/bitwise-operator-parentheses.png new file mode 100644 index 0000000000000000000000000000000000000000..9781948840b62c241a427703e775fbd721520445 GIT binary patch literal 17870 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 literal 0 HcmV?d00001 diff --git a/scikit_hep_tutorial/fig/bitwise-operator-parentheses.svg b/scikit_hep_tutorial/fig/bitwise-operator-parentheses.svg new file mode 100644 index 0000000..cb434cf --- /dev/null +++ b/scikit_hep_tutorial/fig/bitwise-operator-parentheses.svg @@ -0,0 +1,509 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + & + > + ‒10 + x + < + 10 + x + + + + + + + + + + + & + x + ‒10 + + > + x + (and) + + + + + + + + & + x + ‒10 + < + 10 + + +x > -10 & x < 10 +x > -10 & x < 10 + x > -10 & x < 10 + (x > -10) & (x < 10) + + diff --git a/scikit_hep_tutorial/fig/cartoon-cartesian.png b/scikit_hep_tutorial/fig/cartoon-cartesian.png new file mode 100644 index 0000000000000000000000000000000000000000..694a4824ebb6f79bac5f0e8a146916f7dea388c5 GIT binary patch literal 5161 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 literal 0 HcmV?d00001 diff --git a/scikit_hep_tutorial/fig/cartoon-cartesian.svg b/scikit_hep_tutorial/fig/cartoon-cartesian.svg new file mode 100644 index 0000000..3cb324a --- /dev/null +++ b/scikit_hep_tutorial/fig/cartoon-cartesian.svg @@ -0,0 +1,618 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + [[ + , + , + + + + ],[],[ + ]] + + + + [[ + , + ],[ + + + ],[ + + , + ]] + + + + + [[ + , + , + + + + + + + + + + + + + + + + , + , + + + + + + + + + + + , + ],[],[ + + + + + + + + + + + , + ]] + + + + + + + + + + + diff --git a/scikit_hep_tutorial/fig/cartoon-combinations.png b/scikit_hep_tutorial/fig/cartoon-combinations.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9ddf8f55bc367b06be0c8160636ad3b26fef40 GIT binary patch literal 7564 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 + + + + + + + + + image/svg+xml + + + + + + + + + [[ + , + , + + + + + + + + + + + + + + + + , + , + + + + + + + + + + + , + ],[],[ + + + + + + + + + + + , + ]] + + + + + + + + + + ) + ] + + ] + + + , + [ + 2 + ( + + ) + [] + ( + + [ + , + , + + + + , + + + ) + ] + + , + + [ + ( + + 2 + 2 + , + + + + diff --git a/scikit_hep_tutorial/fig/scikit-hep-logos.png b/scikit_hep_tutorial/fig/scikit-hep-logos.png new file mode 100644 index 0000000000000000000000000000000000000000..4034e27bb77b77ca55b8d2671458f391632175a8 GIT binary patch literal 88617 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

3l?!^# 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + & + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ±1 + + + σ + + + + + + + + + + + + + + + ±2 + + + σ + + + + + + + + + + + diff --git a/scikit_hep_tutorial/fig/terminology.png b/scikit_hep_tutorial/fig/terminology.png new file mode 100644 index 0000000000000000000000000000000000000000..aa79f5822067fe41c9040409afb8459408970f19 GIT binary patch literal 48184 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 R+#%qfoV4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + TFile + TDirectory + TDirectory + + + + + + + + + + + + + + + + + + + + + + + + + + + TTree + TTree + TBranch + TBranch + TBranch + TBasket + TBasket + TBasket + TBasket + TBasket + TBasket + TBasket + TBasket + TBasket + + TH1F + TH1F + TH1F + + + + nested directories + standaloneobjects + “TTree” + + + + + + diff --git a/scikit_hep_tutorial/hsf_logo.png b/scikit_hep_tutorial/hsf_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8a9bd8f4b4449f4f6d3c140dbdd088899565549a GIT binary patch literal 22514 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