ATLAS Offline Software
BFieldH8Grid.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 //
6 // BFieldH8Grid.cxx
7 //
8 // Masahiro Morii, Harvard University
9 //
10 #include "BFieldH8Grid.h"
11 
13 {
14  for ( int i=0; i<3; i++ ) {
15  m_n[i] = 0;
16  m_min[i] = 0.0;
17  m_max[i] = 0.0;
18  m_d[i] = 0.0;
19  }
20 }
21 
22 void
23 BFieldH8Grid::readMap( std::istream& input )
24 {
25  // read the magnet header line
26  char name[256];
27  double cor;
28  m_n[0] = 0;
29  input >> name;
30  for ( int i=0; i<3; i++ ) input >> m_n[i];
31  for ( int i=0; i<3; i++ ) input >> m_min[i] >> m_max[i];
32  for ( int i=0; i<3; i++ ) input >> m_d[i];
33  input >> cor;
34  // anything read?
35  if ( m_n[0] == 0 ) return;
36  // convert unit to mm
37  const double meter(1000.); // m in mm
38  for ( int i=0; i<3; i++ ) {
39  m_min[i] *= meter;
40  m_max[i] *= meter;
41  m_d[i] *= meter;
42  }
43  // prepare space for the field data
44  int nxyz = m_n[0]*m_n[1]*m_n[2];
45  for ( int i=0; i<3; i++ ) m_B[i].resize(nxyz);
46  // read the field data
47  double xyz[3];
48  double B[3];
49  for ( int k=0; k<nxyz; k++ ) {
50  input >> xyz[0] >> xyz[1] >> xyz[2] >> B[0] >> B[1] >> B[2];
51  // adjust unit and scale
52  const double cm(10.); // cm in mm
53  const double tesla(0.001); // T in kT
54  for ( int i=0; i<3; i++ ) {
55  xyz[i] *= cm;
56  B[i] *= -cor*tesla;
57  }
58  // find the grid number
59  int j[3];
60  for ( int i=0; i<3; i++ ) {
61  j[i] = int((xyz[i]-m_min[i])/(m_max[i]-m_min[i])*(m_n[i]-1)+0.5);
62  }
63  // store
64  int ixyz = j[0] + m_n[0]*(j[1] + m_n[1]*j[2]);
65  for ( int i=0; i<3; i++ ) {
66  m_B[i][ixyz] = B[i];
67  }
68  }
69  // apply offset to the range
70  for ( int i=0; i<3; i++ ) {
71  m_min[i] += m_d[i];
72  m_max[i] += m_d[i];
73  }
74 }
75 
76 void
77 BFieldH8Grid::getB( const double *xyz, double *B, double *deriv ) const
78 {
79  if ( !defined() || !inside( xyz ) ) {
80  B[0] = B[1] = B[2] = 0.0;
81  if ( deriv != nullptr ) {
82  for ( int j = 0; j < 9; j++ ) deriv[j] = 0.0;
83  }
84  return;
85  }
86  // find the grid index
87  double invunit[3];
88  int j[3];
89  double f[3];
90  double g[3];
91  for ( int i=0; i<3; i++ ) {
92  invunit[i] = (m_n[i]-1) / (m_max[i]-m_min[i]);
93  double a = (xyz[i]-m_min[i]) * invunit[i];
94  j[i] = int(a);
95  f[i] = a - j[i];
96  g[i] = 1.0 - f[i];
97  }
98  int ixyz[8];
99  ixyz[0] = j[0] + m_n[0]*(j[1] + m_n[1]*j[2]);
100  ixyz[1] = ixyz[0] + 1;
101  ixyz[2] = ixyz[0] + m_n[0];
102  ixyz[3] = ixyz[2] + 1;
103  ixyz[4] = ixyz[0] + m_n[0]*m_n[1];
104  ixyz[5] = ixyz[4] + 1;
105  ixyz[6] = ixyz[4] + m_n[0];
106  ixyz[7] = ixyz[6] + 1;
107  // interpolate field values
108  for ( int i=0; i<3; i++ ) { // Bx, By, Bz
109  B[i] = g[2]*( g[1]*( g[0]*m_B[i][ixyz[0]] + f[0]*m_B[i][ixyz[1]] ) +
110  f[1]*( g[0]*m_B[i][ixyz[2]] + f[0]*m_B[i][ixyz[3]] ) ) +
111  f[2]*( g[1]*( g[0]*m_B[i][ixyz[4]] + f[0]*m_B[i][ixyz[5]] ) +
112  f[1]*( g[0]*m_B[i][ixyz[6]] + f[0]*m_B[i][ixyz[7]] ) );
113  }
114  // derivatives
115  if ( deriv != nullptr ) {
116  for ( int i=0; i<3; i++ ) { // Bx, By, Bz
117  deriv[i*3 ] = ( g[2]*( g[1]*(m_B[i][ixyz[1]] - m_B[i][ixyz[0]] ) +
118  f[1]*(m_B[i][ixyz[3]] - m_B[i][ixyz[2]] ) ) +
119  f[2]*( g[1]*(m_B[i][ixyz[5]] - m_B[i][ixyz[4]] ) +
120  f[1]*(m_B[i][ixyz[7]] - m_B[i][ixyz[6]] ) ) ) * invunit[0];
121  deriv[i*3+1] = ( g[2]*( g[0]*(m_B[i][ixyz[2]] - m_B[i][ixyz[0]] ) +
122  f[0]*(m_B[i][ixyz[3]] - m_B[i][ixyz[1]] ) ) +
123  f[2]*( g[0]*(m_B[i][ixyz[6]] - m_B[i][ixyz[4]] ) +
124  f[0]*(m_B[i][ixyz[7]] - m_B[i][ixyz[5]] ) ) ) * invunit[1];
125  deriv[i*3+2] = ( g[1]*( g[0]*(m_B[i][ixyz[4]] - m_B[i][ixyz[0]] ) +
126  f[0]*(m_B[i][ixyz[5]] - m_B[i][ixyz[1]] ) ) +
127  f[1]*( g[0]*(m_B[i][ixyz[6]] - m_B[i][ixyz[2]] ) +
128  f[0]*(m_B[i][ixyz[7]] - m_B[i][ixyz[3]] ) ) ) * invunit[2];
129  }
130  }
131 }
132 
133 void
134 BFieldH8Grid::setOffset( const double *dxyz )
135 {
136  // update the range by the change in offset
137  for ( int i=0; i<3; i++ ) {
138  m_min[i] += dxyz[i] - m_d[i];
139  m_max[i] += dxyz[i] - m_d[i];
140  m_d[i] = dxyz[i];
141  }
142 }
143 
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
BFieldH8Grid::defined
bool defined() const
Definition: BFieldH8Grid.h:27
xyz
#define xyz
BFieldH8Grid::m_n
int m_n[3]
Definition: BFieldH8Grid.h:44
cm
const double cm
Definition: Simulation/ISF/ISF_FastCaloSim/ISF_FastCaloSimParametrization/tools/FCAL_ChannelMap.cxx:25
python.SystemOfUnits.meter
int meter
Definition: SystemOfUnits.py:61
lumiFormat.i
int i
Definition: lumiFormat.py:92
python.CaloCondTools.g
g
Definition: CaloCondTools.py:15
BFieldH8Grid.h
BFieldH8Grid::m_max
double m_max[3]
Definition: BFieldH8Grid.h:45
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
BFieldH8Grid::getB
void getB(const double *xyz, double *B, double *deriv=nullptr) const
Definition: BFieldH8Grid.cxx:77
BFieldH8Grid::BFieldH8Grid
BFieldH8Grid()
Definition: BFieldH8Grid.cxx:12
BFieldH8Grid::readMap
void readMap(std::istream &input)
Definition: BFieldH8Grid.cxx:23
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
python.SystemOfUnits.tesla
int tesla
Definition: SystemOfUnits.py:228
dqt_zlumi_alleff_HIST.B
B
Definition: dqt_zlumi_alleff_HIST.py:110
BFieldH8Grid::m_d
double m_d[3]
Definition: BFieldH8Grid.h:46
BFieldH8Grid::setOffset
void setOffset(const double *dxyz)
Definition: BFieldH8Grid.cxx:134
a
TList * a
Definition: liststreamerinfos.cxx:10
BFieldH8Grid::inside
bool inside(const double *xyz) const
Definition: BFieldH8Grid.h:29
BFieldH8Grid::m_min
double m_min[3]
Definition: BFieldH8Grid.h:45
BFieldH8Grid::m_B
std::vector< double > m_B[3]
Definition: BFieldH8Grid.h:47
fitman.k
k
Definition: fitman.py:528