ATLAS Offline Software
Public Member Functions | Private Member Functions | Private Attributes | List of all members
MagField::H8FieldSvc Class Reference

#include <H8FieldSvc.h>

Inheritance diagram for MagField::H8FieldSvc:
Collaboration diagram for MagField::H8FieldSvc:

Public Member Functions

 H8FieldSvc (const std::string &name, ISvcLocator *pSvcLocator)
 Constructor. More...
 
virtual ~H8FieldSvc ()
 Destructor. More...
 
StatusCode initialize ()
 Athena algorithm's interface methods. More...
 
StatusCode start ()
 
StatusCode finalize ()
 
virtual void getField (const double *xyz, double *bxyz, double *deriv=nullptr) const
 get B field value at given position More...
 
virtual void getFieldZR (const double *xyz, double *bxyz, double *deriv=nullptr) const
 getFieldZR simply calls getField More...
 

Private Member Functions

StatusCode initializeMap ()
 
StatusCode readMap (const std::string &mapFile)
 

Private Attributes

std::string m_H8MapFilename
 Data members. More...
 
std::vector< BFieldH8Gridm_grid
 
double m_dx1
 
double m_dy1
 
double m_dz1
 
double m_dx2
 
double m_dy2
 
double m_dz2
 

Detailed Description

Definition at line 31 of file H8FieldSvc.h.

Constructor & Destructor Documentation

◆ H8FieldSvc()

MagField::H8FieldSvc::H8FieldSvc ( const std::string &  name,
ISvcLocator *  pSvcLocator 
)

Constructor.

Definition at line 30 of file H8FieldSvc.cxx.

30  :
31  base_class(name,svc),
32  m_H8MapFilename("MagneticFieldMaps/mbps1-all-id-800-mbps2-muons-800x4.data"),
33  m_dx1(0),
34  m_dy1(0),
35  m_dz1(0),
36  m_dx2(43830), // default H8MS2 x offset
37  m_dy2(0),
38  m_dz2(0)
39 {
40  declareProperty("H8MapFile", m_H8MapFilename, "File storing the H8 magnetic field map");
41  declareProperty("dx1", m_dx1, "x component of magnet #1 shift (in mm)");
42  declareProperty("dy1", m_dy1, "y component of magnet #1 shift (in mm)");
43  declareProperty("dz1", m_dz1, "z component of magnet #1 shift (in mm)");
44  declareProperty("dx2", m_dx2, "x component of magnet #2 shift (in mm)");
45  declareProperty("dy2", m_dy2, "y component of magnet #2 shift (in mm)");
46  declareProperty("dz2", m_dz2, "z component of magnet #2 shift (in mm)");
47 }

◆ ~H8FieldSvc()

MagField::H8FieldSvc::~H8FieldSvc ( )
virtual

Destructor.

Definition at line 49 of file H8FieldSvc.cxx.

50 {
51 }

Member Function Documentation

◆ finalize()

StatusCode MagField::H8FieldSvc::finalize ( )

Definition at line 66 of file H8FieldSvc.cxx.

67 {
68  ATH_MSG_INFO( "finalize() ..." );
69  return StatusCode::SUCCESS;
70 }

◆ getField()

void MagField::H8FieldSvc::getField ( const double *  xyz,
double *  bxyz,
double *  deriv = nullptr 
) const
virtual

get B field value at given position

xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given, field derivatives are returned in kT/mm

Definition at line 137 of file H8FieldSvc.cxx.

138 {
139  for ( unsigned i = 0; i < m_grid.size(); i++ ) {
140  // find the grid that contains xyz
141  if ( m_grid[i].inside( xyz ) ) {
142  m_grid[i].getB( xyz, B, deriv );
143  return;
144  }
145  }
146  // xyz is outside all grids
147  B[0] = B[1] = B[2] = 0.0;
148  if ( deriv != nullptr ) {
149  for ( int j = 0; j < 9; j++ ) deriv[j] = 0.0;
150  }
151  }

◆ getFieldZR()

void MagField::H8FieldSvc::getFieldZR ( const double *  xyz,
double *  bxyz,
double *  deriv = nullptr 
) const
virtual

getFieldZR simply calls getField

Definition at line 153 of file H8FieldSvc.cxx.

154 {
155  getField( xyz, B, deriv );
156 }

◆ initialize()

StatusCode MagField::H8FieldSvc::initialize ( )

Athena algorithm's interface methods.

framework methods

Definition at line 54 of file H8FieldSvc.cxx.

55 {
56  ATH_MSG_INFO( "initialize() ..." );
57  return StatusCode::SUCCESS;
58 }

◆ initializeMap()

StatusCode MagField::H8FieldSvc::initializeMap ( )
private

◆ readMap()

StatusCode MagField::H8FieldSvc::readMap ( const std::string &  mapFile)
private

Definition at line 72 of file H8FieldSvc.cxx.

73 {
74  // find the path to the map file
75  std::string resolvedMapFile = PathResolver::find_file( mapFile, "DATAPATH" );
76  if ( resolvedMapFile.empty() ) {
77  ATH_MSG_ERROR( "Field map file " << mapFile << " not found" );
78  return StatusCode::FAILURE;
79  }
80  // opne the map file
81  std::ifstream input( resolvedMapFile.c_str() );
82  if ( ! input.good() ) {
83  ATH_MSG_ERROR( "Failed to open the field map " << resolvedMapFile );
84  return StatusCode::FAILURE;
85  }
86  // skip the file header line
87  char line[256];
88  input.getline( line, 256 );
89  // read grids
90  unsigned igrid(0);
91  double offset[3];
92  while (1) {
93  // first determine offset
94  if (igrid == 0) {
95  // magnet #1
96  offset[0] = m_dx1;
97  offset[1] = m_dy1;
98  offset[2] = m_dz1;
99  } else if (igrid == 1) {
100  // magnet #2
101  offset[0] = m_dx2;
102  offset[1] = m_dy2;
103  offset[2] = m_dz2;
104  } else {
105  // shift up to two magnets
106  offset[0] = 0;
107  offset[1] = 0;
108  offset[2] = 0;
109  }
110 
111  // then, read the map and shift it
112  BFieldH8Grid grid;
113  grid.readMap( input );
114  grid.setOffset(offset);
115 
116  if ( grid.defined() ) {
117  ATH_MSG_INFO("setting offset for magnet " << igrid << " to " << offset[0] << ", " << offset[1] << ", " << offset[2] << " mm");
118  // save grid
119  double its_min[3];
120  double its_max[3];
121  double its_d[3];
122  grid.getBounds(its_min, its_max, its_d);
123  ATH_MSG_INFO("new magnet grid #" << igrid << " found");
124  ATH_MSG_INFO(" - min (mm) " << its_min[0] << ", " << its_min[1] << ", " << its_min[2]);
125  ATH_MSG_INFO(" - max (mm) " << its_max[0] << ", " << its_max[1] << ", " << its_max[2]);
126  ATH_MSG_INFO(" - offset (mm) " << its_d[0] << ", " << its_d[1] << ", " << its_d[2]);
127  m_grid.push_back( grid );
128  igrid++;
129  } else {
130  break;
131  }
132  }
133  ATH_MSG_INFO( "Initialized the field map from " << resolvedMapFile );
134  return StatusCode::SUCCESS;
135 }

◆ start()

StatusCode MagField::H8FieldSvc::start ( )

Definition at line 60 of file H8FieldSvc.cxx.

61 {
62  ATH_MSG_INFO( "start() ..." );
63  return readMap( m_H8MapFilename );
64 }

Member Data Documentation

◆ m_dx1

double MagField::H8FieldSvc::m_dx1
private

Definition at line 67 of file H8FieldSvc.h.

◆ m_dx2

double MagField::H8FieldSvc::m_dx2
private

Definition at line 71 of file H8FieldSvc.h.

◆ m_dy1

double MagField::H8FieldSvc::m_dy1
private

Definition at line 68 of file H8FieldSvc.h.

◆ m_dy2

double MagField::H8FieldSvc::m_dy2
private

Definition at line 72 of file H8FieldSvc.h.

◆ m_dz1

double MagField::H8FieldSvc::m_dz1
private

Definition at line 69 of file H8FieldSvc.h.

◆ m_dz2

double MagField::H8FieldSvc::m_dz2
private

Definition at line 73 of file H8FieldSvc.h.

◆ m_grid

std::vector<BFieldH8Grid> MagField::H8FieldSvc::m_grid
private

Definition at line 64 of file H8FieldSvc.h.

◆ m_H8MapFilename

std::string MagField::H8FieldSvc::m_H8MapFilename
private

Data members.

Definition at line 61 of file H8FieldSvc.h.


The documentation for this class was generated from the following files:
checkFileSG.line
line
Definition: checkFileSG.py:75
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MagField::H8FieldSvc::m_dz2
double m_dz2
Definition: H8FieldSvc.h:73
PathResolver::find_file
static std::string find_file(const std::string &logical_file_name, const std::string &search_path, SearchType search_type=LocalSearch)
Definition: PathResolver.cxx:251
MagField::H8FieldSvc::m_dx2
double m_dx2
Definition: H8FieldSvc.h:71
BFieldH8Grid::defined
bool defined() const
Definition: BFieldH8Grid.h:27
BFieldH8Grid
Definition: BFieldH8Grid.h:18
MagField::H8FieldSvc::m_H8MapFilename
std::string m_H8MapFilename
Data members.
Definition: H8FieldSvc.h:61
xyz
#define xyz
MagField::H8FieldSvc::readMap
StatusCode readMap(const std::string &mapFile)
Definition: H8FieldSvc.cxx:72
BFieldH8Grid::getBounds
void getBounds(double *out_min, double *out_max, double *out_d) const
Definition: BFieldH8Grid.h:36
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
MagField::H8FieldSvc::m_dx1
double m_dx1
Definition: H8FieldSvc.h:67
Handler::svc
AthROOTErrorHandlerSvc * svc
Definition: AthROOTErrorHandlerSvc.cxx:10
BFieldH8Grid::readMap
void readMap(std::istream &input)
Definition: BFieldH8Grid.cxx:23
MagField::H8FieldSvc::getField
virtual void getField(const double *xyz, double *bxyz, double *deriv=nullptr) const
get B field value at given position
Definition: H8FieldSvc.cxx:137
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
dqt_zlumi_alleff_HIST.B
B
Definition: dqt_zlumi_alleff_HIST.py:110
BFieldH8Grid::setOffset
void setOffset(const double *dxyz)
Definition: BFieldH8Grid.cxx:134
Trk::inside
@ inside
Definition: PropDirection.h:29
MagField::H8FieldSvc::m_dz1
double m_dz1
Definition: H8FieldSvc.h:69
convertTimingResiduals.offset
offset
Definition: convertTimingResiduals.py:71
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
MagField::H8FieldSvc::m_dy2
double m_dy2
Definition: H8FieldSvc.h:72
MagField::H8FieldSvc::m_grid
std::vector< BFieldH8Grid > m_grid
Definition: H8FieldSvc.h:64
MagField::H8FieldSvc::m_dy1
double m_dy1
Definition: H8FieldSvc.h:68