15 #include "GaudiKernel/ITHistSvc.h"
18 #include "CLHEP/Vector/ThreeVector.h"
19 #include "CLHEP/Units/SystemOfUnits.h"
45 m_magFieldSvc(
"AtlasFieldSvc",
name ),
46 m_thistSvc(
"THistSvc",
name ),
53 "Name of the THistSvc output stream" );
56 "Name of the TTree object in the output file." );
64 "Number of steps along radius (granularity)");
66 "Number of steps along z (granularity)");
68 "Number of steps along phi (granularity)");
85 if ( m_writeNtuple ) {
87 if ( m_thistSvc.retrieve().isSuccess() ) {
90 std::string
prefix =
"/" + m_histStream +
"/";
93 m_tree =
new TTree( m_treeName.c_str(),
"Magnetic field in the solenoid" );
94 m_tree->Branch(
"pos", &m_xyzt,
"x/D:y/D:z/D" );
95 if ( m_useFullField ) {
96 m_tree->Branch(
"fieldFull", &m_field,
"Bx/D:By/D:Bz/D" );
97 if ( m_derivatives ) {
98 m_tree->Branch(
"deriv", &m_deriv,
99 "dBxdx/D:dBxdy/D:dBxdz/D:dBydx/D:dBydy/D:dBydz/D:dBzdx/D:dBzdy/D:dBzdz/D" );
102 if ( m_useFastField ) {
103 m_tree->Branch(
"fieldFast", &m_fieldZR,
"Bx2/D:By2/D:Bz2/D" );
104 if ( m_derivatives ) {
105 m_tree->Branch(
"derivZR", &m_derivZR,
106 "dBxdx2/D:dBxdy2/D:dBxdz2/D:dBydx2/D:dBydy2/D:dBydz2/D:dBzdx2/D:dBzdy2/D:dBzdz2/D" );
110 if ( m_thistSvc->regTree(
prefix + m_treeName, m_tree).isFailure() ) {
112 return StatusCode::FAILURE;
116 return StatusCode::FAILURE;
122 return StatusCode::SUCCESS;
129 return StatusCode::SUCCESS;
137 m_xyzt[0] = m_xyzt[1] = m_xyzt[2] = 0;
138 if ( m_useFullField ) m_magFieldSvc->getField( m_xyzt, m_field,
nullptr );
139 if ( m_useFastField ) m_magFieldSvc->getFieldZR( m_xyzt, m_fieldZR,
nullptr );
141 ATH_MSG_INFO(
"New service solenoidOn = " << m_magFieldSvc->solenoidOn());
142 ATH_MSG_INFO(
"New service toroidOn = " << m_magFieldSvc->toroidOn());
144 else if ( m_event==1 ) {
146 ATH_MSG_INFO(
"solenoid field service test in progress." );
152 for (
int k = 0;
k < m_stepsPhi;
k++ ) {
154 for (
int j = 0; j < m_stepsZ; j++ ) {
155 m_xyzt[2] = (m_maxZ-m_minZ)*
double(j)/
double(m_stepsZ-1) + m_minZ;
156 for (
int i = 0;
i < m_stepsR;
i++ ) {
157 double r = (m_maxR-m_minR)*
double(
i)/
double(m_stepsR-1) + m_minR;
162 if ( m_useFullField ) {
164 m_magFieldSvc->getField( m_xyzt, m_field, m_deriv );
166 m_magFieldSvc->getField( m_xyzt, m_field,
nullptr );
168 if ( m_useFastField ) {
170 m_magFieldSvc->getFieldZR( m_xyzt, m_fieldZR, m_derivZR );
172 m_magFieldSvc->getFieldZR( m_xyzt, m_fieldZR,
nullptr );
176 if ( m_writeNtuple ) m_tree->Fill();
181 ATH_MSG_INFO(
"accessing " << m_stepsR * m_stepsZ * m_stepsPhi
182 <<
" values in a grid took " <<
seconds <<
" seconds." );
185 return StatusCode::SUCCESS;