diff --git a/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/TrkExSolenoidalIntersector/SolenoidParametrization.h b/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/TrkExSolenoidalIntersector/SolenoidParametrization.h index 7de8fe2ae0330c200601a38a1a89c0ff3bda6b36..e0215b0b838279b6443d0363a220d7f601b504a8 100755 --- a/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/TrkExSolenoidalIntersector/SolenoidParametrization.h +++ b/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/TrkExSolenoidalIntersector/SolenoidParametrization.h @@ -40,7 +40,6 @@ public: // forbidden copy constructor // forbidden assignment operator - static SolenoidParametrization* instance (void); // access to singleton static SolenoidParametrization* instance (MagField::IMagFieldSvc* magFieldSvc); // initialize singleton static void clearInstance(void); // clear (to be used before reinitialization) @@ -58,7 +57,8 @@ public: bool validOrigin(Amg::Vector3D origin) const; // param valid for this origin? private: - SolenoidParametrization (void); // singleton constructor + // implementation does not work without magnetic field service + // SolenoidParametrization (void); // singleton constructor SolenoidParametrization (MagField::IMagFieldSvc* magFieldSvc); // configuration from Intersector int fieldKey(void); void integrate(double&, double&, double, double) const; @@ -199,12 +199,13 @@ SolenoidParametrization::setTerms(int key1) //<<<<<< INLINE PUBLIC MEMBER FUNCTIONS >>>>>> -inline SolenoidParametrization* -SolenoidParametrization::instance() -{ - if (s_instance == 0) s_instance = new SolenoidParametrization(); - return s_instance; -} +// class does not work without magnetic field service +//inline SolenoidParametrization* +//SolenoidParametrization::instance() +//{ +// if (s_instance == 0) s_instance = new SolenoidParametrization(); +// return s_instance; +//} inline SolenoidParametrization* SolenoidParametrization::instance(MagField::IMagFieldSvc* magFieldSvc) diff --git a/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/src/SolenoidParametrization.cxx b/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/src/SolenoidParametrization.cxx index 7e0c2974b451ef9c1d5307da8d72cf27be4de52e..50c1ade2df74e37d7b31d77d73f4e89acaff7334 100755 --- a/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/src/SolenoidParametrization.cxx +++ b/Tracking/TrkExtrapolation/TrkExSolenoidalIntersector/src/SolenoidParametrization.cxx @@ -17,6 +17,27 @@ #include "GaudiKernel/SystemOfUnits.h" #include "TrkExSolenoidalIntersector/SolenoidParametrization.h" +namespace { + class RestoreIOSFlags + { + public: + RestoreIOSFlags (std::ostream &os) + : m_os(&os), + //m_flags(m_os->flags()), + m_precision(m_os->precision()) + {} + ~RestoreIOSFlags() { + //m_os->flags(m_flags); + m_os->precision(m_precision); + } + private: + std::ostream *m_os; + //std::ios_base::fmtflags m_flags; + std::streamsize m_precision; + }; +} + + namespace Trk { @@ -43,30 +64,35 @@ double SolenoidParametrization::s_parameters[] = {14688*0.}; //<<<<<< CLASS STRUCTURE INITIALIZATION >>>>>> // note: both constructors are private -SolenoidParametrization::SolenoidParametrization(void) - : m_hasParametrization (false) -{ - // get central field value in units required for fast tracking - s_centralField = fieldComponent(0.,0.,0.); - - // note field = B*c - std::cout << " SolenoidParametrization: centralField " - << std::setw(6) << std::setprecision(3) << s_centralField/s_lightSpeed /Gaudi::Units::tesla - << "T" << std::endl; -} +// SolenoidParametrization::SolenoidParametrization(void) +// : m_hasParametrization (false) +// { +// // field component not defined without a m_magFieldSvc +// // get central field value in units required for fast tracking +// s_centralField = fieldComponent(0.,0.,0.); +// +// // note field = B*c +// RestoreIOSFlags restore(std::cout); +// std::cout << " SolenoidParametrization: centralField " +// << std::setw(6) << std::setprecision(3) << s_centralField/s_lightSpeed /Gaudi::Units::tesla +// << "T" << std::endl; +//} SolenoidParametrization::SolenoidParametrization(MagField::IMagFieldSvc* magFieldSvc) : m_hasParametrization (false), m_magFieldSvc (magFieldSvc) { // get central field value in units required for fast tracking (i.e. field = B*c) + if (!m_magFieldSvc) + throw std::logic_error("fieldComponent not defined without magnetic field service."); s_centralField = fieldComponent(0.,0.,0.); + RestoreIOSFlags restore(std::cout); std::cout << " SolenoidParametrization: centralField " - << std::setw(6) << std::setprecision(3) << s_centralField/s_lightSpeed /Gaudi::Units::tesla + << std::setw(6) << std::setprecision(3) << s_centralField/s_lightSpeed /Gaudi::Units::tesla << "T"; // now parametrise field - if requested - if (magFieldSvc) + //if (magFieldSvc) { std::cout << " - please be patient while the solenoid is parametrised !! "; parametrizeSolenoid();