From 087ab6fdbdae75a2c8a45e9fbe15a3fd8f59ac7c Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 14 May 2021 22:08:13 +0800
Subject: [PATCH] WIP: add the package MagneticFieldMap. It is not implemented
 yet.

---
 Detector/CMakeLists.txt                       |  1 +
 Detector/MagneticFieldMap/CMakeLists.txt      | 20 ++++++++++++
 .../src/GenericBFieldMapBrBz.cpp              | 17 ++++++++++
 .../src/GenericBFieldMapBrBz.h                | 31 +++++++++++++++++++
 .../MagneticFieldMap/src/IFieldMapProvider.h  | 25 +++++++++++++++
 5 files changed, 94 insertions(+)
 create mode 100644 Detector/MagneticFieldMap/CMakeLists.txt
 create mode 100644 Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
 create mode 100644 Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
 create mode 100644 Detector/MagneticFieldMap/src/IFieldMapProvider.h

diff --git a/Detector/CMakeLists.txt b/Detector/CMakeLists.txt
index 57e6f2ce..d628d7ab 100644
--- a/Detector/CMakeLists.txt
+++ b/Detector/CMakeLists.txt
@@ -7,3 +7,4 @@ add_subdirectory(DetInterface)
 add_subdirectory(DetSegmentation)
 add_subdirectory(GeomSvc)
 add_subdirectory(Identifier)
+add_subdirectory(MagneticFieldMap)
diff --git a/Detector/MagneticFieldMap/CMakeLists.txt b/Detector/MagneticFieldMap/CMakeLists.txt
new file mode 100644
index 00000000..4d5e608e
--- /dev/null
+++ b/Detector/MagneticFieldMap/CMakeLists.txt
@@ -0,0 +1,20 @@
+#################################################################################
+##Package : MagneticFieldMap
+#################################################################################
+
+gaudi_add_module(MagneticFieldMap
+                 SOURCES src/GenericBFieldMapBrBz.cpp
+                 LINK Gaudi::GaudiKernel
+                      ${DD4hep_COMPONENT_LIBRARIES}
+                      ${ROOT_LIBRARIES}
+)
+
+set(LIBRARY_OUTPUT_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+message(STATUS "LIBRARY_OUTPUT_PATH -> ${LIBRARY_OUTPUT_PATH}")
+dd4hep_generate_rootmap(MagneticFieldMap)
+
+install(TARGETS MagneticFieldMap
+  EXPORT CEPCSWTargets
+  RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin
+  LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT shlib
+  COMPONENT dev)
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
new file mode 100644
index 00000000..b4125d41
--- /dev/null
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
@@ -0,0 +1,17 @@
+
+#include "GenericBFieldMapBrBz.h"
+
+GenericBFieldMapBrBz::GenericBFieldMapBrBz()
+    : m_provider(nullptr) {
+
+}
+
+void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) {
+    double curfield[3] = {0.0, 0.0, 0.0};
+
+    field[0] += curfield[0];
+    field[1] += curfield[1];
+    field[1] += curfield[2];
+
+    return;
+}
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
new file mode 100644
index 00000000..c8edf9a2
--- /dev/null
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
@@ -0,0 +1,31 @@
+#ifndef GenericBFieldMapBrBz_h
+#define GenericBFieldMapBrBz_h
+
+/*
+ * GenericBFieldMapBrBz is an extension of Cartesian Field in DD4hep.
+ * - It enables the DD4hep to access the Magnetic Service from Gaudi. 
+ * - It also enables the calculation of Br/Bz at position X. 
+ * - It will get the map from an abstract class IFieldMapProvider.
+ *
+ * -- Tao Lin <lintao AT ihep.ac.cn>
+ */
+
+#include <DD4hep/FieldTypes.h>
+
+#include "IFieldMapProvider.h"
+
+
+class GenericBFieldMapBrBz: public dd4hep::CartesianField::Object {
+public:
+
+    GenericBFieldMapBrBz();
+
+    virtual void fieldComponents(const double* pos, double* field);
+
+private:
+
+    IFieldMapProvider* m_provider;
+};
+
+#endif
+
diff --git a/Detector/MagneticFieldMap/src/IFieldMapProvider.h b/Detector/MagneticFieldMap/src/IFieldMapProvider.h
new file mode 100644
index 00000000..e3eda83f
--- /dev/null
+++ b/Detector/MagneticFieldMap/src/IFieldMapProvider.h
@@ -0,0 +1,25 @@
+#ifndef IFieldMapProvider_h
+#define IFieldMapProvider_h
+
+/*
+ * IFieldMapProvider will provide the B-Field at a 2D grid (r-z).
+ * The provider will return the bin index for r/z. Then the GenericBFieldMapBrBz
+ * will use this bin index to get the values at (r0,z0), (r1,z0), (r0,z1), (r1,z1).
+ * The interpolation is not computated IFieldMapProvider. Please see GenericBFieldMapBrBz. 
+ *
+ * -- Tao Lin <lintao AT ihep.ac.cn>
+ */
+
+class IFieldMapProvider {
+
+    // Meta data about the map
+    virtual int rBinIdx(double r) = 0;
+    virtual int zBinIdx(double z) = 0;
+
+    // The Br and Bz
+    virtual void access(int rbin, int zbin, double& Br, double& Bz) = 0;
+
+};
+
+#endif
+
-- 
GitLab