HEPtech     - 三/四次元ベクトル XYZVector/XYZTVector -
トップページ | Tips | Topics
<三/四次元ベクトル XYZVector/XYZTVector>

 ここではROOTでの三/四次元ベクトルの取扱いについて説明します。

 C++にはベクトルを扱うためのHepVectorというツールがありますが、 ROOTではXYZVector/XYZTVectorを用いると、ベクトルの扱いが大変ラクになります。 以下はその使用例です。

#include <TVector3.h>
#include <Math/Vector3D.h>
#include <TLorentzVector.h>
#include <Math/Vector4D.h>
using namespace ROOT::Math;

XYZVector v1,v2,v3,u;
v1.SetXYZ(1.,2.,3.); // ベクトルの設定
v2=3.*v1+XYZVector(0.,0.,1.); // ベクトルの和と定数積
v3=v1.Cross(v2); // 外積
u=v3.Unit(); // 規格化
v1.Dot(v3); // 内積
v1.Mag2(); // 大きさの二乗
v2.Perp2(); // Z軸に垂直方向成分の二乗 : x*x+y*y

最初に三/四次元ベクトルそれぞれに対応するヘッダーを呼んでいます。 5行目は長いネームスペースを省略するための処理で、 以降に出ているXYZVectorは正式には ROOT::Math::XYZVector という事です。 以上のように、ベクトルの演算・規格化・外積/内積・大きさなどベクトルでの煩雑な計算を簡単に行う事ができます。 HepVectorと若干違う(違った?)箇所もありますが、基本的には同様に使えると思ってよいでしょう。 四次元ベクトルは "XYZTVector" と宣言する箇所を除き、ほぼ同様に扱うことができます。 割と複雑な操作を要求される上に、頻繁に登場するベクトル量だけに、 積極的に利用する事で無駄なミスを省き、かつ見やすいコード作りに一役買ってくれるでしょう。

 いくつか補足をしておきます。 v5.16現在では TVector3.h や TLorentzVector.h は呼ばなくても問題無いようですが、 tutorialでは記述されているので、今回は一応消さずに明示的に呼んでいます。 また以前は libPhysics や libMathCore を明示的にロードしておく必要があったと記憶しているのですが、 v5.16現在は、上記のように呼ばなくても動作するようです。 記憶が正しければ、バージョンによっては以下の宣言を追加しないとダメかもしれません。

#include <TSystem.h>
#ifdef __CINT__
 gSystem->Load("libMathCore");
 gSystem->Load("libPhysics");
#endif

 ほとんど同様に使えるROOTの三/四次元ベクトルとして、TVector3やTLorentzVectorがあります。 ROOTのtutorialsでは今回紹介したXYZVector系もTVector3系も使われているようですが、 TVector3系にはメンバ関数にMag2()のみでなくMag()もあったり、PseudoRapidity()なんてのもあったりで、 実はTVector3/TLorentzVectorのほうが使い勝手が良いかもしれません。 ただ、私個人がメインの解析で本格的に使ったのがXYZVector系だったので今回はこちらを紹介しました。 ザッと見る限り同じ要領で使えるようなので、TVector3系を試してみるのもよいかも。
2005-2017 HEPtech All rights reserved. Link/Unlink free.
inserted by FC2 system