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