From c624e7eae8ebc292b1a74e077faadd5506d88215 Mon Sep 17 00:00:00 2001
From: Dave Casper <dcasper@localhost.localdomain>
Date: Wed, 20 May 2020 23:13:54 -0700
Subject: [PATCH] Adapt to breaking changes in ATLAS conditions code

---
 .../src/FaserSCT_ReadCalibChipGainCondAlg.cxx |  8 ++-
 .../FaserSCT_ReadCalibChipNoiseCondAlg.cxx    |  8 ++-
 .../src/FillFromStringUtility.h               | 63 +++++++++++++++++++
 .../src/FaserSCT_ReadCalibChipDataTool.cxx    |  4 +-
 4 files changed, 75 insertions(+), 8 deletions(-)
 create mode 100644 Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FillFromStringUtility.h

diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.cxx
index fa7e0868..4d5bf3dc 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.cxx
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipGainCondAlg.cxx
@@ -4,17 +4,19 @@
 
 #include "FaserSCT_ReadCalibChipGainCondAlg.h"
 
+#include "FillFromStringUtility.h"
+
 #include "Identifier/IdentifierHash.h"
 #include "TrackerIdentifier/FaserSCT_ID.h"
 #include "FaserSCT_ConditionsData/FaserSCT_ConditionsParameters.h"
-#include "SCT_ConditionsTools/SCT_ReadCalibChipUtilities.h"
+#include "SCT_ConditionsTools/SCT_ReadCalibChipDefs.h"
 
 #include "GaudiKernel/EventIDRange.h"
 
 #include <memory>
 
 using namespace FaserSCT_ConditionsData;
-using namespace SCT_ReadCalibChipUtilities;
+using namespace SCT_ReadCalibChipDefs;
 
 FaserSCT_ReadCalibChipGainCondAlg::FaserSCT_ReadCalibChipGainCondAlg(const std::string& name, ISvcLocator* pSvcLocator)
   : ::AthReentrantAlgorithm(name, pSvcLocator)
@@ -122,6 +124,6 @@ FaserSCT_ReadCalibChipGainCondAlg::insertNptGainFolderData(FaserSCT_ModuleGainCa
   for (int i{0}; i!=N_NPTGAIN; ++i) {
     FaserSCT_ModuleCalibParameter& datavec{theseCalibData[i]};
     const std::string &dbData{((folderData)[nPtGainDbParameterNames[i]]).data<std::string>()};
-    fillFromString(dbData, datavec);
+    fillArrayFromString(dbData, datavec);
   }
 }
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.cxx
index bd2e3603..99475092 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.cxx
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FaserSCT_ReadCalibChipNoiseCondAlg.cxx
@@ -4,10 +4,12 @@
 
 #include "FaserSCT_ReadCalibChipNoiseCondAlg.h"
 
+#include "FillFromStringUtility.h"
+
 #include "Identifier/IdentifierHash.h"
 #include "TrackerIdentifier/FaserSCT_ID.h"
 #include "FaserSCT_ConditionsData/FaserSCT_ConditionsParameters.h"
-#include "SCT_ConditionsTools/SCT_ReadCalibChipUtilities.h"
+#include "SCT_ConditionsTools/SCT_ReadCalibChipDefs.h"
 
 #include "GaudiKernel/EventIDRange.h"
 
@@ -15,7 +17,7 @@
 #include <memory>
 
 using namespace FaserSCT_ConditionsData;
-using namespace SCT_ReadCalibChipUtilities;
+using namespace SCT_ReadCalibChipDefs;
 
 FaserSCT_ReadCalibChipNoiseCondAlg::FaserSCT_ReadCalibChipNoiseCondAlg(const std::string& name, ISvcLocator* pSvcLocator)
   : ::AthReentrantAlgorithm(name, pSvcLocator)
@@ -123,6 +125,6 @@ FaserSCT_ReadCalibChipNoiseCondAlg::insertNoiseOccFolderData(FaserSCT_ModuleNois
   for (int i{0}; i!=N_NOISEOCC; ++i) {
     FaserSCT_ModuleCalibParameter& datavec{theseCalibData[i]};
     std::string dbData{((folderData)[noiseOccDbParameterNames[i]]).data<std::string>()};
-    fillFromString(dbData, datavec);
+    fillArrayFromString(dbData, datavec);
   }
 }
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FillFromStringUtility.h b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FillFromStringUtility.h
new file mode 100644
index 00000000..6e445fcc
--- /dev/null
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsAlgorithms/src/FillFromStringUtility.h
@@ -0,0 +1,63 @@
+// -*- C++ -*-
+
+/*
+  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef FillFromStringUtility_h
+#define FillFromStringUtility_h
+
+// Include STL stuff
+#include <limits>
+#include <string>
+
+// Include boost stuff
+#include "boost/tokenizer.hpp"
+#include "boost/lexical_cast.hpp"
+
+namespace {
+  template <typename C> 
+  bool fillArrayFromString(const std::string& source, C& userContainer) {
+    if (source.empty()) return false;
+    typedef typename C::value_type V_t;
+    V_t errVal{std::numeric_limits<V_t>::has_quiet_NaN ? (std::numeric_limits<V_t>::quiet_NaN()) : 0};
+    boost::char_separator<char> sep{" "};
+    typedef boost::tokenizer<boost::char_separator<char> > Tokenizer;
+    Tokenizer tok{source, sep};
+    bool noNan{true};
+    const Tokenizer::iterator end{tok.end()};
+    int j{0};
+    for (Tokenizer::iterator i{tok.begin()}; i!=end; ++i) {
+      try {
+        userContainer[j]=boost::lexical_cast<V_t>(*i);
+      } catch (const boost::bad_lexical_cast&) {
+        userContainer[j]=errVal;
+        noNan=false;
+      }
+      ++j;
+    }
+    return noNan;
+  }
+  template <typename C> 
+  bool fillEmptyVectorFromString(const std::string& source, C& userContainer) {
+    if (source.empty()) return false;
+    typedef typename C::value_type V_t;
+    V_t errVal{std::numeric_limits<V_t>::has_quiet_NaN ? (std::numeric_limits<V_t>::quiet_NaN()) : 0};
+    boost::char_separator<char> sep{" "};
+    typedef boost::tokenizer<boost::char_separator<char> > Tokenizer;
+    Tokenizer tok{source, sep};
+    bool noNan{true};
+    const Tokenizer::iterator end{tok.end()};
+    for (Tokenizer::iterator i{tok.begin()}; i!=end; ++i) {
+      try {
+        userContainer.push_back(boost::lexical_cast<V_t>(*i));
+      } catch (const boost::bad_lexical_cast&) {
+        userContainer.push_back(errVal);
+        noNan=false;
+      }
+    }
+    return noNan;
+  }
+} // end of anonymous namespace
+
+#endif // FillFromStringUtility_h
diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_ReadCalibChipDataTool.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_ReadCalibChipDataTool.cxx
index e880dd82..0479bdeb 100644
--- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_ReadCalibChipDataTool.cxx
+++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_ReadCalibChipDataTool.cxx
@@ -14,10 +14,10 @@
 #include "FaserSCT_ConditionsData/FaserSCT_ModuleCalibParameter.h"
 #include "FaserSCT_ConditionsData/FaserSCT_ModuleGainCalibData.h"
 #include "FaserSCT_ConditionsData/FaserSCT_ModuleNoiseCalibData.h"
-#include "SCT_ConditionsTools/SCT_ReadCalibChipUtilities.h"
+#include "SCT_ConditionsTools/SCT_ReadCalibChipDefs.h"
 
 using namespace FaserSCT_ConditionsData;
-using namespace SCT_ReadCalibChipUtilities;
+using namespace SCT_ReadCalibChipDefs;
 
 //----------------------------------------------------------------------
 FaserSCT_ReadCalibChipDataTool::FaserSCT_ReadCalibChipDataTool (const std::string& type, const std::string& name, const IInterface* parent) :
-- 
GitLab