ATLAS Offline Software
H8FieldSvc.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //
6 // H8FieldSvc.cxx
7 //
8 // Masahiro Morii, Harvard University
9 //
10 
11 #include <iostream>
12 #include <fstream>
13 
14 // ISF_Services include
15 #include "H8FieldSvc.h"
16 
17 // PathResolver
19 
20 // StoreGate
21 #include "StoreGate/StoreGateSvc.h"
22 
23 // Athena Pool
25 
26 // CLHEP
27 #include "CLHEP/Units/SystemOfUnits.h"
28 
30 MagField::H8FieldSvc::H8FieldSvc( const std::string& name,ISvcLocator* svc ) :
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 }
48 
50 {
51 }
52 
55 {
56  ATH_MSG_INFO( "initialize() ..." );
57  return StatusCode::SUCCESS;
58 }
59 
61 {
62  ATH_MSG_INFO( "start() ..." );
63  return readMap( m_H8MapFilename );
64 }
65 
67 {
68  ATH_MSG_INFO( "finalize() ..." );
69  return StatusCode::SUCCESS;
70 }
71 
72 StatusCode MagField::H8FieldSvc::readMap( const std::string& mapFile )
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 }
136 
137 void MagField::H8FieldSvc::getField( const double *xyz, double *B, double *deriv ) const
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  }
152 
153 void MagField::H8FieldSvc::getFieldZR( const double *xyz, double *B, double *deriv ) const
154 {
155  getField( xyz, B, deriv );
156 }
MagField::H8FieldSvc::getFieldZR
virtual void getFieldZR(const double *xyz, double *bxyz, double *deriv=nullptr) const
getFieldZR simply calls getField
Definition: H8FieldSvc.cxx:153
checkFileSG.line
line
Definition: checkFileSG.py:75
MagField::H8FieldSvc::~H8FieldSvc
virtual ~H8FieldSvc()
Destructor.
Definition: H8FieldSvc.cxx:49
CondAttrListCollection.h
This file defines the class for a collection of AttributeLists where each one is associated with a ch...
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
H8FieldSvc.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MagField::H8FieldSvc::initialize
StatusCode initialize()
Athena algorithm's interface methods.
Definition: H8FieldSvc.cxx:54
lumiFormat.i
int i
Definition: lumiFormat.py:92
MagField::H8FieldSvc::H8FieldSvc
H8FieldSvc(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Definition: H8FieldSvc.cxx:30
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
MagField::H8FieldSvc::finalize
StatusCode finalize()
Definition: H8FieldSvc.cxx:66
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
MagField::H8FieldSvc::m_dx1
double m_dx1
Definition: H8FieldSvc.h:67
MagField::H8FieldSvc::start
StatusCode start()
Definition: H8FieldSvc.cxx:60
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
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
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
StoreGateSvc.h
MagField::H8FieldSvc::m_dy1
double m_dy1
Definition: H8FieldSvc.h:68