Skip to content

Commit 9cd48a4

Browse files
authored
Merge pull request #115 from MultithreadCorner/develop-hydra4
Syncing master with develop-hydra4
2 parents 457b20e + 624221b commit 9cd48a4

File tree

2,055 files changed

+535069
-54592
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,055 files changed

+535069
-54592
lines changed

CHANGELOG.md

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,53 @@
11
## CHANGE LOG
22

3+
### Hydra 4.0.1
4+
5+
Hydra is now compatible with CUDA 12.2 or higher and compliant with C++17 and C++20.
6+
7+
In this release:
8+
9+
1) Dependencies updates:
10+
11+
* Thrust v2.2.0
12+
* CUB v2.2.0
13+
* Eigen 3.4.0
14+
* Boost.Math 1.83.0 (NEW)
15+
16+
2) Dependencies functions and classes are now available under corresponding subnamespaces. For example:
17+
`hydra::thrust`, `hydra::boost::math` and `hydra::Eigen`;
18+
3) New spline algorithms for interpolation up to four dimensions:
19+
20+
Free functions:
21+
22+
```cpp
23+
24+
hydra::spline
25+
hydra::spline2D
26+
hydra::spline4D
27+
hydra::spline3D
28+
```
29+
Including overloads for range-based contained and histograms with corresponding dimension. Header: `hydra/Spline.h`
30+
31+
32+
4) New method `Interpolate(...)` for dense and sparse histograms up to four dimensions.
33+
34+
5) New functors:
35+
36+
```cpp
37+
38+
hydra::SplineFunctor
39+
hydra::Spline2DFunctor
40+
hydra::Spline4DFunctor
41+
hydra::Spline3DFunctor
42+
```
43+
Defined in the headers: `hydra/functions/SplineFunctor.h` , `hydra/functions/Spline2DFunctor.h` `hydra/functions/Spline3DFunctor.h` `hydra/functions/Spline4DFunctor.h`.
44+
45+
6) New examples covering new functionality.
46+
47+
Bug fixes:
48+
49+
Many bug fixes across the tree.
50+
351
### Hydra 3.2.2
452

553
This release:
@@ -317,8 +365,8 @@ This is the last release from series 2.x.x.
317365

318366
1. Interfaces to FFTW and CuFFT for performing 1D real-real complex-real and real-complex FFT on CPU and GPU
319367
2. FFT based convolution on CPU and GPU for arbitrary pair of functors: `hydra::convolute` and `hydra::ConvolutionFunctor`
320-
3. Cubic spiline reimplementation for deal with abitrary large datasets: `hydra::spiline` and `hydra::SpilineFunctor`
321-
4. new examples showing how to deploy convolution in fits, spilines and FFT.
368+
3. Cubic spline reimplementation for deal with abitrary large datasets: `hydra::spline` and `hydra::SpilineFunctor`
369+
4. new examples showing how to deploy convolution in fits, splines and FFT.
322370
5. Many bug fixes across the tree...
323371

324372

CMakeLists.txt

Lines changed: 83 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
### CMakeList for Hydra examples and documentation
22

3-
cmake_minimum_required(VERSION 3.2)
3+
cmake_minimum_required(VERSION 3.24)
44

55
# project name
6-
project(Hydra_examples_and_documentation)
6+
project(Hydra_examples_and_documentation LANGUAGES CXX)
77

88
# warn user if system is not UNIX
99
if(NOT UNIX)
@@ -15,30 +15,77 @@ SET(Hydra_CMAKE_DIR "${PROJECT_SOURCE_DIR}/cmake")
1515
SET(CMAKE_MODULE_PATH "${Hydra_CMAKE_DIR}" ${CMAKE_MODULE_PATH})
1616
SET(CMAKE_VERBOSE_MAKEFILE ON)
1717

18-
#check if compiler is C++14 compliant
18+
#check if compilers are C++17 compliant
1919
include(CheckCXXCompilerFlag)
20-
CHECK_CXX_COMPILER_FLAG("--std=c++14" COMPILER_SUPPORTS_CXX14)
21-
if(NOT COMPILER_SUPPORTS_CXX14)
22-
message(FATAL "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
20+
CHECK_CXX_COMPILER_FLAG("--std=c++20" COMPILER_SUPPORTS_CXX17)
21+
if(NOT COMPILER_SUPPORTS_CXX17)
22+
message(FATAL "The compiler ${CMAKE_CXX_COMPILER} has no C++20 support. Please use a different C++ compiler.")
2323
endif()
2424

2525
#compiler flags
2626
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
2727

2828
MESSAGE(STATUS "Setting Clang flags")
29-
set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
29+
set(CMAKE_CXX_FLAGS " --std=c++17 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
3030

3131
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
3232

3333
MESSAGE(STATUS "Setting GCC flags")
34-
set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
34+
set(CMAKE_CXX_FLAGS " --std=c++20 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
3535

3636
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
3737

3838
MESSAGE(STATUS "Setting ICC flags")
39-
set(CMAKE_CXX_FLAGS " --std=c++14 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
39+
set(CMAKE_CXX_FLAGS " --std=c++17 -W -march=native -fPIC -O4 -ldl" CACHE STRING "compile flags" FORCE)
4040
endif()
4141

42+
#-----------------------
43+
# Handling CUDA
44+
45+
include(CheckLanguage)
46+
47+
check_language(CUDA)
48+
49+
if(CMAKE_CUDA_COMPILER)
50+
enable_language(CUDA)
51+
message(STATUS "CUDA compiler found. Enabling CUDA support")
52+
else(CMAKE_CUDA_COMPILER)
53+
message(STATUS "CUDA compiler not found. Disabling CUDA support")
54+
endif(CMAKE_CUDA_COMPILER)
55+
56+
57+
if(CMAKE_CUDA_COMPILER)
58+
59+
set(CMAKE_CUDA_STANDARD 20)
60+
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
61+
62+
63+
find_package(CUDAToolkit)
64+
65+
if(CUDAToolkit_FOUND)
66+
67+
set( CUDA_FOUND TRUE)
68+
list(APPEND HYDRA_CUDA_FLAGS "--std=c++20")
69+
list(APPEND HYDRA_CUDA_FLAGS "--gpu-architecture=native")
70+
list(APPEND HYDRA_CUDA_FLAGS "-extended-lambda")
71+
list(APPEND HYDRA_CUDA_FLAGS "-split-compile 0")
72+
list(APPEND HYDRA_CUDA_FLAGS "-O4")
73+
#list(APPEND HYDRA_CUDA_FLAGS "--debug")
74+
#list(APPEND HYDRA_CUDA_FLAGS "--device-debug")
75+
#list(APPEND HYDRA_CUDA_FLAGS "-lineinfo")
76+
list(APPEND HYDRA_CUDA_FLAGS "-m64")
77+
list(APPEND HYDRA_CUDA_FLAGS "--threads=0")
78+
list(APPEND HYDRA_CUDA_FLAGS "--verbose")
79+
list(APPEND HYDRA_CUDA_FLAGS "--expt-relaxed-constexpr")
80+
#list(APPEND HYDRA_CUDA_FLAGS "")
81+
list(JOIN HYDRA_CUDA_FLAGS " " HYDRA_CUDA_FLAGS)
82+
set( CMAKE_CUDA_FLAGS "${HYDRA_CUDA_FLAGS}" CACHE STRING "CUDA compile flags" FORCE)
83+
get_target_property(HYDRA_CUDA_RT CUDA::cudart ALIASED_TARGET)
84+
get_target_property(HYDRA_CUDA_FFT CUDA::cufft ALIASED_TARGET)
85+
86+
endif(CUDAToolkit_FOUND)
87+
endif(CMAKE_CUDA_COMPILER)
88+
4289
#-----------------------
4390
# get Hydra
4491
find_package(Hydra REQUIRED)
@@ -58,61 +105,22 @@ if(ROOT_FOUND)
58105
include_directories(${ROOT_INCLUDE_DIRS})
59106
link_directories(${ROOT_LIBRARIES})
60107
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_ROOT_AVAILABLE_")
108+
if(CUDA_FOUND)
109+
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_ROOT_AVAILABLE_")
110+
endif(CUDA_FOUND)
61111
if(${ROOT_Minuit2_LIBRARY} MATCHES "libMinuit2.so")
62112
set(Minuit2_FOUND ON)
63113
else(Minuit2_FOUND OFF)
64114
endif()
65115
endif(ROOT_FOUND)
66116

67-
#-----------------------
68-
# get GSL for convolution examples
69-
find_package(GSL)
70-
if(GSL_FOUND)
71-
include_directories(${GSL_INCLUDE_DIRS})
72-
endif(GSL_FOUND)
73-
74-
#-----------------------
75-
# get Eigen for sPlot examples
76-
find_package( Eigen3 3.3.7 REQUIRED )
77-
include_directories( EIGEN3_INCLUDE_DIR )
78-
if(EIGEN3_FOUND)
79-
include_directories(${EIGEN3_INCLUDE_DIR})
80-
endif(EIGEN3_FOUND)
81-
82117
#-----------------------
83118
# get FFTW for convolution examples
84119
find_package(FFTW)
85120
if(FFTW_FOUND)
86121
include_directories(${FFTW_INCLUDE_DIRS})
87122
endif(FFTW_FOUND)
88123

89-
#-----------------------
90-
#get CUDA
91-
find_package(CUDA 9.2)
92-
if(CUDA_FOUND)
93-
link_directories( ${CUDA_TOOLKIT_ROOT_DIR}/lib64/)
94-
95-
#set cuda flags
96-
SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -ftemplate-backtrace-limit=0; --cudart; static; -O4 ; --expt-relaxed-constexpr; -fmad=true; --expt-extended-lambda;--relocatable-device-code=false;
97-
-Xptxas -dlcm=ca;-Xptxas --opt-level=4 )
98-
99-
SET(CUDA_PROPAGATE_HOST_FLAGS ON)
100-
SET(CUDA_SEPARABLE_COMPILATION OFF)
101-
SET(CUDA_VERBOSE_BUILD OFF)
102-
103-
104-
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 5.4)
105-
# LIST(APPEND CUDA_NVCC_FLAGS " -Xcompiler -D__CORRECT_ISO_CPP11_MATH_H_PROTO ")
106-
endif()
107-
# Detect CUDA architecture and get best NVCC flags
108-
109-
INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindCudaArch.cmake)
110-
111-
SELECT_NVCC_ARCH_FLAGS(NVCC_FLAGS_EXTRA)
112-
113-
LIST(APPEND CUDA_NVCC_FLAGS ${NVCC_FLAGS_EXTRA})
114-
115-
endif(CUDA_FOUND)
116124

117125
#-----------------------
118126
#get TBB
@@ -175,10 +183,10 @@ MESSAGE(STATUS "ROOT library path: ${ROOT_LIBRARY_DIR}" )
175183
MESSAGE(STATUS "ROOT libraries: ${ROOT_LIBRARIES}")
176184
MESSAGE(STATUS "ROOT::Minuit2: ${ROOT_Minuit2_LIBRARY}")
177185
MESSAGE(STATUS "Build CUDA/NVCC-based targets: ${BUILD_CUDA_TARGETS}")
178-
MESSAGE(STATUS "CUDA include: ${CUDA_INCLUDE_DIRS}" )
179-
MESSAGE(STATUS "CUDA RT libraries: ${CUDA_LIBRARIES}" )
180-
MESSAGE(STATUS "CUDA CUFFT libraries: ${CUDA_CUFFT_LIBRARIES}")
181-
MESSAGE(STATUS "NVCC flags: ${CUDA_NVCC_FLAGS}" )
186+
MESSAGE(STATUS "CUDAToolkit include: ${CUDAToolkit_INCLUDE_DIRS}" )
187+
MESSAGE(STATUS "CUDA RT libraries: ${HYDRA_CUDA_RT}" )
188+
MESSAGE(STATUS "CUDA CUFFT libraries: CUDA::cufft: ${HYDRA_CUDA_FFT}" )
189+
MESSAGE(STATUS "NVCC flags: ${CMAKE_CUDA_FLAGS}" )
182190
MESSAGE(STATUS "Build TBB targets: ${BUILD_TBB_TARGETS}")
183191
MESSAGE(STATUS "TBB include: ${TBB_INCLUDE_DIRS}" )
184192
MESSAGE(STATUS "TBB libraries: ${TBB_LIBRARIES}" )
@@ -199,6 +207,11 @@ file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/plots)
199207
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
200208

201209
add_custom_target(examples)
210+
add_custom_target(examples_cpp)
211+
add_custom_target(examples_tbb)
212+
add_custom_target(examples_omp)
213+
add_custom_target(examples_cuda)
214+
202215
include(${Hydra_CMAKE_DIR}/AddHydraExample.cmake)
203216

204217
add_subdirectory(examples/phase_space)
@@ -217,10 +230,23 @@ endif(Minuit2_FOUND)
217230
#+++++++++++++++++++++++++++
218231
# TESTING +
219232
#+++++++++++++++++++++++++++
220-
enable_testing()
233+
include(FetchContent)
234+
235+
FetchContent_Declare(
236+
Catch2
237+
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
238+
GIT_TAG v3.4.0
239+
)
240+
FetchContent_MakeAvailable(Catch2)
221241

222-
add_custom_target(tests)
242+
include(CTest)
243+
244+
add_custom_target(practrand_streamers)
245+
246+
if(BUILD_TESTING)
223247
add_subdirectory(testing)
248+
endif()
249+
224250

225251
#+++++++++++++++++++++++++++
226252
# DOXYGEN +

README.md

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,27 @@ Table of Contents
3232
What is it?
3333
-----------
3434

35-
Hydra is a C++14 compliant and header only framework designed to perform common data analysis tasks on massively parallel platforms. Hydra provides a collection of containers and algorithms commonly used in HEP data analysis, which can deploy transparently OpenMP, CUDA and TBB enabled devices, allowing the user to re-use the same code across a large range of available multi-core CPU and accelerators. The framework design is focused on performance and precision.
35+
Hydra is a C++17/20 compliant and header only framework designed to perform common data analysis tasks on massively parallel platforms. Hydra provides a collection of containers and algorithms commonly used in HEP data analysis, which can deploy transparently OpenMP, CUDA and TBB enabled devices, allowing the user to re-use the same code across a large range of available multi-core CPU and accelerators. The framework design is focused on performance and precision.
3636

3737
The core algorithms follow as close as possible the implementations widely used in frameworks like ROOT and libraries
3838
like GSL.
3939

4040
Main features
4141
-------------
4242

43-
Currently Hydra supports:
43+
Currently Hydra implementation includes:
4444

4545
* Generation of phase-space Monte Carlo samples with any number of particles in the final states. Sequential decays, calculation of integrals of models over the corresponding phase-space and production of weighted and unweighted samples, which can be flat or distributed following a model provided by the user.
4646
* Sampling of multidimensional pdfs.
4747
* Multidimensional maximum likelihood fits using binned and unbinned data sets.
48-
* Multi-layered simultaneous fit of different models, over different datasets, deploying different parallelization strategies for each model.
48+
* Multi-layered simultaneous fit of different models, over different datasets, deploying different parallelization strategies for each submodel.
4949
* Calculation of S-Plots, a popular technique for statistical unfolding of populations contributing to a sample.
5050
* Evaluation of multidimensional functions over heterogeneous data sets.
5151
* Numerical integration of multidimensional functions using self-adaptive Monte Carlo and quadrature methods.
5252
* Multidimensional sparse and dense histogramming of large samples.
5353
* Object-based interface to FFTW and CuFFT for performing Fast Fourier Transform in CPU and GPU.
54-
* FFT based one-dimensional convolution for arbitrary signal and kernel shapes.
55-
* Booststrap and real cubic spiline for datasets on CPU and GPU.
54+
* Fitting models containing FFT based one-dimensional convolution components with arbitrary signal and kernel shapes.
55+
* Booststrap and real cubic spline (1D, 2D, 3D and 4D)for datasets on CPU and GPU.
5656
* Sobol low discrepance sequences up to 3667 dimensions.
5757
* Seven fast and reliable counter based pseudo-random number generators.
5858

@@ -70,14 +70,11 @@ Hydra and Thrust
7070
----------------
7171

7272
Hydra is implemented on top of the [Thrust library](https://thrust.github.io/) and relies strongly on Thrust's containers, algorithms and backend management systems.
73-
The official version of Thrust supports tuples with maximum ten elements. In order to overcome this limitation, Hydra uses an
74-
[unofficial version, forked from the original, by Andrew Currigan and collaborators](https://github.com/andrewcorrigan/thrust-multi-permutation-iterator).
75-
This version implements variadic tuples and related classes, as well as provides some additional functionality, which are missing in the official Thrust.
76-
In order to keep Hydra uptodated with the latest bug-fixes and architetural improvements in Thrust, at each Hydra release, the official [Thrust library](https://thrust.github.io/) is patched with the Currigan's variadic tuple implementation.
77-
78-
So, version of Thrust distributed with Hydra is maintained by [MultithreadCorner](https://github.com/MultithreadCorner). It is basically a fork of Currigan's repository, which was merged with the latest official release available in GitHub (Thrust 1.9.7).
79-
80-
***Hydra does not depend or conflict with the official Thrust library distributed with the CUDA-SDK.***
73+
However, since the official version of Thrust supports tuples with maximum ten elements, in order to overcome this limitation, Hydra uses an
74+
[maintain an unofficial version, initially forked from the original by Andrew Currigan and collaborators](https://github.com/andrewcorrigan/thrust-multi-permutation-iterator).
75+
This version implements variadic tuples and related classes, as well as provides some additional functionality, which are missing in the official Thrust and is necessary for Hydra, but too specific to "pull request".
76+
In order to keep Hydra uptodated with the latest bug-fixes and architetural improvements in Thrust, at each Hydra release, the official [Thrust library](https://thrust.github.io/) is patched with the Currigan's variadic tuple implementation.
77+
This Thrust version is accessible in ``hydra::thrust`` namespace and does not conflicts in anyway with the users system Cuda Tookit installation or its deployment in applications also using Hydra. Same logics applies to Eigen and Boost.Math, which are also distributed with Hydra and are accessible in ``hydra::Eigen`` and ``hydra::boost::math`` namespaces.
8178

8279

8380
Supported Parallel Backends
@@ -101,7 +98,7 @@ nvcc -I/path/to/Hydra -Xcompiler -fopenmp -DHYDRA_HOST_SYSTEM=OMP -DHYDRA_DEVIC
10198
The available "host" and "device" backends can be freely combined.
10299
Two important features related to Hydra's design and the backend configuration:
103100

104-
* If CUDA backend is not used, [NVCC and the CUDA runtime](https://developer.nvidia.com/cuda-toolkit) are not necessary. The programs can be compiled with GCC, Clang or other host compiler compatible with C++14 support directly.
101+
* If CUDA backend is not used or available, [NVCC and the CUDA runtime](https://developer.nvidia.com/cuda-toolkit) are not necessary. The programs can be compiled with GCC, Clang or other host compiler compatible with C++17 support directly.
105102
* Programs written using only Hydra, Thrust, STL and standard c++ constructs, it means programs without any raw CUDA code or calls to the CUDA runtime API, can be compiled with NVCC, to run on CUDA backends, or a suitable host compiler to run on OpenMP , TBB and CPP backends. **Just change the source file extension from .cu to .cpp, or something else the host compiler understands.**
106103

107104

@@ -154,7 +151,7 @@ The examples are built using [CMAKE](https://cmake.org/) with the following inst
154151
3. create a build directory: `mkdir build`
155152
4. go to build directory: `cd build`
156153
5. `cmake ..`
157-
6. `make`
154+
6. `make` or `make <target>` (possible targets are: examples_cpp, examples_tbb, examples_omp, examples_cuda, tests)
158155

159156

160157
The compiled examples will be placed in the build/examples folder. The sub-directories are named according to the functionalities they illustrate.
@@ -176,14 +173,21 @@ Each compiled example executable will have an postfix (ex.:_cpp, _cuda, _omp, _t
176173
All examples use CPP as host backend.
177174

178175

179-
Recent publications and presentations at conferences and workshops
180-
------------------------------------------------------------------
176+
Recent publications citing Hydra and presentations at conferences and workshops
177+
-------------------------------------------------------------------------------
181178

182179
1. [A. A. Alves Junior, *Hydra: a C++11 framework for data analysis in massively parallel platforms*, Proceedings of the 18th International Workshop on Advanced Computing and Analysis Techniques in Physics Research, 21-25 August 2017 Seattle,USA](https://inspirehep.net/record/1636201/files/arXiv:1711.05683.pdf),
183180
2. [A. A. Alves Junior, *Hydra: Accelerating Data Analysis in Massively Parallel Platforms* - ACAT 2017, University of Washington, 21-25 August 2017, Seattle](https://indico.cern.ch/event/567550/contributions/2638690/)
184181
3. [A. A. Alves Junior, *Hydra: A Framework for Data Analysis in Massively Parallel Platforms* - NVIDIA’s GPU Technology Conference, May 8-11, 2017 - Silicon Valley, USA](http://on-demand.gputechconf.com/gtc/2017/presentation/S7340-antonio-augusto-alves-hydra-a-framework-for-data-analysis-in-massively-parallel-platforms.pdf)
185182
4. [A. A. Alves Junior, *Hydra* - HSF-HEP analysis ecosystem workshop, 22-24 May 2017 Amsterdam, Netherlands](https://indico.cern.ch/event/613842/)
186183
5. [A. A. Alves Junior, *MCBooster and Hydra: two libraries for high performance computing and data analysis in massively parallel platforms* -Perspectives of GPU computing in Science September 2016, Rome, Italy](http://www.roma1.infn.it/conference/GPU2016/pdf/talks/AlvesJr.pdf)
184+
6. [D. Brundu, A. Contu, G. M. Cossu and A. Loi, *Modeling of Solid State Detectors Using Advanced Multi-Threading: The TCoDe and TFBoost Simulation Packages* - Front. Phys., 21 March 2022 Sec. Radiation Detectors and Imaging Volume 10 - 2022 | https://doi.org/10.3389/fphy.2022.804752*](https://www.frontiersin.org/articles/10.3389/fphy.2022.804752/full)
185+
7. [A. Loi, A. Contu and A. Lai, *Timing optimisation and analysis in the design of 3D silicon sensors: the TCoDe simulator* - JINST 16 P02011, https://doi.org/10.1088/1748-0221/16/02/P02011](https://iopscience.iop.org/article/10.1088/1748-0221/16/02/P02011)
186+
8. [A. Loi, A. Contu, R. Mendicino, G. T. Forcolin, A. Lai, G. F. Betta, M. Boscardin, S. Vecchi, *Timing optimization for 3D silicon sensors* - Nuclear Instruments and Methods in Physics Research Section A: Accelerators, Spectrometers, Detectors and Associated Equipment, Volume 958, 2020, 162491,https://doi.org/10.1016/j.nima.2019.162491](https://www.sciencedirect.com/science/article/abs/pii/S0168900219310381)
187+
9. [R. Aaij et al. (LHCb Collaboration) *Angular Analysis of D0→π+π−μ+μ− and D0→K+K−μ+μ− Decays and Search for CP Violation* - Phys. Rev. Lett. 128, 221801](https://journals.aps.org/prl/abstract/10.1103/PhysRevLett.128.221801)
188+
10. [D. Brundu1, A. Cardini, A. Contu, G.M. Cossu, G.-F. Dalla Betta, M. Garau, A. Lai, A. Lampis, A. Loi and M.M. Obertino,*Accurate modelling of 3D-trench silicon sensor with enhanced timing performance and comparison with test beam measurements*
189+
JINST 16 P09028, https://doi.org/10.1088/1748-0221/16/09/P09028](https://iopscience.iop.org/article/10.1088/1748-0221/16/09/P09028/meta)
190+
187191

188192
How to cite Hydra
189193
-----------------

0 commit comments

Comments
 (0)