From 8b104c6090f92b06cdf66c826f53795e78526687 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Fri, 25 Jan 2019 10:06:25 +0100
Subject: [PATCH 1/9] Direct use of IMagFieldSvc

---
 .../SiDetElementsRoadMaker_xk.h               |  7 +-
 .../src/SiDetElementsRoadMaker_xk.cxx         | 79 +++++++------------
 2 files changed, 29 insertions(+), 57 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
index 9ab80e078bc3..1411e5ab1877 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 
@@ -113,7 +113,6 @@ namespace InDet{
       int                                  m_outputlevel{};
       int                                  m_nprint{}   ;
       int                                  m_sizeroad{} ;
-      double                               m_zfield{}   ;
       float                                m_width{}    ;  // Width of the road
       double                               m_step {}    ;  // Max step allowed
       Trk::CylinderBounds                  m_bounds{}   ;  //  
@@ -121,7 +120,6 @@ namespace InDet{
       std::string                          m_pix      ;  // PIX manager   location
       std::string                          m_sct      ;  // SCT manager   location
       std::string                          m_fieldmode;  // Mode of magnetic field
-      Trk::MagneticFieldProperties         m_fieldprop;  // Magnetic field properties
       SG::ReadCondHandleKey<SiDetElementsLayerVectors_xk> m_layerVecKey{this, "LayerVecKey",
           "SiDetElementsLayerVectors_xk", "Key of SiDetElementsLayerVectors_xk"};
 
@@ -140,9 +138,6 @@ namespace InDet{
       float stepToDetElement
 	(const InDetDD::SiDetectorElement*&,Amg::Vector3D&,Amg::Vector3D&);
 
-      void       magneticFieldInit();
-      StatusCode magneticFieldInit(IOVSVC_CALLBACK_ARGS);
-
       Trk::CylinderBounds getBound(const Trk::TrackParameters&);
 
       MsgStream&    dumpConditions(MsgStream   & out) const;
diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 7ee069224467..242354cf501c 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -15,8 +15,6 @@
 
 #include "SiDetElementsRoadUtils_xk.h"
 
-#include "AthenaPoolUtilities/CondAttrListCollection.h"
-#include "EventInfo/TagInfo.h"
 #include "InDetReadoutGeometry/SCT_DetectorManager.h"
 #include "InDetReadoutGeometry/PixelDetectorManager.h"
 #include "TrkExInterfaces/IPropagator.h"
@@ -100,17 +98,6 @@ StatusCode InDet::SiDetElementsRoadMaker_xk::initialize()
 
   ATH_CHECK(m_layerVecKey.initialize());
 
- std::string folder( "/EXT/DCS/MAGNETS/SENSORDATA" );
- const DataHandle<CondAttrListCollection> currentHandle;
- if (m_fieldmode != "NoField" && detStore()->contains<CondAttrListCollection>(folder)){
-   ATH_CHECK( detStore()->regFcn(&InDet::SiDetElementsRoadMaker_xk::magneticFieldInit,
-			   this,currentHandle,folder));
- }
- else {
-   magneticFieldInit();
-   ATH_MSG_INFO("Folder " << folder << " not present, magnetic field callback not set up. Not a problem if AtlasFieldSvc.useDCS=False");
- }
- 
   return StatusCode::SUCCESS;
 }
 
@@ -148,7 +135,14 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
-  int mode = m_fieldprop.magneticFieldMode(); 
+  std::string tmpFieldMode = m_fieldmode;
+  if(!m_fieldService->solenoidOn()) tmpFieldMode = "NoField";
+  Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
+  if     (tmpFieldMode == "NoField"    ) fieldModeEnum = Trk::NoField;
+  else if(tmpFieldMode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+
+  int mode = fieldprop.magneticFieldMode();
   if(mode<0 || mode>8 ) mode = 8; 
 
   n     = 62-fieldmode[mode].size();
@@ -508,8 +502,15 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   m_test = true; if(D<0) {m_test = false; S=-S;}
 
+  std::string fieldmode = m_fieldmode;
+  if(!m_fieldService->solenoidOn()) fieldmode = "NoField";
+  Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
+  if     (fieldmode == "NoField"    ) fieldModeEnum = Trk::NoField;
+  else if(fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+
   std::list<Amg::Vector3D> G;
-  m_proptool->globalPositions(G,Tp,m_fieldprop,getBound(Tp),S,Trk::pion);
+  m_proptool->globalPositions(G,Tp,fieldprop,getBound(Tp),S,Trk::pion);
   if(G.size()<2) return;
 
   if(D > 0) {
@@ -727,39 +728,6 @@ float InDet::SiDetElementsRoadMaker_xk::stepToDetElement
   return  float((A.x()*(R.x()-r.x())+A.y()*(R.y()-r.y())+A.z()*(R.z()-r.z()))/D);
 }
 
-///////////////////////////////////////////////////////////////////
-// Callback function - get the magnetic field /
-///////////////////////////////////////////////////////////////////
-
-StatusCode InDet::SiDetElementsRoadMaker_xk::magneticFieldInit(IOVSVC_CALLBACK_ARGS) 
-{
-  // Build MagneticFieldProperties 
-  //
-  if(!m_fieldService->solenoidOn()) m_fieldmode ="NoField";
-  magneticFieldInit();
-  return StatusCode::SUCCESS;
-}
-
-void InDet::SiDetElementsRoadMaker_xk::magneticFieldInit() 
-{
-  // Build MagneticFieldProperties 
-  //
-  Trk::MagneticFieldProperties* pMF = 0;
-  if     (m_fieldmode == "NoField"    ) pMF = new Trk::MagneticFieldProperties(Trk::NoField  );
-  else if(m_fieldmode == "MapSolenoid") pMF = new Trk::MagneticFieldProperties(Trk::FastField);
-  else                                  pMF = new Trk::MagneticFieldProperties(Trk::FullField);
-  m_fieldprop = *pMF; delete pMF;
-
-  // Test is filed or no
-  //
-  m_zfield = 0.;
-  if(m_fieldprop.magneticFieldMode()!=Trk::NoField) {
-
-    double f[3], p[3] ={10.,10.,0.}; m_fieldService->getFieldZR(p,f);
-    m_zfield =  299.7925*f[2];
-  }
-}
-
 ///////////////////////////////////////////////////////////////////
 // Cylinder bounds parameters estimation
 ///////////////////////////////////////////////////////////////////
@@ -769,11 +737,20 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 {
   const double cor = 1.;
 
-  if( fabs(m_zfield) < .0000001    ) return m_bounds;
+  double zfield = 0.;
+  std::string fieldmode = m_fieldmode;
+  if(!m_fieldService->solenoidOn()) fieldmode = "NoField";
+  if(fieldmode!="NoField") {
+    double f[3], p[3] ={10.,10.,0.};
+    m_fieldService->getFieldZR(p,f);
+    zfield =  299.7925*f[2];
+  }
+
+  if( fabs(zfield) < .0000001    ) return m_bounds;
 
   const AmgVector(5)& Vp = Tp.parameters();
   
-  double cur  = m_zfield*Vp[4]/sin(Vp[3]);
+  double cur  = zfield*Vp[4]/sin(Vp[3]);
 
   if( fabs(cur)*m_bounds.r() < cor ) return m_bounds;
 
-- 
GitLab


From 2f8fe2079695f4716dbe8140bba5a5f70f03a611 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Fri, 25 Jan 2019 12:09:23 +0100
Subject: [PATCH 2/9] Reduce computation

---
 .../src/SiDetElementsRoadMaker_xk.cxx                | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 242354cf501c..2ac7c764f4d0 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -135,11 +135,9 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
-  std::string tmpFieldMode = m_fieldmode;
-  if(!m_fieldService->solenoidOn()) tmpFieldMode = "NoField";
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
-  if     (tmpFieldMode == "NoField"    ) fieldModeEnum = Trk::NoField;
-  else if(tmpFieldMode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
+  else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
 
   int mode = fieldprop.magneticFieldMode();
@@ -502,11 +500,9 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   m_test = true; if(D<0) {m_test = false; S=-S;}
 
-  std::string fieldmode = m_fieldmode;
-  if(!m_fieldService->solenoidOn()) fieldmode = "NoField";
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
-  if     (fieldmode == "NoField"    ) fieldModeEnum = Trk::NoField;
-  else if(fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
+  else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
 
   std::list<Amg::Vector3D> G;
-- 
GitLab


From fbea431cee5921e9a8d9c16a81d18869e1c3131c Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Fri, 25 Jan 2019 12:12:54 +0100
Subject: [PATCH 3/9] Reduce computation

---
 .../src/SiDetElementsRoadMaker_xk.cxx                         | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 2ac7c764f4d0..c5ed36c8bccd 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -734,9 +734,7 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
   const double cor = 1.;
 
   double zfield = 0.;
-  std::string fieldmode = m_fieldmode;
-  if(!m_fieldService->solenoidOn()) fieldmode = "NoField";
-  if(fieldmode!="NoField") {
+  if(m_fieldmode!="NoField" && m_fieldService->solenoidOn()) {
     double f[3], p[3] ={10.,10.,0.};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
-- 
GitLab


From 85732c914753a081b6fb561edbd4e632a77ef328 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Fri, 25 Jan 2019 13:15:07 +0100
Subject: [PATCH 4/9] Add timer

---
 .../src/SiDetElementsRoadMaker_xk.cxx                  | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index c5ed36c8bccd..1e74098ebbb3 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -25,6 +25,7 @@
 
 #include <ostream>
 #include <iomanip>
+#include <chrono>
 
 ///////////////////////////////////////////////////////////////////
 // Constructor
@@ -135,10 +136,13 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
+  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
   if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
+  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   int mode = fieldprop.magneticFieldMode();
   if(mode<0 || mode>8 ) mode = 8; 
@@ -500,10 +504,13 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   m_test = true; if(D<0) {m_test = false; S=-S;}
 
+  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
   if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
+  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   std::list<Amg::Vector3D> G;
   m_proptool->globalPositions(G,Tp,fieldprop,getBound(Tp),S,Trk::pion);
@@ -733,12 +740,15 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 {
   const double cor = 1.;
 
+  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   double zfield = 0.;
   if(m_fieldmode!="NoField" && m_fieldService->solenoidOn()) {
     double f[3], p[3] ={10.,10.,0.};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
+  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
+  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   if( fabs(zfield) < .0000001    ) return m_bounds;
 
-- 
GitLab


From aa005ac9953f9100ed46ccb4a7e2eedd798f8692 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Mon, 28 Jan 2019 01:49:30 +0100
Subject: [PATCH 5/9] Update

---
 .../src/SiDetElementsRoadMaker_xk.cxx               | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 1e74098ebbb3..5a182b7471a6 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -136,13 +136,14 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
+  std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
   if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
-  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
-  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
+  end = std::chrono::system_clock::now();
+  std::cout << "susumu1 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   int mode = fieldprop.magneticFieldMode();
   if(mode<0 || mode>8 ) mode = 8; 
@@ -504,13 +505,14 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   m_test = true; if(D<0) {m_test = false; S=-S;}
 
+  std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
   if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
-  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
-  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
+  end = std::chrono::system_clock::now();
+  std::cout << "susumu2 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   std::list<Amg::Vector3D> G;
   m_proptool->globalPositions(G,Tp,fieldprop,getBound(Tp),S,Trk::pion);
@@ -740,6 +742,7 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 {
   const double cor = 1.;
 
+  std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   double zfield = 0.;
   if(m_fieldmode!="NoField" && m_fieldService->solenoidOn()) {
@@ -747,7 +750,7 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
-  std::chrono::system_clock::time_point end = std::chrono::system_clock::now();
+  end = std::chrono::system_clock::now();
   std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   if( fabs(zfield) < .0000001    ) return m_bounds;
-- 
GitLab


From 8aa3b4b2af5d09ec975b005ea23bd4253681d192 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Wed, 30 Jan 2019 13:44:16 +0100
Subject: [PATCH 6/9] Avoid string comparison

---
 .../SiDetElementsRoadMaker_xk.h                 |  1 +
 .../src/SiDetElementsRoadMaker_xk.cxx           | 17 +++++++++--------
 2 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
index 1411e5ab1877..1bbc11e50fbf 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/SiDetElementsRoadTool_xk/SiDetElementsRoadMaker_xk.h
@@ -120,6 +120,7 @@ namespace InDet{
       std::string                          m_pix      ;  // PIX manager   location
       std::string                          m_sct      ;  // SCT manager   location
       std::string                          m_fieldmode;  // Mode of magnetic field
+      Trk::MagneticFieldMode               m_fieldModeEnum{Trk::FullField};
       SG::ReadCondHandleKey<SiDetElementsLayerVectors_xk> m_layerVecKey{this, "LayerVecKey",
           "SiDetElementsLayerVectors_xk", "Key of SiDetElementsLayerVectors_xk"};
 
diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 5a182b7471a6..4ab49b02fc02 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -84,6 +84,9 @@ StatusCode InDet::SiDetElementsRoadMaker_xk::initialize()
     ATH_CHECK( m_fieldServiceHandle.retrieve() );
     m_fieldService = &*m_fieldServiceHandle;
   }
+  if(m_fieldmode == "NoField") m_fieldModeEnum = Trk::NoField;
+  else if(m_fieldmode == "MapSolenoid") m_fieldModeEnum = Trk::FastField;
+  else m_fieldModeEnum = Trk::FullField;
 
   // Get propagator tool
   //
@@ -138,9 +141,8 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 
   std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
-  Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
-  if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
-  else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
+  if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
   end = std::chrono::system_clock::now();
   std::cout << "susumu1 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
@@ -507,9 +509,8 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
-  Trk::MagneticFieldMode fieldModeEnum(Trk::FullField);
-  if (m_fieldmode == "NoField" || !m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
-  else if(m_fieldmode == "MapSolenoid") fieldModeEnum = Trk::FastField;
+  Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
+  if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
   end = std::chrono::system_clock::now();
   std::cout << "susumu2 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
@@ -745,13 +746,13 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
   std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   double zfield = 0.;
-  if(m_fieldmode!="NoField" && m_fieldService->solenoidOn()) {
+  if(m_fieldModeEnum!=Trk::NoField && m_fieldService->solenoidOn()) {
     double f[3], p[3] ={10.,10.,0.};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
   end = std::chrono::system_clock::now();
-  std::cout << "susumu " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
+  std::cout << "susumu3 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   if( fabs(zfield) < .0000001    ) return m_bounds;
 
-- 
GitLab


From 569ec98d4b66395fff1f62ae6a608109bd545c63 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Wed, 30 Jan 2019 14:15:48 +0100
Subject: [PATCH 7/9] Use position from TrackParameter

---
 .../src/SiDetElementsRoadMaker_xk.cxx                         | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 4ab49b02fc02..c90780b2db2e 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -743,11 +743,13 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 {
   const double cor = 1.;
 
+  const Amg::Vector3D& pos = Tp.position();
+
   std::chrono::system_clock::time_point end;
   std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   double zfield = 0.;
   if(m_fieldModeEnum!=Trk::NoField && m_fieldService->solenoidOn()) {
-    double f[3], p[3] ={10.,10.,0.};
+    double f[3], p[3] ={pos[Amg::x],pos[Amg::y],pos[Amg::z]};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
-- 
GitLab


From af3c1f55962b9887868b93163da902496723949d Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Thu, 31 Jan 2019 02:49:42 +0100
Subject: [PATCH 8/9] Remove debuggin parts

---
 .../src/SiDetElementsRoadMaker_xk.cxx            | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index c90780b2db2e..3758c53556dc 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -25,7 +25,6 @@
 
 #include <ostream>
 #include <iomanip>
-#include <chrono>
 
 ///////////////////////////////////////////////////////////////////
 // Constructor
@@ -139,13 +138,9 @@ MsgStream& InDet::SiDetElementsRoadMaker_xk::dumpConditions( MsgStream& out ) co
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
-  std::chrono::system_clock::time_point end;
-  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
   if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
-  end = std::chrono::system_clock::now();
-  std::cout << "susumu1 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   int mode = fieldprop.magneticFieldMode();
   if(mode<0 || mode>8 ) mode = 8; 
@@ -507,13 +502,9 @@ void InDet::SiDetElementsRoadMaker_xk::detElementsRoad
 
   m_test = true; if(D<0) {m_test = false; S=-S;}
 
-  std::chrono::system_clock::time_point end;
-  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
   if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
   Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
-  end = std::chrono::system_clock::now();
-  std::cout << "susumu2 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   std::list<Amg::Vector3D> G;
   m_proptool->globalPositions(G,Tp,fieldprop,getBound(Tp),S,Trk::pion);
@@ -743,18 +734,13 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 {
   const double cor = 1.;
 
-  const Amg::Vector3D& pos = Tp.position();
-
-  std::chrono::system_clock::time_point end;
-  std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
   double zfield = 0.;
   if(m_fieldModeEnum!=Trk::NoField && m_fieldService->solenoidOn()) {
+    const Amg::Vector3D& pos = Tp.position();
     double f[3], p[3] ={pos[Amg::x],pos[Amg::y],pos[Amg::z]};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
-  end = std::chrono::system_clock::now();
-  std::cout << "susumu3 " << std::chrono::duration_cast<std::chrono::nanoseconds>(end-start).count() << std::endl;
 
   if( fabs(zfield) < .0000001    ) return m_bounds;
 
-- 
GitLab


From f115db42bc8dfd0f36f199c879f74059fab03e3e Mon Sep 17 00:00:00 2001
From: Susumu Oda <susumu.oda@cern.ch>
Date: Tue, 5 Feb 2019 00:44:04 +0000
Subject: [PATCH 9/9] Revert to the position around the origin in the B field
 calculation.

---
 .../src/SiDetElementsRoadMaker_xk.cxx                         | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
index 3758c53556dc..344de0746a59 100755
--- a/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/SiDetElementsRoadTool_xk/src/SiDetElementsRoadMaker_xk.cxx
@@ -736,8 +736,8 @@ Trk::CylinderBounds InDet::SiDetElementsRoadMaker_xk::getBound
 
   double zfield = 0.;
   if(m_fieldModeEnum!=Trk::NoField && m_fieldService->solenoidOn()) {
-    const Amg::Vector3D& pos = Tp.position();
-    double f[3], p[3] ={pos[Amg::x],pos[Amg::y],pos[Amg::z]};
+    // const Amg::Vector3D& pos = Tp.position();
+    double f[3], p[3] ={10., 10., 0.};//{pos[Amg::x],pos[Amg::y],pos[Amg::z]};
     m_fieldService->getFieldZR(p,f);
     zfield =  299.7925*f[2];
   }
-- 
GitLab