{"id":27247220,"url":"https://github.com/goofit/goofit","last_synced_at":"2025-04-10T22:49:11.961Z","repository":{"id":7656275,"uuid":"9017446","full_name":"GooFit/GooFit","owner":"GooFit","description":"Code repository for the massively-parallel framework for maximum-likelihood fits, implemented in CUDA/OpenMP","archived":false,"fork":false,"pushed_at":"2025-04-07T21:13:58.000Z","size":102727,"stargazers_count":132,"open_issues_count":37,"forks_count":41,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-04-10T22:48:53.378Z","etag":null,"topics":["cuda","fitting","gpu","gpu-computing","omp","physics","root-cern","thrust"],"latest_commit_sha":null,"homepage":"https://GooFit.github.io","language":"Cuda","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GooFit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2013-03-25T22:23:47.000Z","updated_at":"2025-03-01T04:50:36.000Z","dependencies_parsed_at":"2023-01-13T15:00:24.900Z","dependency_job_id":"712e6a91-505e-44c9-942b-a67ea3656f3f","html_url":"https://github.com/GooFit/GooFit","commit_stats":{"total_commits":1576,"total_committers":38,"mean_commits":"41.473684210526315","dds":0.5387055837563453,"last_synced_commit":"4e98be7481ca452ee5988c01ffe9b08e2f85d173"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GooFit%2FGooFit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GooFit%2FGooFit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GooFit%2FGooFit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GooFit%2FGooFit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GooFit","download_url":"https://codeload.github.com/GooFit/GooFit/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248312180,"owners_count":21082637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cuda","fitting","gpu","gpu-computing","omp","physics","root-cern","thrust"],"created_at":"2025-04-10T22:49:11.168Z","updated_at":"2025-04-10T22:49:11.948Z","avatar_url":"https://github.com/GooFit.png","language":"Cuda","readme":"[![Actions Status][actions-badge]][actions-link]\n[![Travis Status][travis-badge]][travis-link]\n[![Join the chat at https://gitter.im/GooFit/Lobby][gitter-badge]][gitter-link]\n[![License: BSD][license-badge]](./LICENSE)\n[![Latest release][releases-badge]][releases-link]\n[![PyPI Status][pypi-status]][pypi-link]\n[![Conda-Forge Status][cf-status]][cf-link]\n[![DOI][DOI-badge]][DOI-link]\n[![Scikit-HEP][sk-badge]](https://scikit-hep.org/)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"495\" height=\"220\" src=\"https://raw.githubusercontent.com/GooFit/GooFit/master/docs/GooFitLogo.png\"/\u003e\n\u003c/p\u003e\n\nGooFit is a massively-parallel framework, written using Thrust for CUDA and OpenMP, for\ndoing maximum-likelihood fits with a familiar syntax.\n\n[What's new](./docs/CHANGELOG.md)\n• [Tutorials]\n• [API documentation]\n• [2.0 upgrade](./docs/CONVERTING20.md)\n• [2.1 upgrade](./docs/CONVERTING21.md)\n• [2.2 upgrade](./docs/CONVERTING22.md)\n• [Build recipes](./docs/SYSTEM_INSTALL.md)\n• [Python](https://pypi.python.org/pypi/goofit/)\n\n## Known issues\nhttps://github.com/GooFit/GooFit/labels/critical https://github.com/GooFit/GooFit/labels/amplitude%20analysis https://github.com/GooFit/GooFit/labels/cuda\n\n## Requirements\n\n* A recent version of CMake is required. The minimum is 3.9. CMake is incredibly easy to install, you can even use `pip` (see [the system install page](./docs/SYSTEM_INSTALL.md)). GooFit developers have supplied patches to CMake 3.12, so at least that is highly recommended. CMake 3.16 does not currently work with the Python bindings.\n* A ROOT 6 build highly recommended -- GooFit will use the included Minuit2 submodule if ROOT is not found, and the Minuit1 based fitter will not be available. Supports 6.04-6.24 (6.10+ recommended).\n\n\u003cdetails\u003e\u003csummary\u003eIf using CUDA: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n* CMake 3.9+\n* CUDA 8.0+ (with caveats below)\n    * CUDA 8: Supported\n    * CUDA 9.2, 10.0: Some warnings from Eigen, supported\n    * CUDA 9.0, 9.1: Buggy, see [known issues](https://github.com/GooFit/GooFit/issues/173)\n    * CUDA 10.1, 10.2: Not yet supported due to Thrust 1.8 incompatibility\n* An nVidia GPU supporting compute capability at least 3.0 (3.5+ recommended)\n\n\u003c/p\u003e\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eIf using OpenMP: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n* A compiler supporting OpenMP and C++11 (GCC 4.8+, Clang, and Intel 17 tested, GCC 4.7 not supported)\n* Note that TBB is also available as a backend, but it still requires OpenMP to be present.\n* On macOS, this backend requires `brew install libomp` or a custom compiler.\n\n\u003c/p\u003e\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eIf using CPP: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n* Single threaded builds are available for debugging and development (such as on the default Clang on macOS)\n\n\u003c/p\u003e\u003c/details\u003e\n\n\u003cbr/\u003e\n\nA list of exact commands required for several platforms is [available here](./docs/SYSTEM_INSTALL.md).\n\n\n\u003cdetails\u003e\u003csummary\u003ePython Bindings: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nThere are also Python Bindings. This requires Python (2 or 3), [NumPy](http://www.numpy.org), [SciKit-Build](http://scikit-build.readthedocs.io), and CMake. CUDA 8+ is required if using CUDA. If you want the most recent stable release, use `pip install -v goofit` (If you have pip 9 or less, you'll need scikit-build and cmake installed beforehand). Python 2 will be removed soon.\n\nRepository method:\n\nYou can uses `pip install -v .` inside the repository. You can also directly force the bindings from a normal build with `-DGOOFIT_PYTHON=ON`. You can check your install with `python -m goofit`. You can debug a goofit file named `python_script.py` with gcc using `gdb -ex r --args python python_script.py`.\n\nOther python requirements for the examples:\n\n* numpy-1.11.1+\n* pandas-0.15.1+\n* uncertainties-3.0.2\n* matplotlib\n* plumbum\n\nOptional:\n\n* numba\n\n\u003c/p\u003e\u003c/details\u003e\n\n\u003cbr/\u003e\n\n## Getting the files\n\n* Clone with git:\n\n```bash\ngit clone git://github.com/GooFit/GooFit.git --recursive\ncd GooFit\n```\n\nYou can either checkout a tagged version, or stay on the master for the latest and greatest. There are often development branches available, too. You can use `--jobs=N` or set git's `submodule.fetchJobs` configuration parameter to download the submodules in parallel with `N` threads.\n\n## Building\n\nIf you just want to get started as fast as possible, running `make`, `make omp`, or `make cuda` in the main directory will make a build directory for you, and will run CMake and make. It is recommended that you instead directly use the CMake powered build system as described below, so that you will have a better understanding of what you are doing and more flexibility.\n\nThe build system uses CMake. The procedure is standard for CMake builds:\n\n```bash\n# Classic method\nmkdir build\ncd build\ncmake ..\nmake -j4 # 4 threads, adjust as needed\n\n# Newer method (CMake 3.13+)\ncmake -S . -B build\ncmake --build build -j4 # 4 threads, adjust as needed\n```\n\nIf you don't have a modern CMake, Kitware provides installers for every OS. You can even get a copy using python: `pip install cmake` or locally with `pip install --user cmake`.\nOn a Mac, you can also use any package manager, such as Homebrew: `brew install cmake`.\n\nIf you want to change compiler, set `CC` and `CXX` to appropriate defaults *before* you run CMake either inline or in your environment. You can also set `CMAKE_C_COMPILER` and `CMAKE_CXX_COMPILER` directly on the command line with `-D`. If you want to set the host and device backends, you can set those options. The defaults are:\n\n```bash\ncmake .. -DGOOFIT_DEVICE=CUDA -DGOOFIT_HOST=CPP\n```\n\nValid options are `CUDA` (device only), `OMP`, `TBB`, and `CPP`. The Thrust `TBB` backend requires the Intel compiler.  The default device is `Auto`, and will select `CUDA` if CUDA is found, `OMP` or `CPP` otherwise.\n\nOther custom options supported along with the defaults:\n\n* `-DGOOFIT_DEVICE=Auto`: The device to use for computation (`CUDA`, `OMP`, `TBB`, or `CPP`). Default setting of `Auto` looks for CUDA first, then OpenMP, then CPP.\n* `-DGOOFIT_ARCH=Auto`: (`Auto`, `Common`, `All`, valid number(s) or name(s)): sets the compute architecture. See [CUDA_SELECT_NVCC_ARCH_FLAGS][]. Can be set to `OFF` to avoid adding any flags.\n* `-DGOOFIT_EXAMPLES=ON`: Build the examples\n* `-DGOOFIT_PACKAGES=ON`: Build any packages found with the name `goofit_*`\n* `-DGOOFIT_DEBUG=ON` and `-DGOOFIT_TRACE=ON` will enable the matching printout macros\n* `-DGOOFIT_PYTHON=ON`: Include the python bindings using [pybind11] if Python found (use `-DPYTHON_EXECUTABLE=$(which python3)` to use a specific interpreter).\n\n\u003cdetails\u003e\u003csummary\u003eAdvanced Options: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n* `-DGOOFIT_HOST=Auto`: This is CPP unless device is `OMP`, in which case it is also `OMP`. This changes `thrust::host_vector` calculations, and is not fully supported when set to a non-default setting.\n* `-DGOOFIT_TESTS=ON`: Build the GooFit tests\n* `-DGOOFIT_MPI=ON`: (OFF/ON.  With this feature on, GPU devices are selected automatically).  Tested with MVAPICH2/2.2 and OpenMPI.\n* You can enable sanitizers on non-CUDA builds with `-DSANITIZE_ADDRESS=ON`, `-DSANITIZE_MEMORY=ON`, `-DSANITIZE_THREAD=ON` or `-DSANITIZE_UNDEFINED=ON`.\n* If `clang-tidy` is available, it will automatically be used to check the source. If you set `-DGOOFIT_TIDY_FIX=ON`, fixes will be applied to the GooFit source.\n* `-DGOOFIT_SPLASH=ON`: Controls the unicode splash at the beginning.\n* `-DGOOFIT_CERNROOT=ON`: Allows you to disable the automatic search for ROOT (used by the PIP Python build)\n* `-DCMAKE_UNITY_BUILD=OFF`: Turn on Unity builds in CMake 3.16+. Should be a bit faster (does not speed up CUDA portions of builds).\n\n\u003c/p\u003e\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eA few standard CMake tricks: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n* Use `make VERBOSE=1` to see the commands used to build the files.\n* Use `cmake .. -LH` to list the CMake options with help.\n* Use `ccmake` if available to see a curses (terminal) gui, or `cmake-gui` for a completely graphical interface.\n* Use `-G` and the name of a generator to use something other than `make`, like `Xcode` or `Ninja`.\n* Open the `CMakeLists.txt` with QtCreator to generate for that IDE.\n* Set the release type with `-DCMAKE_BUILD_TYPE=Release`, `RelWithDebInfo`, `Debug`, etc.\n* Set up multiple build directories, like `build-omp` and `build-cuda`.\n* CMake caches your `-D` option selections in your build directory so you don't have to specify them again.\n* CMake reruns when needed when you `make` unless you add a file that it globs for (like new `goofit_projects`).\n* Use `make -j12` to build with 12 cores (for example). You can set this as the `MAKEFLAGS` environment variable, too.\n* Use `CMake --build .` to build without referring to your specific build tool, like `make` or `ninja`.\n* If you are using the `llvm` tool-suite, you can use `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON` to generate the .json file that the `clang-*` commands expect.\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\n## Running the examples and tests\n\n* To run all the examples, with timing information, use:\n\n```bash\n./examples/RunAll.py\n./pyexamples/RunAll.sh # Python\n```\n\n(This requires the [Plumbum] library, install with `pip install plumbum`, `pip install --user plumbum`, or `conda -c conda-forge plumbum`.)\n\nIf you want to run an individual example, those are in subdirectories in examples (built products are in your build directory, the source is in `/examples`).\n\nThe tests can be run with `make test` or `ctest`. The python bindings, if built, can be tested with `pytest`, run from the main build directory. The python examples and tests folders are linked to the build directory with a `py` prefix.\n\n## Other topics\n\n\u003cdetails\u003e\u003csummary\u003eAdding a new example: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nThe examples are designed to be easy to add to. Make a new directory, then add a new CMakeLists.txt in your directory with one or more of the following two lines:\n\n```cmake\ngoofit_add_directory()\ngoofit_add_executible(MyNewExample MyNewExample.cu)\n```\n\nThe first line adds your `.cu` file with GooFit code as an executable, and the second one sets up a symbolic links to the source and `dataFiles` in the build directory to the source directory. If you prefer to only have some files symbolically linked, use `goofit_add_link(filename.ext)` explicitly for each file. This happens at configure time. To get the example to build when you build GooFit, add the name of your directory to `examples/CMakeLists.txt`.\n\nIf you are building with separable compilation, you can also use `goofit_add_pdf(mypdf.cu)` to add a PDF. This will also require that you include any directory that you need with `include_directory`, as usual.\n\nTo add packages, use standard CMake tools. For example (CMake 3.5+), to add [Boost][FindBoost] 1.49+ filesystem and `TTreeReader` from ROOT:\n\n```cmake\nset(Boost_USE_STATIC_LIBS OFF)\nset(Boost_USE_MULTITHREADED ON)\nset(Boost_USE_STATIC_RUNTIME OFF)\nfind_package(Boost 1.49 REQUIRED COMPONENTS filesystem)\n\ngoofit_add_executable(K3Pi K3Pi.cu)\ntarget_link_libraries(MyNewExample Boost::filesystem ROOT::TreePlayer)\n```\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eAdding a new project: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\n### External package (BETA)\n\nGooFit now requires separable compilation, so it also now supports \"external\" packages, much like most other libraries. You can design your package with GooFit included as a subdirectory, and\nit should just work. You'll also save time by not building examples, python bindings, and tests. The recommended procedure:\n\n```bash\ngit add submodule \u003curl to goofit\u003e goofit\ngit submodule update --init --recursive\n```\n\nThen, you'll need a CMakeLists that looks something like this:\n\n```bash\ncmake_minimum_required(VERSION 3.9...3.16)\n\nproject(my_external_package LANGUAGES CXX)\n\nadd_subdirectory(goofit)\ngoofit_external_package()\n\ngoofit_add_executable(myapp myapp.cpp)\n```\n\nThat's it! Just make a build directory and build. The `goofit_external_package()` command sets up optional CUDA, as well as links all reasonable files into your build directory. You can run `goofit_setup_std()`, `goofit_optional_cuda()` and `goofit_add_directory()` instead if you want.\n\n### Classic method\n\nIf you'd like to make a separate GooFit project, you can do so. Simply checkout your project inside GooFit, with the name `work` or `goofit_`+something. CMake will automatically pick up those directories and build them, and GooFit's git will ignore them. Otherwise, they act just like the example directory. If you add a new directory, you will need to explicitly rerun CMake, as that cannot be picked up by the makefile. The automatic search can be turned off with the `GOOFIT_PROJECTS` option, or by using `GOOFIT_PROJECT_\u003cname\u003e` for a specific package.\nGooFit packages should contain:\n\n```cmake\ngoofit_add_package(MyPackageName)\n```\n\nAfter the package name, you can list `ROOT` to require that ROOT. The package will be disabled if ROOT is not found.\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\n\n\u003cdetails\u003e\u003csummary style=\"font-size: 1.5em; margin-top: 24px; font-weight: 600; border-bottom: 1px solid #eaecef; line-height: 1.25\"\u003eUsing an IDE: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nThe following IDEs have been tested. Here `$SRC` refers to the source directory, and usually is `..` or `../GooFit`. You may want `-DCMAKE_BUILD_TYPE=Debug` and/or `-DGOOFIT_DEBUG=ON`.\n\n| Name | Platform | Setup | Notes |\n|------|----------|:------|:------|\n| Xcode | macOS | `cmake $SRC -GXcode` | Only CPP version, works well though |\n| Nsight-Eclipse | Linux | `cmake $SRC -G \"Eclipse CDT4 - Unix Makefiles\"` | Must be out-of-source, supports CUDA backend |\n| QtCreator | All | Open from QtCreator dialog | Requires CMake extension (usually present). Might be able to use CMake 3.7+ Server |\n| CLion | All | Open from CLion menu | Young but promising |\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eConverting from older GooFit Code: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nThe build system underwent a major upgrade in the move to CMake. The folders that were introduced to keep the includes structured require modifications of source code, converting lines like `#include \"Variable.hh\"` to `#include \"GooFit/Variable.h\"`. This modification can be done for you by running the provided script, `scripts/ModernizeGooFit.py` on your source files (requires Python and [Plumbum](https://github.com/tomerfiliba/plumbum)). You should remove your old Makefiles and use the new `CMakeFiles.txt` files provided in examples - this should require\nwriting two lines of code instead of the 50 or so previously needed. You should also add a GooFit Application to your code. (2 lines of CMake)\n\nThe new `GooFit::Application`, which is not required but provides GooFit options, like GPU selection and status, as well as MPI support and configurable command line options, is available by adding:\n\n```cpp\n#include \"GooFit/Application.h\"\nusing namespace GooFit;\n\n// Place this at the beginning of main\nApplication app{\"Optional description\", argc, argv};\n\n// Command line options can be added here.\n\nGOOFIT_PARSE(app);\n```\n\nSee [CLI11] for more details. The [pipipi0](./examples/pipipi0DPFit) example has an example of a complex set of options.\n\nThe other key differences in code are the addition of the `GooFit` namespace (`using namespace GooFit` allows fast conversion), and the removal of direct access to members of `Variable` (using getters/setters, or directly treat the variable like its value).\n\nSee Converting to [GooFit 2.0](./docs/CONVERTING20.md), [GooFit 2.1](./docs/CONVERTING21.md), and the [Changelog](./docs/CHANGELOG.md).\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eImproving performance with MPI: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nUsing the MPI version with an appropriate environment setup will allow for multiple GPU's to be used, and/or allow for multiple nodes.  To use this feature simply turn the flag on with CMake `-DGOOFIT_MPI=ON`.  This will divide the dataset by the number of processes involved.  For instance, if you have two nodes that will be involved in the calculation, the data will be split in half.  Currently, each node will load the entire buffer from disk, then load partitioned data it will work on.  It is highly recommended not to use more than one process per node for MPI+OpenMP versions.\n\nA few notes about using the MPI version:\n\n* You will need to use the `CountingVariable` for any event numbers used or referenced within the code, or anything that counts with the events.\n* Please call `setDataSize` after `setData`.  If you do not, `setDataSize` doesn't have `m_iEventsPerTask`, which will need to be recalculated.\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003eConfiguring group size and grain size: (click to expand)\u003c/summary\u003e\u003cp\u003e\n\nThis advanced option is for GPU devices only. The script `scripts/find_optimal.py` will search a programmable group and grain space in order to find the optimal configuration for the particular PDFs.  This should be run after an example has been developed and tested.  Please look at `scripts/find_optimal.py` to see how to formulate a particular script.  Depending on the searchable space, this can take hours to days to compute.\nThe script will loop over the space and configure each parameter, then recompile and run the example a number of times.  A spreadsheet is calculated to help notice patterns, and the fastest version is printed to the user.\n\n\u003c/p\u003e\u003c/details\u003e\n\n\n## Acknowledgement\n\nGooFit's development is supported by the National Science Foundation under grant number [1414736]\nand was developed under grant number [1005530].\nAny opinions, findings, and conclusions or recommendations expressed in this material are those of the developers\nand do not necessarily reflect the views of the National Science Foundation.\nIn addition, we thank the nVidia GPU Grant Program for donating hardware used in developing this framework.\n\nGooFit is available under the BSD license, except for the Landau distribution \u0026 MINUIT code. You must remove these\nto get a permissive version of GooFit.\n\n[actions-badge]:     https://github.com/GooFit/GooFit/workflows/CI/badge.svg\n[actions-link]:      https://github.com/GooFit/GooFit/actions\n[DOI-badge]:         https://zenodo.org/badge/9017446.svg\n[DOI-link]:          https://zenodo.org/badge/latestdoi/9017446\n[API documentation]: https://GooFit.github.io/GooFit\n[travis-badge]:      https://travis-ci.org/GooFit/GooFit.svg?branch=master\n[travis-link]:       https://travis-ci.org/GooFit/GooFit\n[gitter-badge]:      https://badges.gitter.im/GooFit/GooFit.svg\n[gitter-link]:       https://gitter.im/GooFit/Lobby\n[license-badge]:     https://img.shields.io/badge/License-BSD-blue.svg\n[1005530]:           https://nsf.gov/awardsearch/showAward?AWD_ID=1005530\n[1414736]:           https://nsf.gov/awardsearch/showAward?AWD_ID=1414736\n[CUDA_SELECT_NVCC_ARCH_FLAGS]: https://cmake.org/cmake/help/v3.7/module/FindCUDA.html\n[Plumbum]:           https://plumbum.readthedocs.io/en/latest/\n[FindBoost]:         https://cmake.org/cmake/help/v3.7/module/FindBoost.html\n[CLI11]:             https://github.com/CLIUtils/CLI11\n[pybind11]:          http://pybind11.readthedocs.io/en/master\n[ROOT]:              https://root.cern.ch\n[Tutorials]:         https://goofit.gitlab.io/Goo2Torial\n[pypi-status]:       https://img.shields.io/pypi/v/goofit.svg?logo=PyPI\u0026logoColor=white\n[pypi-link]:         https://pypi.python.org/pypi/goofit/\n[cf-status]:         https://img.shields.io/conda/vn/conda-forge/goofit.svg?logo=Conda-Forge\u0026logoColor=white\n[cf-link]:           https://github.com/conda-forge/goofit-split-feedstock\n[releases-badge]:    https://img.shields.io/github/release/GooFit/GooFit.svg\n[releases-link]:     https://github.com/GooFit/GooFit/releases\n[sk-badge]:          https://scikit-hep.org/assets/images/Scikit--HEP-Affiliated-blue.svg\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoofit%2Fgoofit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoofit%2Fgoofit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoofit%2Fgoofit/lists"}