From 80773550c2de9ad1d480ac748aff9e1d1f74f8d7 Mon Sep 17 00:00:00 2001
From: P-A Loizeau <p.-a.loizeau@gsi.de>
Date: Fri, 28 Mar 2025 15:00:56 +0100
Subject: [PATCH] Fix install + usage of KFParticle headers, both KFP lib and
 CBM libs load fully

- Patch the KFParticle CMake (KFP side) so that the headers are temporarily installed in a subfolder in the build fodler
- Fix the KFParticle external CMake file (CBM side):
  - apply KFParticle install patch to all 3 patch cases (in combination with original patch for MACOS ARM and Clang Tiny)
  - headers are installed in a subfolder
  - missing headers added to install (probably most of them installed now)
  - some headers installed under two subfolders to match dictionaries of both CBM libs and KFP lib
  - add all (new + previously used) install subfolders to interface of the installed KFP library
- Analysis: Partial path for KF includes to be compatible with all 3 usage variants
- Reco: Partial path for KF includes to be compatible with all 3 usage variants
---
 .../conversion/CbmAnaConversion.cxx           |  7 +-
 .../conversion/CbmAnaConversionKF.h           |  6 +-
 .../dielectron/papaframework/CMakeLists.txt   |  5 +-
 .../papaframework/PairAnalysisPairKF.cxx      |  4 +-
 .../papaframework/PairAnalysisPairKF.h        | 10 +--
 .../CbmKresConversionCorrectedPhotons.cxx     |  4 +-
 .../CbmKresConversionCorrectedPhotons.h       |  7 +-
 .../dielectron/pi0eta/CbmKresConversionKF.cxx |  7 +-
 .../dielectron/pi0eta/CbmKresConversionKF.h   |  5 +-
 .../pi0eta/CbmKresConversionManual.cxx        |  4 +-
 .../pi0eta/CbmKresConversionManualmbias1.cxx  |  5 +-
 .../pi0eta/CbmKresConversionManualmbias2.cxx  |  5 +-
 .../pi0eta/CbmKresConversionManualmbias3.cxx  |  5 +-
 .../pi0eta/CbmKresConversionManualmbias4.cxx  |  5 +-
 .../pi0eta/CbmKresConversionPhotons.cxx       |  4 +-
 .../pi0eta/CbmKresConversionPhotons.h         |  7 +-
 .../PWGDIL/dielectron/pi0eta/CbmKresEta.cxx   |  5 +-
 .../at_kfpf_interface/ATKFParticleFinder.cxx  |  2 +-
 external/InstallKFParticle.cmake              | 73 +++++++++++++++----
 external/KFParticle_header_install.patch      | 42 +++++++++++
 reco/KF/CbmKFParticleFinder.cxx               |  4 +-
 reco/KF/CbmKFParticleFinderQa.cxx             |  8 +-
 reco/KF/CbmKFParticleInterface.cxx            |  6 +-
 reco/KF/CbmKFV0FinderTask.h                   |  2 +-
 24 files changed, 148 insertions(+), 84 deletions(-)
 create mode 100644 external/KFParticle_header_install.patch

diff --git a/analysis/PWGDIL/dielectron/conversion/CbmAnaConversion.cxx b/analysis/PWGDIL/dielectron/conversion/CbmAnaConversion.cxx
index 6670b69154..e7b6fcdd39 100644
--- a/analysis/PWGDIL/dielectron/conversion/CbmAnaConversion.cxx
+++ b/analysis/PWGDIL/dielectron/conversion/CbmAnaConversion.cxx
@@ -26,12 +26,11 @@
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
 #include "CbmUtils.h"
-
 #include "FairMCPoint.h"
 #include "FairTrackParam.h"
-#include <Logger.h>
+#include "KFParticle/KFParticleTopoReconstructor.h"
 
-#include "KFParticleTopoReconstructor.h"
+#include <Logger.h>
 
 
 // includes of standard c++ classes or ROOT classes
@@ -2040,7 +2039,7 @@ void CbmAnaConversion::AnalysePi0_Reco()
 					cout << "CbmAnaConversion: AnalysePi0_Reco: " << alt5->first << "/" << zwischen->first << "/" << alt3->first << "/" << alt4->first << endl;
 					cout << "CbmAnaConversion: AnalysePi0_Reco: " << alt5->second << "/" << zwischen->second << "/" << alt3->second << "/" << alt4->second << endl;
 					AnalysePi0_Reco_calc(alt5->second, zwischen->second, alt3->second, alt4->second);
-				
+
 				}
 				*/
         check2 = 1;
diff --git a/analysis/PWGDIL/dielectron/conversion/CbmAnaConversionKF.h b/analysis/PWGDIL/dielectron/conversion/CbmAnaConversionKF.h
index f59884650e..b0d08925ac 100644
--- a/analysis/PWGDIL/dielectron/conversion/CbmAnaConversionKF.h
+++ b/analysis/PWGDIL/dielectron/conversion/CbmAnaConversionKF.h
@@ -25,9 +25,9 @@
 #include "CbmKFParticleFinderQa.h"
 #include "CbmMCTrack.h"
 #include "CbmVertex.h"
-#include "KFPartMatch.h"
-#include "KFParticle.h"
-#include "KFTopoPerformance.h"
+#include "KFParticle/KFPartMatch.h"
+#include "KFParticle/KFParticle.h"
+#include "KFParticle/KFTopoPerformance.h"
 
 #include <vector>
 
diff --git a/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt b/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt
index a072fe0253..2339745733 100644
--- a/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt
+++ b/analysis/PWGDIL/dielectron/papaframework/CMakeLists.txt
@@ -47,11 +47,11 @@ set(SRCS
 IF (SSE_FOUND)
   Message(STATUS "Papa will be compiled with SSE support")
   ADD_DEFINITIONS(-DHAVE_SSE)
-  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS 
+  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS
   "-msse -O3")
 ELSE (SSE_FOUND)
   MESSAGE(STATUS "Papa will be compiled without SSE support")
-  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS 
+  SET_SOURCE_FILES_PROPERTIES(${SRCS} PROPERTIES COMPILE_FLAGS
   "-O3")
 ENDIF (SSE_FOUND)
 
@@ -98,6 +98,7 @@ set(PUBLIC_DEPENDENCIES
 set(PRIVATE_DEPENDENCIES
   CbmMvdBase
   CbmSimBase
+  KFParticle
   KFParticleInterface
   Littrack
   LittrackQA
diff --git a/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.cxx b/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.cxx
index 63733318a8..0579a77557 100644
--- a/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.cxx
+++ b/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.cxx
@@ -17,7 +17,7 @@
 
 #include <TDatabasePDG.h>
 
-#include "KFParticle.h"
+//#include "KFParticle.h"
 #include "PairAnalysisMC.h"
 #include "PairAnalysisTrack.h"
 
@@ -216,7 +216,7 @@ Double_t PairAnalysisPairKF::PsiPair(Double_t /*MagField*/) const
 
   m1[0] = fD1.GetPx();
   m1[1] = fD1.GetPy();
-  m1[2] = fD1.GetPz();  
+  m1[2] = fD1.GetPz();
 
   m2[0] = fD2.GetPx();
   m2[1] = fD2.GetPy();
diff --git a/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.h b/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.h
index 219d3136d6..91072770e4 100644
--- a/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.h
+++ b/analysis/PWGDIL/dielectron/papaframework/PairAnalysisPairKF.h
@@ -14,15 +14,15 @@
 //#                                                           #
 //#############################################################
 
-#include <TLorentzVector.h>
-#include <TMath.h>
-
-#include <KFParticle.h>
-
 #include "PairAnalysisPair.h"
 #include "PairAnalysisTrack.h"
 #include "PairAnalysisTrackRotator.h"
 
+#include <TLorentzVector.h>
+#include <TMath.h>
+
+#include <KFParticle/KFParticle.h>
+
 class CbmVertex;
 class CbmMCTrack;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.cxx
index d30f8ca8ae..a6bcdd7e26 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.cxx
@@ -33,13 +33,11 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
+#include "KFParticle/KFParticle.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 using namespace std;
 
 CbmKresConversionCorrectedPhotons::CbmKresConversionCorrectedPhotons()
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.h b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.h
index 6cae2e492f..24f51c1b55 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.h
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionCorrectedPhotons.h
@@ -14,12 +14,11 @@
 #include "CbmRichRingFitterEllipseTau.h"
 #include "CbmStsTrack.h"
 #include "CbmVertex.h"
-
+#include "KFParticle/KFParticle.h"
+#include "LmvmKinePar.h"
 #include "TH2D.h"
-#include <TClonesArray.h>
 
-#include "KFParticle.h"
-#include "LmvmKinePar.h"
+#include <TClonesArray.h>
 
 class CbmRichRingFitterEllipseTau;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.cxx
index b0d796531b..7ba42fc028 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.cxx
@@ -33,15 +33,14 @@
 #include "CbmRichRingLight.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
+#include "KFParticle/KFParticle.h"
+#include "KFParticle/KFParticleTopoReconstructor.h"
+#include "LmvmKinePar.h"
 
 #include <FairRootManager.h>
 
 #include <TDirectory.h>
 
-#include "KFParticle.h"
-#include "KFParticleTopoReconstructor.h"
-#include "LmvmKinePar.h"
-
 using namespace std;
 
 CbmKresConversionKF::CbmKresConversionKF()
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.h b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.h
index 41a2bceb9d..ca33f9d350 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.h
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionKF.h
@@ -10,14 +10,13 @@
 #include "CbmKresConversionBG.h"
 #include "CbmMCTrack.h"
 #include "CbmRichRing.h"
+#include "KFParticle/KFParticle.h"
+#include "KFParticle/KFTopoPerformance.h"
 
 #include <TClonesArray.h>
 #include <TH1.h>
 #include <TH2D.h>
 
-#include "KFParticle.h"
-#include "KFTopoPerformance.h"
-
 class CbmRichRingFitterEllipseTau;
 
 using namespace std;
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManual.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManual.cxx
index e2c5714394..c91f2512c9 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManual.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManual.cxx
@@ -34,13 +34,11 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
+#include "KFParticle/KFParticle.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 using namespace std;
 
 CbmKresConversionManual::CbmKresConversionManual()
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias1.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias1.cxx
index f3905c6a8f..13c33c1e42 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias1.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias1.cxx
@@ -35,15 +35,12 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
-
+#include "KFParticle/KFParticle.h"
 #include "TDirectory.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 
 using namespace std;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias2.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias2.cxx
index 87bc8a8e47..5003264087 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias2.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias2.cxx
@@ -35,15 +35,12 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
-
+#include "KFParticle/KFParticle.h"
 #include "TDirectory.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 
 using namespace std;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias3.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias3.cxx
index e563a5ea2c..09cbc874f2 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias3.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias3.cxx
@@ -35,15 +35,12 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
-
+#include "KFParticle/KFParticle.h"
 #include "TDirectory.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 
 using namespace std;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias4.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias4.cxx
index 784ec3a309..3e88f32a8a 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias4.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionManualmbias4.cxx
@@ -35,15 +35,12 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
-
+#include "KFParticle/KFParticle.h"
 #include "TDirectory.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 
 using namespace std;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.cxx
index 383142610a..6fa275f7e0 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.cxx
@@ -32,13 +32,11 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
+#include "KFParticle/KFParticle.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 using namespace std;
 
 CbmKresConversionPhotons::CbmKresConversionPhotons()
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.h b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.h
index 8b3180e5f6..0659003f1c 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.h
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresConversionPhotons.h
@@ -13,12 +13,11 @@
 #include "CbmRichRingFitterEllipseTau.h"
 #include "CbmStsTrack.h"
 #include "CbmVertex.h"
-
+#include "KFParticle/KFParticle.h"
+#include "LmvmKinePar.h"
 #include "TH2D.h"
-#include <TClonesArray.h>
 
-#include "KFParticle.h"
-#include "LmvmKinePar.h"
+#include <TClonesArray.h>
 
 class CbmRichRingFitterEllipseTau;
 
diff --git a/analysis/PWGDIL/dielectron/pi0eta/CbmKresEta.cxx b/analysis/PWGDIL/dielectron/pi0eta/CbmKresEta.cxx
index c0093c38b7..19d6ef5cc0 100644
--- a/analysis/PWGDIL/dielectron/pi0eta/CbmKresEta.cxx
+++ b/analysis/PWGDIL/dielectron/pi0eta/CbmKresEta.cxx
@@ -33,15 +33,12 @@
 #include "CbmStsHit.h"
 #include "CbmStsTrack.h"
 #include "CbmTrackMatchNew.h"
-
 #include "FairRootManager.h"
-
+#include "KFParticle/KFParticle.h"
 #include "TDirectory.h"
 
 #include <iostream>
 
-#include "KFParticle.h"
-
 
 using namespace std;
 
diff --git a/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx b/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
index 94b4db1a0e..b9bde2c271 100644
--- a/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
+++ b/analysis/common/at_kfpf_interface/ATKFParticleFinder.cxx
@@ -5,7 +5,7 @@
 #include "ATKFParticleFinder.h"
 
 #include "AnalysisTree/Matching.hpp"
-#include "KFParticleTopoReconstructor.h"
+#include "KFParticle/KFParticleTopoReconstructor.h"
 
 void ATKFParticleFinder::InitInput(const std::string& file_name, const std::string& tree_name)
 {
diff --git a/external/InstallKFParticle.cmake b/external/InstallKFParticle.cmake
index 0e9724197a..60b0bc3390 100644
--- a/external/InstallKFParticle.cmake
+++ b/external/InstallKFParticle.cmake
@@ -4,6 +4,9 @@ set(KFPARTICLE_SRC_URL "https://github.com/cbmsw/KFParticle.git")
 set(KFPARTICLE_DESTDIR "${CMAKE_BINARY_DIR}/external/KFPARTICLE-prefix")
 set(KFPARTICLE_TAG     "9b11e3e9da4e0896af80701210d19f7ca69c39d4")
 
+set(KF_MACOS_ARM_PATCH  "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle_applem1.patch")
+set(KF_CLANG_TINY_PATCH "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle_clang_tidy.patch")
+set(KF_INCLUDE_PATCH    "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle_header_install.patch")
 # GIT_TAG is a hash for KFParticle tag cbm/v1.1-1
 if (CMAKE_SYSTEM_NAME MATCHES Darwin AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES arm64)
   download_project_if_needed(PROJECT         kfparticle_source
@@ -11,7 +14,7 @@ if (CMAKE_SYSTEM_NAME MATCHES Darwin AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES arm64
                              GIT_TAG         ${KFPARTICLE_TAG}
                              SOURCE_DIR      ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle
                              TEST_FILE       CMakeLists.txt
-                             PATCH_COMMAND   "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle_applem1.patch"
+                             PATCH_COMMAND   "${KF_MACOS_ARM_PATCH} && ${KF_INCLUDE_PATCH}"
                             )
 else()
   if(BUILD_FOR_TIDY)
@@ -20,7 +23,7 @@ else()
                                GIT_TAG         ${KFPARTICLE_TAG}
                                SOURCE_DIR      ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle
                                TEST_FILE       CMakeLists.txt
-                               PATCH_COMMAND   "patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle_clang_tidy.patch"
+                               PATCH_COMMAND   "${KF_CLANG_TINY_PATCH} && ${KF_INCLUDE_PATCH}"
                               )
   else()
     download_project_if_needed(PROJECT         kfparticle_source
@@ -28,6 +31,7 @@ else()
                                GIT_TAG         ${KFPARTICLE_TAG}
                                SOURCE_DIR      ${CMAKE_CURRENT_SOURCE_DIR}/KFParticle
                                TEST_FILE       CMakeLists.txt
+                               PATCH_COMMAND   "${KF_INCLUDE_PATCH}"
                               )
   endif()
 endif()
@@ -37,8 +41,8 @@ If(ProjectUpdated)
   Message("KFParticle source directory was changed so build directory was deleted")
 EndIf()
 
-if(NOT EXISTS ${CMAKE_BINARY_DIR}/include)
-  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include)
+if(NOT EXISTS ${CMAKE_BINARY_DIR}/include/KFParticle)
+  file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/include/KFParticle)
 endif()
 
 ExternalProject_Add(KFPARTICLE
@@ -69,7 +73,16 @@ ExternalProject_Add(KFPARTICLE
 add_library(KFParticle SHARED IMPORTED GLOBAL)
 set_target_properties(KFParticle PROPERTIES
   IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}KFParticle${CMAKE_SHARED_LIBRARY_SUFFIX}
-  INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/include)
+)
+target_include_directories( KFParticle
+  INTERFACE
+    ${CMAKE_BINARY_DIR}/include
+    ${CMAKE_BINARY_DIR}/include/KFParticle
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/KFParticle>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/KFParticlePerformance>
+    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/KFParticleTest>
+)
 target_link_libraries(KFParticle INTERFACE Vc::Vc)
 
 
@@ -81,19 +94,53 @@ Install(FILES ${CMAKE_BINARY_DIR}/lib/${KFPARTICLE_LIBNAME}
         DESTINATION lib
        )
 
-Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticleBase.h
-              ${CMAKE_BINARY_DIR}/include/KFParticle.h
-              ${CMAKE_BINARY_DIR}/include/KFVertex.h
+Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleBase.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticle.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFVertex.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleTopoReconstructor.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFTopoPerformance.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPTrackVector.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFMCTrack.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleSIMD.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticlePerformanceBase.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPVEfficiencies.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFMCVertex.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPartMatch.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticlePVReconstructor.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleFinder.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleBaseSIMD.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleDef.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPSimdAllocator.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPTrack.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPEmcCluster.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleField.h
+              # Next are copies of those in other folders, needed to load CBM libraries
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFMCParticle.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPartEfficiencies.h
         DESTINATION include/KFParticle
        )
-Install(FILES ${CMAKE_BINARY_DIR}/include/KFMCParticle.h
-              ${CMAKE_BINARY_DIR}/include/KFPartEfficiencies.h
+# Next are copies of those in other folders, needed exactly at this path to load the KFParticle library
+# => Not completely sure why but it seems that while no path is provided in the KF own includes, the G__KFParticle.cxx
+#    file is generated with these "internal paths", for example at line 37-43
+# ===========================================================
+#    [...]
+#    // Header files passed as explicit arguments
+#    #include "KFParticle/KFParticleBase.h"
+#    #include "KFParticle/KFParticle.h"
+#    #include "KFParticle/KFVertex.h"
+#    #include "KFParticlePerformance/KFPartEfficiencies.h"
+#    #include "KFParticlePerformance/KFMCParticle.h"
+#    #include "KFParticleTest/KFParticleTest.h"
+#    [...]
+# ===========================================================
+Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticle/KFMCParticle.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFPartEfficiencies.h
         DESTINATION include/KFParticlePerformance
        )
-Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticleTest.h
+Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticle/KFParticleTest.h
         DESTINATION include/KFParticleTest
        )
-Install(FILES ${CMAKE_BINARY_DIR}/include/KFPVertex.h
-              ${CMAKE_BINARY_DIR}/include/KFMCCounter.h
+Install(FILES ${CMAKE_BINARY_DIR}/include/KFParticle/KFPVertex.h
+              ${CMAKE_BINARY_DIR}/include/KFParticle/KFMCCounter.h
         DESTINATION include
        )
diff --git a/external/KFParticle_header_install.patch b/external/KFParticle_header_install.patch
new file mode 100644
index 0000000000..5c8ec406e8
--- /dev/null
+++ b/external/KFParticle_header_install.patch
@@ -0,0 +1,42 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index dffa254..ec48865 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -35,6 +35,7 @@ EndIf()
+ Set(INCLUDE_DIRECTORIES
+   ${PROJECT_SOURCE_DIR}/KFParticle
+   ${PROJECT_SOURCE_DIR}/KFParticlePerformance
++  ${PROJECT_SOURCE_DIR}/KFParticleTest
+ )
+ 
+ include(${ROOT_USE_FILE})
+@@ -45,7 +46,7 @@ set(CMAKE_INCLUDE_DIRECTORIES_BEFORE OFF)
+ set(LINK_DIRECTORIES
+   ${ROOT_LIBRARY_DIR}
+ )
+- 
++
+ link_directories( ${LINK_DIRECTORIES})
+ 
+ set (SOURCES
+@@ -137,7 +138,7 @@ Set(NODICT_HEADERS
+   KFParticlePerformance/KFPartMatch.h
+ )
+ 
+-install(FILES ${HEADERS} ${NODICT_HEADERS} DESTINATION include)
++install(FILES ${HEADERS} ${NODICT_HEADERS} DESTINATION include/KFParticle)
+ install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}KFParticle_rdict.pcm DESTINATION lib OPTIONAL)
+ install(FILES ${CMAKE_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}KFParticle.rootmap DESTINATION lib)
+ install(TARGETS KFParticle DESTINATION lib)
+diff --git a/KFLinkDef.h b/KFLinkDef.h
+index d51285b..35afa80 100644
+--- a/KFLinkDef.h
++++ b/KFLinkDef.h
+@@ -10,7 +10,6 @@
+ #pragma link C++ class KFVertex + ;
+ #pragma link C++ class KFPartEfficiencies + ;
+ #pragma link C++ class KFMCParticle + ;
+-#pragma link C++ class KFParticle + ;
+ #pragma link C++ class KFParticleTest + ;
+ 
+ #endif
diff --git a/reco/KF/CbmKFParticleFinder.cxx b/reco/KF/CbmKFParticleFinder.cxx
index 7ffc2dd17b..6e8f840385 100644
--- a/reco/KF/CbmKFParticleFinder.cxx
+++ b/reco/KF/CbmKFParticleFinder.cxx
@@ -21,8 +21,8 @@
 #include "FairRunAna.h"
 
 //KF Particle headers
-#include "KFPTrackVector.h"
-#include "KFParticleTopoReconstructor.h"
+#include "KFParticle/KFPTrackVector.h"
+#include "KFParticle/KFParticleTopoReconstructor.h"
 
 #include <Logger.h>
 
diff --git a/reco/KF/CbmKFParticleFinderQa.cxx b/reco/KF/CbmKFParticleFinderQa.cxx
index 0755843f8a..d3d50e64ca 100644
--- a/reco/KF/CbmKFParticleFinderQa.cxx
+++ b/reco/KF/CbmKFParticleFinderQa.cxx
@@ -15,12 +15,12 @@
 #include "CbmTrack.h"
 #include "CbmTrackMatchNew.h"
 #include "FairRunAna.h"
+#include "KFParticleMatch.h"
 
 //KF Particle headers
-#include "KFMCTrack.h"
-#include "KFParticleMatch.h"
-#include "KFParticleTopoReconstructor.h"
-#include "KFTopoPerformance.h"
+#include "KFParticle/KFMCTrack.h"
+#include "KFParticle/KFParticleTopoReconstructor.h"
+#include "KFParticle/KFTopoPerformance.h"
 
 //ROOT headers
 #include "TCanvas.h"
diff --git a/reco/KF/CbmKFParticleInterface.cxx b/reco/KF/CbmKFParticleInterface.cxx
index 51de3abbec..d2a583106f 100644
--- a/reco/KF/CbmKFParticleInterface.cxx
+++ b/reco/KF/CbmKFParticleInterface.cxx
@@ -13,9 +13,9 @@
 #include "CbmStsTrack.h"
 
 //KF Particle headers
-#include "KFPTrackVector.h"
-#include "KFParticle.h"
-#include "KFParticleSIMD.h"
+#include "KFParticle/KFPTrackVector.h"
+#include "KFParticle/KFParticle.h"
+#include "KFParticle/KFParticleSIMD.h"
 
 //ROOT headers
 #include "TClonesArray.h"  //to get arrays from the FairRootManager
diff --git a/reco/KF/CbmKFV0FinderTask.h b/reco/KF/CbmKFV0FinderTask.h
index 274eb4e4df..4a7a3fa694 100644
--- a/reco/KF/CbmKFV0FinderTask.h
+++ b/reco/KF/CbmKFV0FinderTask.h
@@ -17,7 +17,7 @@
 #include "CbmKFVertex.h"
 #include "CbmVertex.h"
 #include "FairTask.h"
-#include "KFParticleTopoReconstructor.h"
+#include "KFParticle/KFParticleTopoReconstructor.h"
 
 #include <memory>
 
-- 
GitLab