ROOT项目中的物理向量类详解
概述
ROOT项目提供了一套完整的物理向量类,用于处理高能物理计算中的三维和四维向量及其旋转算法。这些类最初源自CLHEP库,经过移植和优化后成为ROOT数学库的重要组成部分。本文将详细介绍这些物理向量类的功能和使用方法。
物理向量类简介
ROOT中的物理向量类主要包含以下四个核心类:
- TVector3:通用的三维向量类
- TLorentzVector:通用的四维向量类
- TRotation:三维旋转矩阵类
- TLorentzRotation:包含洛伦兹变换的类
此外还提供了一个简单的二维向量类TVector2,虽然它不是从CLHEP移植而来,但也是向量计算的有益补充。
TVector3类详解
基本特性
TVector3类表示三维空间中的向量,可以用笛卡尔坐标(x,y,z)、极坐标(ρ,θ,φ)或柱坐标(r,φ,z)表示。主要特性包括:
- 支持点积和叉积运算
- 可计算单位向量和模长
- 可计算向量间夹角
- 支持旋转和boost变换
- 提供高能物理专用方法如赝快度、横向分量等
构造与访问
TVector3提供了多种构造方式:
TVector3 v1; // 默认构造(0,0,0)
TVector3 v2(1); // (1,0,0)
TVector3 v3(1,2,3); // (1,2,3)
TVector3 v4(v2); // 拷贝构造
访问分量可以通过成员函数或下标操作:
Double_t x = v.X(); // 等价于 v(0)
Double_t y = v.Y(); // 等价于 v(1)
Double_t z = v.Z(); // 等价于 v(2)
坐标转换
TVector3支持多种坐标系的转换:
Double_t m = v.Mag(); // 模长(ρ)
Double_t theta = v.Theta();// 极角
Double_t phi = v.Phi(); // 方位角
Double_t perp = v.Perp(); // 横向分量
向量运算
TVector3支持完整的向量代数运算:
// 基本运算
v3 = -v1;
v1 = v2 + v3;
v1 += v3;
v1 *= 10;
// 点积和叉积
Double_t s = v1.Dot(v2); // 点积
TVector3 v = v1.Cross(v2); // 叉积
// 向量夹角
Double_t angle = v1.Angle(v2);
旋转操作
TVector3支持多种旋转方式:
- 绕坐标轴旋转:
v.RotateX(angle);
v.RotateY(angle);
v.RotateZ(angle);
- 绕任意向量旋转:
v1.Rotate(angle, v2); // 绕v2旋转
- 使用TRotation类进行旋转:
TRotation m;
v1.Transform(m);
TRotation类详解
基本概念
TRotation类描述三维向量的主动旋转,表示为3×3矩阵:
$$ \begin{bmatrix} xx & xy & xz \ yx & yy & yz \ zx & zy & zz \end{bmatrix} $$
构造与访问
TRotation r; // 单位矩阵
TRotation m(r); // 拷贝构造
// 访问元素
Double_t xx = r.XX(); // 等价于r(0,0)
旋转操作
- 绕坐标轴旋转:
r.RotateX(TMath::Pi()); // X轴旋转π弧度
- 绕任意轴旋转:
r.Rotate(angle, TVector3(1,1,1));
- 获取旋转轴和角度:
Double_t angle;
TVector3 axis;
r.GetAngleAxis(angle, axis);
复合旋转
旋转矩阵可以相乘组合:
TRotation r = r2 * r1; // 先应用r1,再应用r2
TLorentzVector类详解
基本概念
TLorentzVector表示四维向量,可用于:
- 时空坐标(x,y,z,t)
- 动量能量(px,py,pz,E)
构造与访问
TLorentzVector v1; // (0,0,0,0)
TLorentzVector v2(1,1,1,1); // (1,1,1,1)
TLorentzVector v3(TVector3(1,2,3),4); // (1,2,3,4)
访问分量有多种方式:
Double_t x = v.X(); // 空间分量
Double_t t = v.T(); // 时间分量
Double_t px = v.Px();// 动量分量
Double_t e = v.E(); // 能量分量
物理量计算
- 不变量计算:
Double_t m2 = v.M2(); // 质量平方
Double_t m = v.M(); // 质量
- 洛伦兹boost:
TVector3 b(0.1,0.2,0.3);
v.Boost(b); // 应用boost变换
- 角分布计算:
Double_t eta = v.Eta(); // 赝快度
Double_t phi = v.Phi(); // 方位角
Double_t perp = v.Perp(); // 横向动量
TLorentzRotation类详解
基本概念
TLorentzRotation描述完整的洛伦兹变换,包括boost和旋转,表示为4×4矩阵。
构造方式
TLorentzRotation l; // 单位矩阵
TLorentzRotation lb(bx,by,bz);// boost矩阵
TLorentzRotation lr(r); // 从TRotation构造
变换操作
- Boost变换:
l.Boost(0.1, 0.2, 0.3);
- 旋转操作:
l.RotateX(TMath::Pi());
l.Rotate(angle, axis);
- 变换组合:
TLorentzRotation c = a * b; // 变换组合
实际应用建议
- 在分析高能物理数据时,优先使用TLorentzVector表示四动量
- 对于探测器几何计算,TVector3更适合表示空间位置
- 进行坐标系变换时,考虑使用TRotation或TLorentzRotation
- 注意区分主动旋转和被动旋转的概念
这些物理向量类为高能物理计算提供了强大而灵活的工具,合理使用可以大大简化复杂物理量的计算和变换过程。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考