Belle II Software  release-08-01-10
BFieldComponentRadial Class Reference

The BFieldComponentRadial class. More...

#include <BFieldComponentRadial.h>

Inheritance diagram for BFieldComponentRadial:
Collaboration diagram for BFieldComponentRadial:

Classes

struct  BFieldPoint
 Magnetic field data structure. More...
 

Public Member Functions

 BFieldComponentRadial ()=default
 The BFieldComponentRadial constructor.
 
virtual ~BFieldComponentRadial ()=default
 The BFieldComponentRadial destructor.
 
virtual void initialize () override
 Initializes the magnetic field component. More...
 
virtual ROOT::Math::XYZVector calculate (const ROOT::Math::XYZVector &point) const override
 Calculates the magnetic field vector at the specified space point. More...
 
virtual void terminate () override
 Terminates the magnetic field component. More...
 
void setMapFilename (const std::string &filename)
 Sets the filename of the magnetic field map. More...
 
void setMapSize (int sizeR, int sizeZ)
 Sets the size of the magnetic field map. More...
 
void setMapRegionZ (double minZ, double maxZ, double offset)
 Sets the size of the magnetic field map. More...
 
void setMapRegionR (double minR, double maxR)
 Sets the size of the magnetic field map. More...
 
void setGridPitch (double pitchR, double pitchZ)
 Sets the grid pitch of the magnetic field map. More...
 
void setKlmParameters (double srmin, double zyoke, double gaph, double iront)
 Sets parameter for EKLM. More...
 

Private Attributes

std::string m_mapFilename {""}
 The filename of the magnetic field map.
 
std::vector< BFieldPointm_mapBuffer
 The memory buffer for the magnetic field map.
 
int m_mapSize [2] {0}
 The size of the map in r and z.
 
double m_mapRegionZ [2] {0}
 The min and max boundaries of the map region in z.
 
double m_mapOffset {0}
 Offset required because the accelerator group defines the Belle center as zero.
 
double m_mapRegionR [2] {0}
 The min and max boundaries of the map region in r.
 
double m_gridPitchR {0}
 The grid pitch in r.
 
double m_gridPitchZ {0}
 The grid pitch in z.
 
double m_igridPitchR {0}
 The reciprocal of grid pitch in r.
 
double m_igridPitchZ {0}
 The reciprocal of grid pitch in z.
 
double m_slotRMin {0}
 minimum radius for the gap in endyoke
 
double m_endyokeZMin {0}
 minimum Z of endyoke
 
double m_gapHeight {0}
 height of the gap in endyoke
 
double m_ironPlateThickness {0}
 thickness of iron plate in endyoke
 
double m_Layer {0}
 height of the layer (gap + iron plate) in endyoke
 
double m_iLayer {0}
 reciprocal of height of the layer (gap + iron plate) in endyoke
 

Detailed Description

The BFieldComponentRadial class.

This class represents a radial magnetic field map. The magnetic field map is stored as a grid in cylindrical coordinates. It is defined by a minimum radius and a maximum radius, a minimum z and a maximum z value, a pitch size in both, r and z, and the number of grid points. The ZOffset is used to account for the fact that the acceleration group defines 0 to be in the center of the detector, while the detector group defines the IP to be the center. The filename points to the zip file containing the magnetic field map.

Definition at line 34 of file BFieldComponentRadial.h.

Member Function Documentation

◆ calculate()

ROOT::Math::XYZVector calculate ( const ROOT::Math::XYZVector &  point) const
overridevirtual

Calculates the magnetic field vector at the specified space point.

Parameters
pointThe space point in Cartesian coordinates (x,y,z) in [cm] at which the magnetic field vector should be calculated.
Returns
The magnetic field vector at the given space point in [T]. Returns a zero vector XYZVector(0,0,0) if the space point lies outside the region described by the component.

Implements BFieldComponentAbs.

Definition at line 86 of file BFieldComponentRadial.cc.

87 {
88  ROOT::Math::XYZVector B;
89  // If both 'Radial' and 'Beamline' components are defined in xml file,
90  // '3d' component returns zero field where 'Beamline' component is defined.
91  // If no 'Beamline' component is defined in xml file, the following function will never be called.
92  if (BFieldComponentBeamline::Instance().isInRange(point)) return B;
93 
94  //Get the z component
95  double z = point.Z();
96  //Check if the point lies inside the magnetic field boundaries
97  if ((z < m_mapRegionZ[0]) || (z > m_mapRegionZ[1])) return B;
98 
99  //Get the r component
100  double r2 = point.Perp2();
101  //Check if the point lies inside the magnetic field boundaries
102  if ((r2 < m_mapRegionR[0]*m_mapRegionR[0]) || (r2 > m_mapRegionR[1]*m_mapRegionR[1])) return B;
103 
104  double r = sqrt(r2);
105  //Calculate the distance to the lower grid point
106  double wr = (r - m_mapRegionR[0]) * m_igridPitchR;
107  double wz = (z - m_mapRegionZ[0]) * m_igridPitchZ;
108  //Calculate the lower index of the point in the grid
109  int ir = static_cast<int>(wr);
110  int iz = static_cast<int>(wz);
111 
112  double za = z - m_mapOffset;
113  double dz_eklm = abs(za) - (m_endyokeZMin - m_gapHeight);
114  if (dz_eklm > 0 && r > m_slotRMin) {
115  double wl = dz_eklm * m_iLayer;
116  int il = static_cast<int>(wl);
117  if (il <= 16) {
118  double L = m_Layer * il;
119  double l = dz_eklm - L;
120  int ingap = l < m_gapHeight;
121  ir += ingap & (r < m_slotRMin + m_gridPitchR);
122 
123  double zlg = L + m_endyokeZMin, zl0 = zlg - m_gapHeight, zl1 = zlg + m_ironPlateThickness;
124  if (za < 0) {
125  zl0 = -zl0;
126  zlg = -zlg;
127  zl1 = -zl1;
128  }
129  double zoff = m_mapOffset - m_mapRegionZ[0];
130  int izl0 = static_cast<int>((zl0 + zoff) * m_igridPitchZ);
131  int izlg = static_cast<int>((zlg + zoff) * m_igridPitchZ);
132  int izl1 = static_cast<int>((zl1 + zoff) * m_igridPitchZ);
133  int ig = izlg == iz;
134  int idz = (izl0 == iz) - (izl1 == iz) + (ingap ? -ig : ig);
135  iz += (za > 0) ? idz : -idz;
136  }
137  }
138 
139  //Bring the index values within the range
140  ir = min(m_mapSize[0] - 2, ir);
141  iz = min(m_mapSize[1] - 2, iz);
142 
143  wr -= ir;
144  wz -= iz;
145 
146  double wz0 = 1 - wz, wr0 = 1 - wr;
147  //Calculate the linear approx. of the magnetic field vector
148  const unsigned int strideZ = m_mapSize[1];
149  const unsigned int i00 = ir * strideZ + iz, i01 = i00 + 1, i10 = i00 + strideZ, i11 = i01 + strideZ;
150  const BFieldPoint* H = m_mapBuffer.data();
151  double w00 = wz0 * wr0, w01 = wz * wr0, w10 = wz0 * wr, w11 = wz * wr;
152  BFieldPoint Brz = H[i00] * w00 + H[i01] * w01 + H[i10] * w10 + H[i11] * w11;
153 
154  if (r > 0.0) {
155  double norm = Brz.r / r;
156  B.SetXYZ(point.X()*norm, point.Y()*norm, Brz.z);
157  } else {
158  B.SetZ(Brz.z);
159  }
160 
161  return B;
162 }
double m_iLayer
reciprocal of height of the layer (gap + iron plate) in endyoke
double m_slotRMin
minimum radius for the gap in endyoke
double m_Layer
height of the layer (gap + iron plate) in endyoke
double m_mapRegionZ[2]
The min and max boundaries of the map region in z.
double m_mapOffset
Offset required because the accelerator group defines the Belle center as zero.
double m_ironPlateThickness
thickness of iron plate in endyoke
double m_gridPitchR
The grid pitch in r.
double m_mapRegionR[2]
The min and max boundaries of the map region in r.
double m_endyokeZMin
minimum Z of endyoke
std::vector< BFieldPoint > m_mapBuffer
The memory buffer for the magnetic field map.
double m_gapHeight
height of the gap in endyoke
double m_igridPitchZ
The reciprocal of grid pitch in z.
int m_mapSize[2]
The size of the map in r and z.
double m_igridPitchR
The reciprocal of grid pitch in r.
double sqrt(double a)
sqrt for double
Definition: beamHelpers.h:28
static BFieldComponentBeamline & Instance()
BFieldComponentBeamline instance.

◆ initialize()

void initialize ( void  )
overridevirtual

Initializes the magnetic field component.

This method opens the magnetic field map file.

Reimplemented from BFieldComponentAbs.

Definition at line 25 of file BFieldComponentRadial.cc.

◆ setGridPitch()

void setGridPitch ( double  pitchR,
double  pitchZ 
)
inline

Sets the grid pitch of the magnetic field map.

Parameters
pitchRThe pitch of the grid in r [cm].
pitchZThe pitch of the grid in z [cm].

Definition at line 103 of file BFieldComponentRadial.h.

103 { m_gridPitchR = pitchR; m_gridPitchZ = pitchZ; }
double m_gridPitchZ
The grid pitch in z.

◆ setKlmParameters()

void setKlmParameters ( double  srmin,
double  zyoke,
double  gaph,
double  iront 
)
inline

Sets parameter for EKLM.

Parameters
srminminimum radius for the gap in endyoke [cm].
zyokeminimum Z of endyoke [cm].
gaphheight of the gap in endyoke [cm].
irontthickness of iron plate in endyoke [cm].

Definition at line 113 of file BFieldComponentRadial.h.

◆ setMapFilename()

void setMapFilename ( const std::string &  filename)
inline

Sets the filename of the magnetic field map.

Parameters
filenameThe filename of the magnetic field map.

Definition at line 74 of file BFieldComponentRadial.h.

◆ setMapRegionR()

void setMapRegionR ( double  minR,
double  maxR 
)
inline

Sets the size of the magnetic field map.

Parameters
minRThe left (min) border of the magnetic field map region in r [cm].
maxRThe right (max) border of the magnetic field map region in r [cm].

Definition at line 96 of file BFieldComponentRadial.h.

◆ setMapRegionZ()

void setMapRegionZ ( double  minZ,
double  maxZ,
double  offset 
)
inline

Sets the size of the magnetic field map.

Parameters
minZThe left (min) border of the magnetic field map region in z [cm].
maxZThe right (max) border of the magnetic field map region in z [cm].
offsetThe offset in z [cm] which is required because the accelerator group defines the Belle center as zero.

Definition at line 89 of file BFieldComponentRadial.h.

◆ setMapSize()

void setMapSize ( int  sizeR,
int  sizeZ 
)
inline

Sets the size of the magnetic field map.

Parameters
sizeRThe number of points in the r direction.
sizeZThe number of points in the z direction.

Definition at line 81 of file BFieldComponentRadial.h.

◆ terminate()

void terminate ( void  )
overridevirtual

Terminates the magnetic field component.

This method closes the magnetic field map file.

Reimplemented from BFieldComponentAbs.

Definition at line 164 of file BFieldComponentRadial.cc.


The documentation for this class was generated from the following files: