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. |