Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-08-18 22:54:53

0001 /**
0002  Description: Utility function to calculate the Magnetic Field on the GPU. The Vec3 argument of the functions must support access to its components via (), note that e.g. Eigen::Matrix provides such an interface.
0003 */
0004 
0005 #ifndef MagneticField_ParametrizedEngine_interface_ParabolicParametrizedMagneticField_h
0006 #define MagneticField_ParametrizedEngine_interface_ParabolicParametrizedMagneticField_h
0007 
0008 namespace magneticFieldParabolicPortable {
0009 
0010   struct Parameters {
0011     // These parameters are the best fit of 3.8T to the OAEParametrizedMagneticField parametrization.
0012     // See MagneticField/ParametrizedEngine/src/ParabolicParametrizedMagneticField.cc
0013     static constexpr float c1 = 3.8114;
0014     static constexpr float b0 = -3.94991e-06;
0015     static constexpr float b1 = 7.53701e-06;
0016     static constexpr float a = 2.43878e-11;
0017     static constexpr float max_radius2 = 13225.f;  // tracker radius
0018     static constexpr float max_z = 280.f;          // tracker z
0019   };
0020 
0021   template <typename Vec3>
0022   constexpr float Kr(Vec3 const& vec) {
0023     return Parameters::a * (vec(0) * vec(0) + vec(1) * vec(1)) + 1.f;
0024   }
0025 
0026   template <typename Vec3>
0027   constexpr float B0Z(Vec3 const& vec) {
0028     return Parameters::b0 * vec(2) * vec(2) + Parameters::b1 * vec(2) + Parameters::c1;
0029   }
0030 
0031   template <typename Vec3>
0032   constexpr bool isValid(Vec3 const& vec) {
0033     return ((vec(0) * vec(0) + vec(1) * vec(1)) < Parameters::max_radius2 && fabs(vec(2)) < Parameters::max_z);
0034   }
0035 
0036   template <typename Vec3>
0037   constexpr float magneticFieldAtPoint(Vec3 const& vec) {
0038     if (isValid(vec)) {
0039       return B0Z(vec) * Kr(vec);
0040     } else {
0041       return 0;
0042     }
0043   }
0044 
0045 }  // namespace magneticFieldParabolicPortable
0046 
0047 #endif