10#ifndef TRKEXSOLENOIDALINTERSECTOR_SOLENOIDPARAMETRIZATION_H
11#define TRKEXSOLENOIDALINTERSECTOR_SOLENOIDPARAMETRIZATION_H
53 const double r,
const double z,
const double cotTheta);
73 double& secondIntegral,
92 double& secondIntegral,
161 double& secondIntegral,
166 double zDiff = zEnd - zBegin;
167 double zBeg2 = zBegin*zBegin;
168 double zBeg3 = zBeg2*zBegin;
169 double zEnd2 = zEnd*zEnd;
170 double zEnd3 = zEnd2*zEnd;
171 double zDiff4 = 0.25*(zEnd2 + zBeg2)*(zEnd2 - zBeg2);
176 double zDiffInv = 1./zDiff;
179 parms.
m_cubicTerm*(0.1*zDiffInv*(zEnd2*zEnd3 - zBeg2*zBeg3) - 0.5*zBeg2*zBeg2);
203 assert (key4 < 14688);
228 double z_squared = z_local*z_local;
240 fieldCache.
getField(position.data(),field.data());
241 return s_lightSpeed*(field.z() - field.perp()*cotTheta);
246 double& secondIntegral,
253 if (zEnd < s_zInner || zBegin >
s_zInner)
283#include "AthenaKernel/CondCont.h"
Scalar eta() const
pseudorapidity method
#define CONDCONT_DEF(...)
macros to associate a CLID to a type
#define CLASS_DEF(NAME, CID, VERSION)
associate a clid and a version to a type eg
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
void getField(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field value at given position xyz[3] is in mm, bxyz[3] is in kT if deriv[9] is given,...
BinParameters(const double zAtAxis, const double cotTheta)
double m_interpolateTheta
Parameters(const SolenoidParametrization &spar, const double r, const double z, const double cotTheta)
static const double s_binInvSizeZ
double m_parameters[14688]
static const double s_binZeroZ
static int fieldKey(BinParameters &parms)
static const int s_maxBinZ
void parametrizeSolenoid()
static const double s_zOuter
void printParametersForEtaLine(double eta, double z_origin, MsgStream &msg) const
double interpolate(int key1, int key2, int key3, int key4, const Parameters &parms) const
SolenoidParametrization(const SolenoidParametrization &)=delete
double centralField() const
void integrate(double &firstIntegral, double &secondIntegral, double zBegin, double zEnd, const Parameters &parms) const
static const double s_lightSpeed
static const double s_rOuter
static const double s_rInner
bool validOrigin(const Amg::Vector3D &origin) const
bool currentMatches(double current) const
static const double s_zInner
static const int s_maxBinTheta
static const double s_binZeroTheta
static const int s_numberParameters
static const double s_maximumImpactAtOrigin
static const double s_maximumZatOrigin
void fieldIntegrals(double &firstIntegral, double &secondIntegral, double zBegin, double zEnd, Parameters &parms) const
void setTerms(int, Parameters &parms) const
~SolenoidParametrization()=default
SolenoidParametrization(const AtlasFieldCacheCondObj &field_cond_obj)
const AtlasFieldCacheCondObj * m_fieldCondObj
void printFieldIntegrals(MsgStream &m) const
static const double s_binInvSizeTheta
double fieldComponent(double z, const Parameters &parms) const
SolenoidParametrization & operator=(const SolenoidParametrization &)=delete
void printResidualForEtaLine(double eta, double zOrigin, MsgStream &msg) const
Eigen::Matrix< double, 3, 1 > Vector3D
Ensure that the ATLAS eigen extensions are properly loaded.
@ z
global position (cartesian)