From 5260c1bd5d98b4dcec17824aa0fc6892f62fdaf9 Mon Sep 17 00:00:00 2001
From: Atlas-Software Librarian <Atlas-Software.Librarian@cern.ch>
Date: Fri, 8 Apr 2016 17:43:42 +0200
Subject: [PATCH] 'CMakeLists.txt' (MagFieldUtils-00-01-10)

	* removed dependencies on old field service (and therefore the
	useOldService feature)
	* tag as MagFieldUtils-00-01-10

2015-02-21  Vakho Tsulaia  <tsulaia@cern.ch>
	* Fixing memory leak in MagFieldTestbedAlg

2014-11-26 David Quarrie <David.Quarrie@cern.ch>
	* cmt/requirements
		Specify the required ROOT component for cmake (transparent to CMT)
	* Tagged as MagFieldUtils-00-01-08

2014-06-26 Valerio Ippolito <vippolit@cern.ch>
	* fix in derivatives computation
	* added generate-in-box option
	* added dummy (identity) implementation of field manipulation
	* no tag

2013-11-08 Robert Langenberg
...
(Long ChangeLog diff - truncated)
---
 MagneticField/MagFieldUtils/CMakeLists.txt    |  30 ++++
 .../MagFieldUtils/IdentityManipulator.h       |  41 ++++++
 .../MagFieldUtils/MagFieldTestbedAlg.h        |  10 +-
 .../MagFieldUtils/SolenoidTest.h              |   4 -
 MagneticField/MagFieldUtils/cmt/requirements  |   8 +-
 .../share/MagFieldTestbedAlg_standalone.py    |  49 ++++++
 .../share/SolenoidTest_postInclude.py         |  19 ++-
 .../share/test_IdentityManipulator.py         |  58 ++++++++
 .../MagFieldUtils/src/IdentityManipulator.cxx |  42 ++++++
 .../MagFieldUtils/src/MagFieldTestbedAlg.cxx  | 139 +++++++++---------
 .../MagFieldUtils/src/SolenoidTest.cxx        |  48 ------
 .../src/components/MagFieldUtils_entries.cxx  |   3 +
 12 files changed, 319 insertions(+), 132 deletions(-)
 create mode 100644 MagneticField/MagFieldUtils/CMakeLists.txt
 create mode 100644 MagneticField/MagFieldUtils/MagFieldUtils/IdentityManipulator.h
 create mode 100644 MagneticField/MagFieldUtils/share/MagFieldTestbedAlg_standalone.py
 create mode 100644 MagneticField/MagFieldUtils/share/test_IdentityManipulator.py
 create mode 100644 MagneticField/MagFieldUtils/src/IdentityManipulator.cxx

diff --git a/MagneticField/MagFieldUtils/CMakeLists.txt b/MagneticField/MagFieldUtils/CMakeLists.txt
new file mode 100644
index 000000000000..9fbae83a8e9f
--- /dev/null
+++ b/MagneticField/MagFieldUtils/CMakeLists.txt
@@ -0,0 +1,30 @@
+################################################################################
+# Package: MagFieldUtils
+################################################################################
+
+# Declare the package name:
+atlas_subdir( MagFieldUtils )
+
+# Declare the package's dependencies:
+atlas_depends_on_subdirs( PUBLIC
+                          Control/AthenaBaseComps
+                          GaudiKernel
+                          MagneticField/MagFieldInterfaces )
+
+# External dependencies:
+find_package( CLHEP )
+find_package( Geant4 )
+find_package( ROOT COMPONENTS RIO MathCore Core Tree Hist pthread )
+find_package( XercesC )
+
+# Component(s) in the package:
+atlas_add_component( MagFieldUtils
+                     src/*.cxx
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${XERCESC_INCLUDE_DIRS} ${GEANT4_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${XERCESC_LIBRARIES} ${GEANT4_LIBRARIES} ${CLHEP_LIBRARIES} AthenaBaseComps GaudiKernel MagFieldInterfaces )
+
+# Install files from the package:
+atlas_install_headers( MagFieldUtils )
+atlas_install_joboptions( share/*.py )
+
diff --git a/MagneticField/MagFieldUtils/MagFieldUtils/IdentityManipulator.h b/MagneticField/MagFieldUtils/MagFieldUtils/IdentityManipulator.h
new file mode 100644
index 000000000000..b517ad5a0562
--- /dev/null
+++ b/MagneticField/MagFieldUtils/MagFieldUtils/IdentityManipulator.h
@@ -0,0 +1,41 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef MAGFIELDUTILS_IDENTITYMANIPULATOR_H
+#define MAGFIELDUTILS_IDENTITYMANIPULATOR_H
+
+#include "AthenaBaseComps/AthAlgTool.h"
+
+#include "MagFieldInterfaces/IMagFieldManipulator.h"
+
+namespace MagField {
+
+  class IdentityManipulator : public IMagFieldManipulator, public AthAlgTool
+  {
+  public:
+    IdentityManipulator(const std::string& name,
+  		    const std::string& type,
+  		    const IInterface* parent);
+  
+    /// Initialize AlgTool
+    virtual StatusCode initialize();
+    
+    /// Finalize AlgTool
+    virtual StatusCode finalize();
+
+    /// Change the position at which the field is evaluated
+    virtual void modifyPosition(const double *xyz_old, double *xyz_new);
+  
+    /// Correct field (input field must have been evaluated in the point indicated by modifyPosition)
+    virtual void modifyField(double *bxyz, double *deriv = 0);
+  
+    virtual ~IdentityManipulator();
+  
+  protected:
+  };
+
+}
+
+
+#endif
diff --git a/MagneticField/MagFieldUtils/MagFieldUtils/MagFieldTestbedAlg.h b/MagneticField/MagFieldUtils/MagFieldUtils/MagFieldTestbedAlg.h
index 5ccafbf920cc..ce9869b64c4e 100644
--- a/MagneticField/MagFieldUtils/MagFieldUtils/MagFieldTestbedAlg.h
+++ b/MagneticField/MagFieldUtils/MagFieldUtils/MagFieldTestbedAlg.h
@@ -16,8 +16,7 @@
 // FrameWork includes
 #include "GaudiKernel/ServiceHandle.h"
 #include "AthenaBaseComps/AthAlgorithm.h"
-#include "BFieldCore/AbstractMagneticField.h"
-#include "BFieldAth/IMagFieldAthenaSvc.h"
+#include "GaudiKernel/IChronoStatSvc.h"
 
 // forward declarations
 class ITHistSvc;
@@ -53,18 +52,20 @@ namespace MagField {
       void        getFieldValue();					   //!< get Field value either by G4 or by MagFieldSvc
       StatusCode  fetchEnvironment();				   //!< get environment either for g4 or for magFieldSvc
 
-      ServiceHandle<IMagFieldAthenaSvc>     m_magFieldAthenaSvc;  //!< service to get vanilla field svc
       ServiceHandle<MagField::IMagFieldSvc> m_magFieldSvc;  //!< service to get vanilla field svc
 
-      MagFieldAthena* p_MagField;								//!< vanilla field service
       const G4Field *p_g4field;								//!< field service from G4
 
       ServiceHandle<ITHistSvc>        m_thistSvc;    //!< the histogram service
       std::string                     m_histStream;  //!< THistSvc stream name
 
+      ServiceHandle<IChronoStatSvc>        m_chronoSvc;    //!< the chrono service
+
       TTree                          *m_tree;        //!< the ROOT tree containing the output
       std::string                     m_treeName;    //!< name of the Tree object
 
+      bool                            m_generateBox;       //!< generate box
+      double                          m_minX;       //!< the minimum x for box generation
       double                          m_halfX;       //!< the half-lenght along x
       double                          m_halfY;       //!< the half-length along y
       double                          m_halfZ;       //!< the half-length along y
@@ -94,7 +95,6 @@ namespace MagField {
       
       bool                          m_complete;          //!< validation completed already?
       bool							m_useG4Field;        //!< G4
-      bool							m_useOldMagFieldSvc; //!< MagFieldSvc
       bool							m_recordReadings;    //!< record readings (for reproducability) or not (for speed tests)
       bool							m_useDerivatives;    //!< only outer detector values will be tested
       bool 							m_onlyCheckSolenoid; //!< only scan solenoid field
diff --git a/MagneticField/MagFieldUtils/MagFieldUtils/SolenoidTest.h b/MagneticField/MagFieldUtils/MagFieldUtils/SolenoidTest.h
index fd7ab4c01559..342308c444e4 100644
--- a/MagneticField/MagFieldUtils/MagFieldUtils/SolenoidTest.h
+++ b/MagneticField/MagFieldUtils/MagFieldUtils/SolenoidTest.h
@@ -16,8 +16,6 @@
 // FrameWork includes
 #include "GaudiKernel/ServiceHandle.h"
 #include "AthenaBaseComps/AthAlgorithm.h"
-#include "BFieldCore/AbstractMagneticField.h"
-#include "BFieldAth/IMagFieldAthenaSvc.h"
 
 // forward declarations
 class ITHistSvc;
@@ -42,8 +40,6 @@ namespace MagField {
         void getFieldValue();           //!< get Field value either by G4 or by MagFieldSvc
         StatusCode fetchEnvironment();  //!< get environment either for g4 or for magFieldSvc
 
-        ServiceHandle<IMagFieldAthenaSvc>     m_magFieldAthenaSvc;  //!< old field service
-        MagFieldAthena*                       m_magField;           //!< old field service
         ServiceHandle<MagField::IMagFieldSvc> m_magFieldSvc;        //!< new field svc
 
         ServiceHandle<ITHistSvc>  m_thistSvc;    //!< the histogram service
diff --git a/MagneticField/MagFieldUtils/cmt/requirements b/MagneticField/MagFieldUtils/cmt/requirements
index 446ffaa14fcf..530c0d50bb90 100644
--- a/MagneticField/MagFieldUtils/cmt/requirements
+++ b/MagneticField/MagFieldUtils/cmt/requirements
@@ -5,6 +5,7 @@ manager Niels van Eldik <niels.van.eldik@cern.ch>
 manager Robert Langenberg <robert.johannes.langenberg@cern.ch>
 manager Masahiro Morii <masahiro_morii@harvard.edu>
 manager Elmar Ritsch <elmar.ritsch@cern.ch>
+manager Valerio Ippolito <valerio.ippolito@cern.ch>
 
 #################################################################
 # public use statements
@@ -14,8 +15,7 @@ use AtlasPolicy                 AtlasPolicy-*
 use GaudiInterface              GaudiInterface-*              External
 use AthenaBaseComps             AthenaBaseComps-*             Control
 
-use BFieldCore                  BFieldCore-*                  MagneticField
-use BFieldAth                   BFieldAth-*                   MagneticField
+use MagFieldInterfaces          MagFieldInterfaces-*          MagneticField
 
 #################################################################
 # private use statements
@@ -24,7 +24,9 @@ private
 use Geant4                      Geant4-*                      External
 use AtlasROOT                   AtlasROOT-*                   External
 use AtlasCLHEP                  AtlasCLHEP-*                  External
-use MagFieldInterfaces          MagFieldInterfaces-*          MagneticField
+
+# Specify the required ROOT component for cmake (transparent to CMT)
+apply_pattern cmake_add_command command="find_package(ROOT COMPONENTS RIO MathCore)"
 
 public
 library MagFieldUtils *.cxx components/*.cxx
diff --git a/MagneticField/MagFieldUtils/share/MagFieldTestbedAlg_standalone.py b/MagneticField/MagFieldUtils/share/MagFieldTestbedAlg_standalone.py
new file mode 100644
index 000000000000..3a3bc5914487
--- /dev/null
+++ b/MagneticField/MagFieldUtils/share/MagFieldTestbedAlg_standalone.py
@@ -0,0 +1,49 @@
+from AthenaCommon.DetFlags import DetFlags 
+DetFlags.Muon_setOn()
+DetFlags.Calo_setOn()
+DetFlags.ID_setOn()
+
+include('RecExCond/AllDet_detDescr.py')
+
+if len(globalflags.ConditionsTag()):
+  from IOVDbSvc.CondDB import conddb
+  conddb.setGlobalTag(globalflags.ConditionsTag())
+
+# (0.) configure new MagFieldSvc
+from AthenaCommon.AppMgr import ServiceMgr
+from AthenaCommon.AppMgr import theApp   
+
+import MagFieldServices.SetupField
+
+
+theApp.EvtMax = 1
+
+from IOVDbSvc.CondDB import conddb
+conddb.addOverride('/GLOBAL/BField/Map','BFieldMap-FullAsym-09-solTil3')
+
+# (1.) setup the Athena algorithm
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+from MagFieldUtils.MagFieldUtilsConf import MagField__MagFieldTestbedAlg
+topSequence += MagField__MagFieldTestbedAlg('MagFieldTestbedAlg')
+topSequence.MagFieldTestbedAlg.useOldMagFieldSvc = False
+topSequence.MagFieldTestbedAlg.numberOfReadings = 1000000
+topSequence.MagFieldTestbedAlg.recordReadings = True
+topSequence.MagFieldTestbedAlg.coordsAlongBeam = False
+topSequence.MagFieldTestbedAlg.useDerivatives = True
+
+#topSequence.MagFieldTestbedAlg.explicitCoords = False
+#topSequence.MagFieldTestbedAlg.explicitX = 4846.35
+#topSequence.MagFieldTestbedAlg.explicitY = 2037.96
+#topSequence.MagFieldTestbedAlg.explicitZ = -12625.6
+topSequence.MagFieldTestbedAlg.onlyCheckSolenoid = False
+
+#topSequence.MagFieldTestbedAlg.ReferenceFile = 'NewMagField.root'
+
+
+# (2.) configure the THistStream
+from GaudiSvc.GaudiSvcConf import THistSvc
+if not hasattr(ServiceMgr, 'THistSvc'):
+  ServiceMgr += THistSvc("THistSvc")
+
+ServiceMgr.THistSvc.Output = ["MagFieldTestbedAlg DATAFILE='NewMagField.root' OPT='RECREATE'"]
diff --git a/MagneticField/MagFieldUtils/share/SolenoidTest_postInclude.py b/MagneticField/MagFieldUtils/share/SolenoidTest_postInclude.py
index 9e84d7737f89..8f9c7d7692ab 100644
--- a/MagneticField/MagFieldUtils/share/SolenoidTest_postInclude.py
+++ b/MagneticField/MagFieldUtils/share/SolenoidTest_postInclude.py
@@ -2,11 +2,18 @@
 from AthenaCommon.AppMgr import ServiceMgr
 from GaudiSvc.GaudiSvcConf import THistSvc
 if not hasattr(ServiceMgr, 'THistSvc'):
-  ServiceMgr += THistSvc("THistSvc")
+    ServiceMgr += THistSvc("THistSvc")
 ServiceMgr.THistSvc.Output = ["SolenoidTest DATAFILE='hurz.root' OPT='RECREATE'"]
 
+# configure the field service
 #from MagFieldServices.MagFieldServicesConf import MagField__AtlasFieldSvc
 #ServiceMgr += MagField__AtlasFieldSvc("AtlasFieldSvc");
+ServiceMgr.AtlasFieldSvc.FullMapFile = "/afs/cern.ch/user/m/masahiro/public/BFieldMap/bfieldmap_7730_20400.root"
+ServiceMgr.AtlasFieldSvc.SoleMapFile = "/afs/cern.ch/user/m/masahiro/public/BFieldMap/bfieldmap_7730_0.root"
+ServiceMgr.AtlasFieldSvc.ToroMapFile = "/afs/cern.ch/user/m/masahiro/public/BFieldMap/bfieldmap_0_20400.root"
+ServiceMgr.AtlasFieldSvc.UseDCS = False
+ServiceMgr.AtlasFieldSvc.UseSoleCurrent = 7730
+ServiceMgr.AtlasFieldSvc.UseToroCurrent = 0 # 20400
 
 # (1.) setup the SolenoidTest algorithm
 from AthenaCommon.AlgSequence import AlgSequence
@@ -14,8 +21,8 @@ topSequence = AlgSequence()
 from MagFieldUtils.MagFieldUtilsConf import MagField__SolenoidTest
 testFull = 1000	# =1000 to measure the speed of the full 3d field
 testFast = 1000	# =1000 to measure the speed of the fast 2d field
-testOld  = 1000	# =1000 to measure the speed of the old field
-testHist = 0	# =100 to produce ROOT file to compare full vs. fast
+testOld  = 0	# =1000 to measure the speed of the old field
+testHist = 100	# =100 to produce ROOT file to compare full vs. fast
 if testFull:
     topSequence += MagField__SolenoidTest('SolenoidTestFull')
     topSequence.SolenoidTestFull.UseFullField = True
@@ -53,9 +60,11 @@ if testHist:
     topSequence.SolenoidTestHist.UseOldField = True
     topSequence.SolenoidTestHist.WriteNtuple = True
     topSequence.SolenoidTestHist.Derivatives = True
+    topSequence.SolenoidTestHist.MinimumZ = -3000.
+    topSequence.SolenoidTestHist.MaximumZ =  3000.
+    topSequence.SolenoidTestHist.MinimumR =     0.
+    topSequence.SolenoidTestHist.MaximumR =  1200.
     topSequence.SolenoidTestHist.StepsR = testHist
     topSequence.SolenoidTestHist.StepsZ = testHist
     topSequence.SolenoidTestHist.StepsPhi = testHist
 
-theApp.EvtMax = 2
-
diff --git a/MagneticField/MagFieldUtils/share/test_IdentityManipulator.py b/MagneticField/MagFieldUtils/share/test_IdentityManipulator.py
new file mode 100644
index 000000000000..3826d6405db2
--- /dev/null
+++ b/MagneticField/MagFieldUtils/share/test_IdentityManipulator.py
@@ -0,0 +1,58 @@
+# example standalone joboptions to test IdentityManipulator
+# (compare with MagFieldTestbedAlg_standalone.py)
+# Valerio Ippolito, Harvard University
+
+from AthenaCommon.DetFlags import DetFlags 
+DetFlags.Muon_setOn()
+DetFlags.Calo_setOn()
+DetFlags.ID_setOn()
+
+include('RecExCond/AllDet_detDescr.py')
+
+if len(globalflags.ConditionsTag()):
+  from IOVDbSvc.CondDB import conddb
+  conddb.setGlobalTag(globalflags.ConditionsTag())
+
+# (0.) configure new MagFieldSvc
+from AthenaCommon.AppMgr import ServiceMgr
+from AthenaCommon.AppMgr import ToolSvc   
+from AthenaCommon.AppMgr import theApp   
+
+import MagFieldServices.SetupField
+
+# add the test mag field manipulation tool
+from MagFieldUtils.MagFieldUtilsConf import MagField__IdentityManipulator as manip
+ToolSvc += manip('IdentityManipulator')
+
+# configure it
+from AthenaCommon.CfgGetter import getService
+fieldSvc = getService('AtlasFieldSvc')
+fieldSvc.DoManipulation = True
+fieldSvc.ManipulatorTool = ToolSvc.IdentityManipulator
+
+theApp.EvtMax = 1
+
+from IOVDbSvc.CondDB import conddb
+conddb.addOverride('/GLOBAL/BField/Map','BFieldMap-FullAsym-09-solTil3')
+
+# (1.) setup the Athena algorithm
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+from MagFieldUtils.MagFieldUtilsConf import MagField__MagFieldTestbedAlg
+topSequence += MagField__MagFieldTestbedAlg('MagFieldTestbedAlg')
+topSequence.MagFieldTestbedAlg.useOldMagFieldSvc = False
+topSequence.MagFieldTestbedAlg.numberOfReadings = 1000000
+topSequence.MagFieldTestbedAlg.recordReadings = True
+topSequence.MagFieldTestbedAlg.coordsAlongBeam = False
+topSequence.MagFieldTestbedAlg.useDerivatives = True
+topSequence.MagFieldTestbedAlg.onlyCheckSolenoid = False
+
+# uncomment to test differences with the file produced by
+# MagFieldTestbedAlg_standalone.py
+#topSequence.MagFieldTestbedAlg.ReferenceFile = 'NewMagField.root'
+# (2.) configure the THistStream
+from GaudiSvc.GaudiSvcConf import THistSvc
+if not hasattr(ServiceMgr, 'THistSvc'):
+  ServiceMgr += THistSvc("THistSvc")
+
+ServiceMgr.THistSvc.Output = ["MagFieldTestbedAlg DATAFILE='NewMagField_IM.root' OPT='RECREATE'"]
diff --git a/MagneticField/MagFieldUtils/src/IdentityManipulator.cxx b/MagneticField/MagFieldUtils/src/IdentityManipulator.cxx
new file mode 100644
index 000000000000..b52dbbbe62e7
--- /dev/null
+++ b/MagneticField/MagFieldUtils/src/IdentityManipulator.cxx
@@ -0,0 +1,42 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "MagFieldUtils/IdentityManipulator.h"
+
+MagField::IdentityManipulator::IdentityManipulator(const std::string& name,
+                                         const std::string& type,
+					 const IInterface* parent)
+          : AthAlgTool(name, type, parent)
+{
+
+  declareInterface<IMagFieldManipulator>(this);
+}
+
+MagField::IdentityManipulator::~IdentityManipulator()
+{
+}
+
+StatusCode MagField::IdentityManipulator::initialize()
+{
+  ATH_MSG_INFO( "in initialize()" );
+  return StatusCode::SUCCESS;
+}
+
+StatusCode MagField::IdentityManipulator::finalize()
+{
+  ATH_MSG_INFO( "in finalize()" );
+  return StatusCode::SUCCESS;
+}
+
+void MagField::IdentityManipulator::modifyPosition(const double *xyz_old, double *xyz_new)
+{
+  xyz_new[0] = xyz_old[0];
+  xyz_new[1] = xyz_old[1];
+  xyz_new[2] = xyz_old[2];
+}
+
+void MagField::IdentityManipulator::modifyField(double *bxyz, double *deriv)
+{
+  // do nothing (i.e. leave bxyz untouched)
+}
diff --git a/MagneticField/MagFieldUtils/src/MagFieldTestbedAlg.cxx b/MagneticField/MagFieldUtils/src/MagFieldTestbedAlg.cxx
index 6fb7585aab53..f627bca45c40 100644
--- a/MagneticField/MagFieldUtils/src/MagFieldTestbedAlg.cxx
+++ b/MagneticField/MagFieldUtils/src/MagFieldTestbedAlg.cxx
@@ -14,6 +14,7 @@
 
 // Framework
 #include "GaudiKernel/ITHistSvc.h"
+#include "GaudiKernel/Chrono.h"
 
 // CLHEP
 #include "CLHEP/Vector/ThreeVector.h"
@@ -52,15 +53,14 @@ const double solenoidZhalf = 2820.;
 ////////////////
 MagField::MagFieldTestbedAlg::MagFieldTestbedAlg(const std::string& name,
 		ISvcLocator* pSvcLocator) :
-		::AthAlgorithm(name, pSvcLocator), m_magFieldAthenaSvc(
-				"MagFieldAthenaSvc", name), m_magFieldSvc("AtlasFieldSvc",
+		::AthAlgorithm(name, pSvcLocator), m_magFieldSvc("AtlasFieldSvc",
 				name), m_thistSvc("THistSvc", name), m_histStream(
-				"MagFieldTestbedAlg"), m_tree(0), m_treeName("field"), m_halfX(
-				11999.), m_halfY(11999.), m_halfZ(22999.), m_stepsX(200), m_stepsY(
+				"MagFieldTestbedAlg"), m_chronoSvc("ChronoStatSvc", name), m_tree(0), m_treeName("field"), m_generateBox(false), m_minX(-11999.),
+				m_halfX(11999.), m_halfY(11999.), m_halfZ(22999.), m_stepsX(200), m_stepsY(
 				200), m_stepsZ(200), m_numberOfReadings(0), m_refFile(""), m_refTreeName(
 				"field"), m_absTolerance(1e-7), m_relTolerance(0.01), m_xyzt(), m_field(), m_explicitX(
 				0), m_explicitY(0), m_explicitZ(0), m_complete(false), m_useG4Field(
-				false), m_useOldMagFieldSvc(false), m_recordReadings(true), m_onlyCheckSolenoid(
+				false), m_recordReadings(true), m_onlyCheckSolenoid(
 				false), m_coordsAlongBeam(false), m_explicitCoords(false) {
 	// histogram service
 	declareProperty("THistService", m_thistSvc, "The HistogramService");
@@ -72,6 +72,8 @@ MagField::MagFieldTestbedAlg::MagFieldTestbedAlg(const std::string& name,
 			"Name of the TTree object in the output file.");
 
 	// boundaries for the magfield validation
+	declareProperty("GenerateBox", m_generateBox = false, "generate a box centered in (0,0,0) using halfXYZ");
+	declareProperty("MinX", m_minX = -11998., "minimum x for box generation");
 	declareProperty("HalfX", m_halfX = 11998., "half-length along x-direction");
 	declareProperty("HalfY", m_halfY = 11998., "half-length along y-direction");
 	declareProperty("HalfZ", m_halfZ = 22998., "half-length along z-direction");
@@ -94,7 +96,6 @@ MagField::MagFieldTestbedAlg::MagFieldTestbedAlg(const std::string& name,
 	declareProperty("RelTolerance", m_relTolerance = 0.01,
 			"Numerical tolerance when comparing against reference.");
 	declareProperty("useG4Field", m_useG4Field);
-	declareProperty("useOldMagFieldSvc", m_useOldMagFieldSvc);
 	declareProperty("recordReadings", m_recordReadings = true);
 	declareProperty("numberOfReadings", m_numberOfReadings = 0);
 	declareProperty("useDerivatives", m_useDerivatives = false);
@@ -116,10 +117,12 @@ MagField::MagFieldTestbedAlg::~MagFieldTestbedAlg() {
 StatusCode MagField::MagFieldTestbedAlg::initialize() {
 	ATH_MSG_INFO("entering initialize()...");
 
-	if (m_useOldMagFieldSvc && m_magFieldAthenaSvc.retrieve().isFailure()) {
-		ATH_MSG_ERROR("Could not find MagFieldAthenaSvc");
-		return StatusCode::FAILURE;
-	} else if (!m_useG4Field && !m_useOldMagFieldSvc) {
+	if (m_chronoSvc.retrieve().isFailure()) {
+	   ATH_MSG_ERROR("Could not find chrono svc");
+	   return StatusCode::FAILURE;
+	}
+
+	if (!m_useG4Field) {
 		//TODO: DUMMY reading to initialize newMagFieldSvc
 		m_xyzt[3] = 0.;
 		getFieldValue();
@@ -215,37 +218,65 @@ StatusCode MagField::MagFieldTestbedAlg::execute() {
 			if (m_numberOfReadings != 0 && !m_coordsAlongBeam) {
 				TRandom3 ran;
 
-				for (long i = 0; i < m_numberOfReadings; i++) {
-					CLHEP::Hep3Vector *temp;
-					temp = new CLHEP::Hep3Vector();
-
-					double maxRadius = m_halfX;
-					double maxZ = m_halfZ;
-
-					if (m_onlyCheckSolenoid) {
-						maxRadius = solenoidRadius;
-						maxZ = solenoidZhalf;
-					}
-					temp->setX(ran.Uniform(maxRadius * (-1), maxRadius));
-					temp->setY(ran.Uniform(maxRadius * (-1), maxRadius));
-					temp->setZ(ran.Uniform(maxZ * (-1), maxZ));
-					//only generate values within radius < 11.998; for onlyCheckSolenoid radius < 1075
-
-					double radius = sqrt(
-							pow(temp->getX(), 2) + pow(temp->getY(), 2));
-					if (radius > m_halfX) {
-						i--;
-						continue;
-					}
-					coordinatesToBeChecked.push_back(*temp);
+				if (!m_generateBox) {
+                                   // generate inside a cylinder
+                                   Chrono chrono(&(*m_chronoSvc), "MFTBcylGen");
+                                   for (long i = 0; i < m_numberOfReadings; i++) {
+                                   	CLHEP::Hep3Vector temp;
+                                   
+                                   	double maxRadius = m_halfX;
+                                   	double maxZ = m_halfZ;
+                                   
+                                   	if (m_onlyCheckSolenoid) {
+                                   		maxRadius = solenoidRadius;
+                                   		maxZ = solenoidZhalf;
+                                   	}
+                                   	temp.setX(ran.Uniform(maxRadius * (-1), maxRadius));
+                                   	temp.setY(ran.Uniform(maxRadius * (-1), maxRadius));
+                                   	temp.setZ(ran.Uniform(maxZ * (-1), maxZ));
+                                   	//only generate values within radius < 11.998; for onlyCheckSolenoid radius < 1075
+                                   
+                                   	double radius = sqrt(
+                                   			pow(temp.getX(), 2) + pow(temp.getY(), 2));
+                                   	if (radius > m_halfX) {
+                                   		i--;
+                                   		continue;
+                                   	}
+                                   	coordinatesToBeChecked.push_back(temp);
+                                   }
+				} else {
+                                   // generate inside a box
+                                   Chrono chrono(&(*m_chronoSvc), "MFTBboxGen");
+                                   for (long i = 0; i < m_numberOfReadings; i++) {
+                                   	CLHEP::Hep3Vector temp;
+                                   
+                                   	double maxRadius = sqrt(pow(m_halfX, 2) + pow(m_halfY,2));
+                                   	double maxZ = m_halfZ;
+                                   
+                                   	if (m_onlyCheckSolenoid) {
+                                   		maxRadius = solenoidRadius;
+                                   		maxZ = solenoidZhalf;
+                                   	}
+                                   	temp.setX(ran.Uniform(m_minX, m_halfX)); // TODO: tidy this up...
+                                   	temp.setY(ran.Uniform(m_halfY * (-1), m_halfY));
+                                   	temp.setZ(ran.Uniform(maxZ * (-1), maxZ));
+                                   	//only generate values within radius < 11.998; for onlyCheckSolenoid radius < 1075
+                                   
+                                   	double radius = sqrt(
+                                   			pow(temp.getX(), 2) + pow(temp.getY(), 2));
+                                   	if (radius > maxRadius) {
+                                   		i--;
+                                   		continue;
+                                   	}
+                                   	coordinatesToBeChecked.push_back(temp);
+                                   }
 				}
 			}
 
 			if (m_coordsAlongBeam) {
 
 				TRandom3 rand;
-				CLHEP::Hep3Vector *temp;
-				temp = new CLHEP::Hep3Vector();
+				CLHEP::Hep3Vector temp;
 				double r, phi, theta;
 
 				for (long i = 0; i < m_numberOfReadings;) {
@@ -253,12 +284,12 @@ StatusCode MagField::MagFieldTestbedAlg::execute() {
 					phi = rand.Uniform(3.14 * (-1), 3.14);
 					theta = rand.Uniform(0, 3.14);
 					while (r < maxRadius) {
-						temp->setX(r * sin(theta) * cos(phi));
-						temp->setY(r * sin(phi) * sin(theta));
-						temp->setZ(r * cos(phi));
+						temp.setX(r * sin(theta) * cos(phi));
+						temp.setY(r * sin(phi) * sin(theta));
+						temp.setZ(r * cos(phi));
 						r += 10.;
 						i++;
-						coordinatesToBeChecked.push_back(*temp);
+						coordinatesToBeChecked.push_back(temp);
 					}
 				}
 			}
@@ -357,39 +388,13 @@ StatusCode MagField::MagFieldTestbedAlg::fetchEnvironment() {
 		if (!p_g4field) {
 			return StatusCode::FAILURE;
 		}
-	} else if (m_useOldMagFieldSvc) {
-		p_MagField = m_magFieldAthenaSvc->GetUpdatedMagFieldAthena();
-	}
+  }
 	return StatusCode::SUCCESS;
 }
 
 void MagField::MagFieldTestbedAlg::getFieldValue() {
 	if (m_useG4Field) {
 		p_g4field->GetFieldValue(m_xyzt, m_field);
-
-	} else if (m_useOldMagFieldSvc) {
-
-		// mm to cm unit conversion + double->float type conversion
-		float f_pos_in_cm[3];
-                for (int i = 0; i < 3; i++ ) {
-                        f_pos_in_cm[i] = (float) (m_xyzt[i] * 0.1);
-                }
-		float f_bfield[12];
-		if (!m_useDerivatives) {
-			p_MagField->field_tesla_cm(f_pos_in_cm, f_bfield);
-		} else {
-			p_MagField->fieldGradient_tesla_cm(f_pos_in_cm, f_bfield);
-		}
-		for (int i = 0; i < 3; i++) {
-			m_field[i] = (double) f_bfield[i] * CLHEP::tesla;
-		}
-		if (m_useDerivatives) {
-                        static const double tesla_cm( CLHEP::tesla / CLHEP::cm );
-			for (int i = 0; i < 9; i++) {
-				m_deriv[i] = (double) f_bfield[i+3] * tesla_cm;
-			}
-		}
-
 	} else {
 		// use new magnetic field service
 		m_magFieldSvc->getField(m_xyzt, m_field,
@@ -450,7 +455,7 @@ bool MagField::MagFieldTestbedAlg::checkWithReference() {
 	m_tree->Branch("fieldRelDiff", &fieldRelDiff, "diff/D");
 
 	if (m_useDerivatives) {
-		m_tree->Branch("ReferenceDerivatives", &m_deriv,
+		m_tree->Branch("ReferenceDerivatives", &refDerivatives,
 				"d1/D:d2/D:d3/D:d4/D:d5/D:d6/D:d7/D:d8/D:d9/D");
 	}
 
diff --git a/MagneticField/MagFieldUtils/src/SolenoidTest.cxx b/MagneticField/MagFieldUtils/src/SolenoidTest.cxx
index 598fff32e2f0..2aea1a76a8c0 100644
--- a/MagneticField/MagFieldUtils/src/SolenoidTest.cxx
+++ b/MagneticField/MagFieldUtils/src/SolenoidTest.cxx
@@ -42,8 +42,6 @@
 ////////////////
 MagField::SolenoidTest::SolenoidTest( const std::string& name, ISvcLocator* pSvcLocator ) :
     ::AthAlgorithm( name, pSvcLocator ),
-    m_magFieldAthenaSvc( "MagFieldAthenaSvc", name ),
-    m_magField(0),
     m_magFieldSvc( "AtlasFieldSvc", name ),
     m_thistSvc( "THistSvc", name ),
     m_tree(0),
@@ -70,7 +68,6 @@ MagField::SolenoidTest::SolenoidTest( const std::string& name, ISvcLocator* pSvc
                      "Number of steps along phi (granularity)");
     declareProperty( "UseFullField", m_useFullField = true, "compute the full 3D field");
     declareProperty( "UseFastField", m_useFastField = true, "compute the fast 2D field");
-    declareProperty( "UseOldField", m_useOldField = false, "compute the old field");
     declareProperty( "WriteNtuple", m_writeNtuple = true, "produce the output ntuple");
     declareProperty( "Derivatives", m_derivatives = false, "compute the derivatives");
 }
@@ -85,11 +82,6 @@ StatusCode MagField::SolenoidTest::initialize()
 {
     ATH_MSG_INFO("entering initialize()...");
 
-    if ( m_useOldField && m_magFieldAthenaSvc.retrieve().isFailure() ) {
-        ATH_MSG_ERROR( "Could not find MagFieldAthenaSvc" );
-        return StatusCode::FAILURE;
-    }
-
     if ( m_writeNtuple ) {
         // retrieve the histogram service
         if ( m_thistSvc.retrieve().isSuccess() ) {
@@ -114,13 +106,6 @@ StatusCode MagField::SolenoidTest::initialize()
                     "dBxdx2/D:dBxdy2/D:dBxdz2/D:dBydx2/D:dBydy2/D:dBydz2/D:dBzdx2/D:dBzdy2/D:dBzdz2/D" );
                 }
             }
-            if ( m_useOldField ) {
-                m_tree->Branch( "fieldOld", &m_fieldOld, "BxO/D:ByO/D:BzO/D" );
-                if ( m_derivatives ) {
-                    m_tree->Branch( "derivOld", &m_derivOld,
-                    "dBxdxO/D:dBxdyO/D:dBxdzO/D:dBydxO/D:dBydyO/D:dBydzO/D:dBzdxO/D:dBzdyO/D:dBzdzO/D" );
-                }
-            }
             // register this ROOT TTree to the THistSvc
             if ( m_thistSvc->regTree(prefix + m_treeName, m_tree).isFailure() ) {
                 ATH_MSG_ERROR("Unable to register TTree to THistSvc");
@@ -147,10 +132,6 @@ StatusCode MagField::SolenoidTest::finalize() {
 // Athena hook:
 StatusCode MagField::SolenoidTest::execute() {
 
-    if ( m_useOldField ) {
-        m_magField = m_magFieldAthenaSvc->GetUpdatedMagFieldAthena();
-    }
-
     if( m_event==0 ) { // event #0
         // call field service once for initialization
         m_xyzt[0] = m_xyzt[1] = m_xyzt[2] = 0;
@@ -159,14 +140,6 @@ StatusCode MagField::SolenoidTest::execute() {
         // check the field status
         ATH_MSG_INFO("New service solenoidOn = " << m_magFieldSvc->solenoidOn());
         ATH_MSG_INFO("New service toroidOn   = " << m_magFieldSvc->toroidOn());
-        if ( m_magField ) {
-            ATH_MSG_INFO("Old service getToroidBarrelOn = " << m_magField->getToroidBarrelOn());
-            ATH_MSG_INFO("Old service getToroidECTAOn   = " << m_magField->getToroidECTAOn());
-            ATH_MSG_INFO("Old service getToroidECTCOn   = " << m_magField->getToroidECTCOn());
-            ATH_MSG_INFO("Old service getSolenoidOn     = " << m_magField->getSolenoidOn());
-            ATH_MSG_INFO("Old service getAllToroidOn    = " << m_magField->getAllToroidOn());
-            ATH_MSG_INFO("Old service getFieldStatusOn  = " << m_magField->getFieldStatusOn());
-        }
     }
     else if ( m_event==1 ) { // event #1
 
@@ -198,27 +171,6 @@ StatusCode MagField::SolenoidTest::execute() {
                       else
                           m_magFieldSvc->getFieldZR( m_xyzt, m_fieldZR, 0 );
                   }
-                  // old field
-                  if ( m_useOldField ) {
-                      // unit conversion from mm to cm
-                      float f_pos_in_cm[3] = { (float)(m_xyzt[0]*.1), (float)(m_xyzt[1]*.1), (float)(m_xyzt[2]*.1) };
-                      float f_bfield[12];
-                      if ( !m_derivatives ) {
-                          m_magField->field_tesla_cm( f_pos_in_cm, f_bfield );
-                      } else {
-                          m_magField->fieldGradient_tesla_cm( f_pos_in_cm, f_bfield );
-                      }
-                      // unit conversion from kG to kT
-                      for ( int i = 0; i < 3; i++ ) {
-                          m_fieldOld[i] = (double)(f_bfield[i]*10.*CLHEP::kilogauss);
-                      }
-                      if ( m_derivatives ) {
-                          // unit conversion from kG/mm to kT/mm
-                          for ( int i = 0; i < 9; i++ ) {
-                              m_derivOld[i] = (double)(f_bfield[i+3]*CLHEP::kilogauss);
-			  }
-                      }
-                  }
 
                   // fill the ROOT Tree
                   if ( m_writeNtuple ) m_tree->Fill();
diff --git a/MagneticField/MagFieldUtils/src/components/MagFieldUtils_entries.cxx b/MagneticField/MagFieldUtils/src/components/MagFieldUtils_entries.cxx
index 821cc9d7ad7e..a7386487a70b 100644
--- a/MagneticField/MagFieldUtils/src/components/MagFieldUtils_entries.cxx
+++ b/MagneticField/MagFieldUtils/src/components/MagFieldUtils_entries.cxx
@@ -1,11 +1,14 @@
 #include "GaudiKernel/DeclareFactoryEntries.h"
 #include "MagFieldUtils/MagFieldTestbedAlg.h"
 #include "MagFieldUtils/SolenoidTest.h"
+#include "MagFieldUtils/IdentityManipulator.h"
 
 DECLARE_NAMESPACE_ALGORITHM_FACTORY( MagField , MagFieldTestbedAlg )
 DECLARE_NAMESPACE_ALGORITHM_FACTORY( MagField , SolenoidTest )
+DECLARE_NAMESPACE_TOOL_FACTORY( MagField , IdentityManipulator )
 
 DECLARE_FACTORY_ENTRIES( MagFieldUtils ) {
   DECLARE_NAMESPACE_ALGORITHM( MagField ,  MagFieldTestbedAlg )
   DECLARE_NAMESPACE_ALGORITHM( MagField ,  SolenoidTest )
+  DECLARE_NAMESPACE_TOOL( MagField ,  IdentityManipulator )
 }   
-- 
GitLab