From a02e5a10d55c8101fc38ac324cbeb548f1f69921 Mon Sep 17 00:00:00 2001
From: Susumu Oda <Susumu.Oda@cern.ch>
Date: Fri, 1 Feb 2019 15:15:29 +0100
Subject: [PATCH] Drop magnetic field callback in TRT_DetElementsRoadMaker_xk

---
 .../TRT_DetElementsRoadMaker_xk.h             |  7 +-
 .../src/TRT_DetElementsRoadMaker_xk.cxx       | 90 ++++++-------------
 2 files changed, 30 insertions(+), 67 deletions(-)

diff --git a/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadMaker_xk.h b/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadMaker_xk.h
index 9a13c8aeb6ec..d802ca480122 100755
--- a/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadMaker_xk.h
+++ b/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadTool_xk/TRT_DetElementsRoadMaker_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
 */
 
 
@@ -101,12 +101,10 @@ namespace InDet {
       ServiceHandle<MagField::IMagFieldSvc> m_fieldServiceHandle;
       MagField::IMagFieldSvc*               m_fieldService{}      ;
       ToolHandle<Trk::IPropagator>          m_proptool ;  // Propagator     tool
-      Trk::MagneticFieldProperties          m_fieldprop;  // Magnetic field properties
 
       int                                  m_outputlevel{};
       int                                  m_nprint{}   ;
       int                                  m_sizeroad{} ;
-      double                               m_zfield{}   ;
       float                                m_width{}    ;  // Width of the roadInnerDetector/InDetRecTools/
       double                               m_step{}     ;  // Max step allowed
       double                               m_rminTRT{}  ;
@@ -116,6 +114,7 @@ namespace InDet {
 
       std::string                          m_trt      ;  // PIX manager   location
       std::string                          m_fieldmode;  // Mode of magnetic field
+      Trk::MagneticFieldMode               m_fieldModeEnum{Trk::FullField};
       std::string                     m_callbackString;
 
       ///////////////////////////////////////////////////////////////////
@@ -131,8 +130,6 @@ namespace InDet {
       double stepToDetElement
 	(const InDetDD::TRT_BaseElement*&,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/TRT_DetElementsRoadTool_xk/src/TRT_DetElementsRoadMaker_xk.cxx b/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/src/TRT_DetElementsRoadMaker_xk.cxx
index 6ee30ecd0563..84313c5f251a 100755
--- a/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/src/TRT_DetElementsRoadMaker_xk.cxx
+++ b/InnerDetector/InDetRecTools/TRT_DetElementsRoadTool_xk/src/TRT_DetElementsRoadMaker_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
 */
 
 ///////////////////////////////////////////////////////////////////
@@ -16,7 +16,6 @@
 
 #include <utility>
 
-#include "AthenaPoolUtilities/CondAttrListCollection.h"
 #include "InDetReadoutGeometry/TRT_DetectorManager.h"
 #include "InDetReadoutGeometry/TRT_BarrelElement.h"
 #include "InDetReadoutGeometry/TRT_EndcapElement.h"
@@ -92,6 +91,9 @@ StatusCode InDet::TRT_DetElementsRoadMaker_xk::initialize()
     ATH_MSG_DEBUG("Retrieved " << m_fieldServiceHandle );
     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
   //
@@ -131,26 +133,6 @@ StatusCode InDet::TRT_DetElementsRoadMaker_xk::initialize()
   else {
     msg(MSG::INFO) << "Register the callback" << m_proptool << endmsg;
   }
-  
-  
-  // Setup callback for magnetic field
-  //
-  std::string folder( "/EXT/DCS/MAGNETS/SENSORDATA" );
-  const DataHandle<CondAttrListCollection> currentHandle;
-  if (m_fieldmode != "NoField" && detStore()->contains<CondAttrListCollection>(folder)){
-    sc = detStore()->regFcn(&InDet::TRT_DetElementsRoadMaker_xk::magneticFieldInit,this,currentHandle,folder);
-    
-    if(sc==StatusCode::SUCCESS) {
-      msg(MSG::INFO) << "Registered callback from MagneticFieldSvc for " << name() << endmsg;
-    } else {
-      msg(MSG::ERROR) << "Could not book callback from MagneticFieldSvc for " << name () << endmsg;
-      return StatusCode::FAILURE;
-    }
-  }
-  else {
-    magneticFieldInit();
-    ATH_MSG_INFO("Folder " << folder << " not present, magnetic field callback not set up. Not a problem if AtlasFieldSvc.useDCS=False");
-  }
 
   // Get output print level
   //
@@ -191,7 +173,10 @@ MsgStream& InDet::TRT_DetElementsRoadMaker_xk::dumpConditions( MsgStream& out )
 			     "ToroidalField" ,"Grid3DField"  ,"RealisticField" ,
 			     "UndefinedField","AthenaField"  , "?????"         };
 
-  int mode = m_fieldprop.magneticFieldMode(); 
+  Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
+  if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
+  Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+  int mode = fieldprop.magneticFieldMode();
   if(mode<0 || mode>8 ) mode = 8; 
 
   n     = 62-fieldmode[mode].size();
@@ -374,9 +359,12 @@ void InDet::TRT_DetElementsRoadMaker_xk::detElementsRoad
   Trk::CylinderBounds CB = getBound(Tp);
 
   if( CB.r() > m_rminTRT) {
+    Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
+    if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
+    Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
 
     std::list<Amg::Vector3D> G;
-    m_proptool->globalPositions(G,Tp,m_fieldprop,CB,S,Trk::pion);
+    m_proptool->globalPositions(G,Tp,fieldprop,CB,S,Trk::pion);
 
     if(G.size() > 1 ) {
       m_map[0]>0 ? detElementsRoadATL(G,R) : detElementsRoadCTB(G,R);
@@ -407,8 +395,12 @@ void InDet::TRT_DetElementsRoadMaker_xk::detElementsRoad
  std::list<const InDetDD::TRT_BaseElement*>::const_iterator r=RE.begin(),re=RE.end();
  if(r==re) return;
 
+ Trk::MagneticFieldMode fieldModeEnum(m_fieldModeEnum);
+ if(!m_fieldService->solenoidOn()) fieldModeEnum = Trk::NoField;
+ Trk::MagneticFieldProperties fieldprop(fieldModeEnum);
+
  const Trk::TrackParameters* tp0 = 
-   m_proptool->propagate(Tp,(*r)->surface(),D,false,m_fieldprop,Trk::pion); 
+   m_proptool->propagate(Tp,(*r)->surface(),D,false,fieldprop,Trk::pion);
  if(!tp0) return;
 
  std::pair<const InDetDD::TRT_BaseElement*,const Trk::TrackParameters*> EP0((*r),tp0);
@@ -417,7 +409,7 @@ void InDet::TRT_DetElementsRoadMaker_xk::detElementsRoad
  for(++r; r!=re; ++r) {
    
    const Trk::TrackParameters* tp = 
-     m_proptool->propagate((*tp0),(*r)->surface(),D,false,m_fieldprop,Trk::pion);
+     m_proptool->propagate((*tp0),(*r)->surface(),D,false,fieldprop,Trk::pion);
    if(!tp) return;
 
    std::pair<const InDetDD::TRT_BaseElement*,const Trk::TrackParameters*> EP((*r),tp);
@@ -1019,40 +1011,6 @@ double InDet::TRT_DetElementsRoadMaker_xk::stepToDetElement
   return  ((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::TRT_DetElementsRoadMaker_xk::magneticFieldInit(IOVSVC_CALLBACK_ARGS) 
-{
-  // Build MagneticFieldProperties 
-  //
-  if(!m_fieldService->solenoidOn()) m_fieldmode ="NoField";
-  magneticFieldInit();
-  return StatusCode::SUCCESS;
-}
-
-void InDet::TRT_DetElementsRoadMaker_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;
-
-  // 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];
-  }
-  delete pMF;
-}
-
 ///////////////////////////////////////////////////////////////////
 // Cylinder bounds parameters estimation
 ///////////////////////////////////////////////////////////////////
@@ -1062,11 +1020,19 @@ Trk::CylinderBounds InDet::TRT_DetElementsRoadMaker_xk::getBound
 {
   const double cor = 0.8;
 
-  if( fabs(m_zfield) < .0000001    ) return m_bounds;
+  double zfield = 0.;
+  if(m_fieldModeEnum!=Trk::NoField && m_fieldService->solenoidOn()) {
+    // 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];
+  }
+
+  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