From 82dcf7a842d6edea1a5d27a0e7b406513cbb5021 Mon Sep 17 00:00:00 2001
From: lintao <lintao51@gmail.com>
Date: Fri, 14 May 2021 23:24:30 +0800
Subject: [PATCH] WIP: provider is an attribute and source is a tag.

---
 .../src/GenericBFieldMapBrBz.cpp              | 11 ++++++++++
 .../src/GenericBFieldMapBrBz.h                |  4 ++++
 .../src/GenericBFieldMapBrBzFactory.cpp       | 22 +++++++++++++++----
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
index f69a94c2..fe268217 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.cpp
@@ -16,3 +16,14 @@ void GenericBFieldMapBrBz::fieldComponents(const double* pos, double* field) {
 
     return;
 }
+
+void GenericBFieldMapBrBz::init_provider(const std::string& provider) {
+    if (provider == "file") {
+        std::cout << "Initialize provider with file. " << std::endl;
+    } else if (provider == "db") {
+        std::cout << "Initialize provider with file. " << std::endl;
+    } else {
+        std::string error_msg = "[ERROR] GenericBFieldMapBrBz: Unknown provider: " + provider;
+        throw std::runtime_error(error_msg); 
+    }
+}
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
index c8edf9a2..3b1711f5 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBz.h
@@ -22,6 +22,10 @@ public:
 
     virtual void fieldComponents(const double* pos, double* field);
 
+public:
+    // following are interfaces to configure this field map
+    void init_provider(const std::string& provider);
+
 private:
 
     IFieldMapProvider* m_provider;
diff --git a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
index 41bd439f..b738332c 100644
--- a/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
+++ b/Detector/MagneticFieldMap/src/GenericBFieldMapBrBzFactory.cpp
@@ -2,11 +2,13 @@
  * In this file, the xml is parsed and the GenericBFieldMapBrBz object is created and configured.
  * 
  * The properties for the GenericBFieldMapBrBz
- * - provider
+ * - provider (attribute)
  *   - [file, db]
- * - source
- *   - file path for the 'file' mode.
- *   - DB ... for the 'db' mode.
+ * - source (tag)
+ *   - the attributes include: 
+ *     - url
+ *       - file path for the 'file' mode.
+ *       - DB instance ... for the 'db' mode.
  * - rhoMin, rhoMax, zMin, zMax
  * 
  * -- Tao Lin <lintao AT ihep.ac.cn>
@@ -41,10 +43,22 @@ static dd4hep::Ref_t create_GenericBFieldMapBrBz(dd4hep::Detector& ,
         throw std::runtime_error(error_msg);
     }
 
+    std::string provider = xmlParameter.attr<std::string>(_Unicode(provider));
+
+    // - source
+    bool hasSource = xmlParameter.hasChild(_Unicode(source));
+    if (!hasSource) {
+        std::string error_msg = "[ERROR] GenericBFieldMapBrBz: Must specify the 'source' tag. ";
+        throw std::runtime_error(error_msg);
+
+    }
+
     // 2. create the CartesianField
     dd4hep::CartesianField obj;
     GenericBFieldMapBrBz* ptr = new GenericBFieldMapBrBz();
 
+    ptr->init_provider(provider);
+
     obj.assign(ptr, xmlParameter.nameStr(), xmlParameter.typeStr());
 
     return obj;
-- 
GitLab