Development of MuFastSteering algorithm with NSW by T.Kumaoka
このページは2020年度に熊岡が開発したMuonSAのNSWのアルゴリズムの説明のページになります。
開発したprivateで動くコードは以下のリンクのgitから持って来れます。
https://gitlab.cern.ch/tkumaoka/nswDevelop
添付の画像に各ディレクトリで何をするのかを示しています。この開発環境は本来athenaのTriglL2MuonSAのMuFastSteering(
https://gitlab.cern.ch/atlas/athena/blob/master/Trigger/TrigAlgorithms/TrigL2MuonSA/src/MuFastSteering.cxx
)
で使われることが期待されるコードをpirvateで動かすためのものです。そのためL1や他の検出器の情報などは使えませんので注意して下さい
*注意:
- 熊岡の修論は少し古いコードを元に書いているためあまり参考にしないでください。
- プログラム初心者であるため、用語の誤りやコードもあまり良いものでは無いかもしれませんので、もし引き継いて下さる方がいらした場合は修正してくださると幸いです。
- 極力ここに説明は書きますが基本はコードを確認して下さい。
共通内容
・各ディレクトリに入り、そこで
g++ compile.cxx -o Run `root-config --cflags --libs`
でコンパイルし、 ./Run で実行するとそれぞれで出力ファイルが生成されます。bashrcにを以下のエイリアスを作っておくとrpp compile.cxxで実行までやってくれて楽だと思います。
function rpp(){
g++ $1 -o Run `root-config --cflags --libs` && ./Run
}
・main関数はcompile.cxxで定義されていますが、基本は各ディレクトリにあるmainの下のrootのMakeClassで生成した~.hと~.cxxがmainの枠組みです。TrigL2MuonSAであればmain/MTrigL2MuonSA.cxxがMuFastSteering.cxxの役割を担っていると考えて下さい。また読み込ませるroot file(ntuple)はmain/~.hとcompile.cxxで確認して下さい。また変更するときはこの両方を変更するようお忘れなく。また出力ファイルはmain/~.cxxで確認して下さい。基本的には各段階ごとにntuple fileを生成し、次のステップでそのfileを読み込ませることになっており、複数fileが生成されてしまうので注意して下さい。
・TrigL2MuonSAにはCheckerというクラスが作ってあり、どのディレクトリでも使えるように読み込ませております。中身はTrigL2MuonSA/src/Checker.cxxを確認して下さい。基本は複数のパラメータを確認する時にcoutで書くのが面倒であるため楽にしたものです。あまりよろしいやり方ではありませんが、各main/~.hにTrigL2MuonSA::Checker c;としてグローバルなオブジェクトを作っており、どの関数内でも使えるようになっています。エラーの位置を確認したいときは、c.p0(int);とするとcheck位置がわかりやすいものとなります。また、確認したいパラメータが3つのときはc.p3("p0, p1, p2", p0, p1, p2);とすると、出力は(p0, p1, p2) = (value of p0, value of p1, value of p2) となります。p6まであるので6つまで確認できます。増やしたければChecker.hとChecker.cxxで定義すれば簡単に増やせます。(出力は全てdoubleなので注意)。
・特定のeventを確認するための方法が用意されています。Checker同様各main/~.hにグローバルな変数として、
vector<int> targetEventFilter, targetEvent;
int jentryTarget = 0;
bool targetEventTrig = 0;
が定義されており、src/の関数の好きなところで(例えばif(dEta > 0.1))targetEventTrig = 1;とするとLoop関数の最後でそのイベントの番号をtargetEventに詰めて、全てのイベントの解析が完了後event番号を吐き出してくれます。その出力をそのままevent loop(main/~.cxx)のfor文の真上あたりにcopy pastし、
//Event Filter [[KumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKuma][KumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKuma]]
targetEventTrig = 0;
if(0){
if(jentryTarget = targetEventFilter.size()) jentryTarget - 1;
if(targetEventFilter.at(jentryTarget) != jentry) continue;
else jentryTarget++;
}
//Event Filter [[KumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKuma][KumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKumaKuma]]
のif(0)をif(1)とすると指定のイベントだけを動かしてくれるようになります。各ディレクトリ共通で使えるので、TrigL2MuonSAで出力したeventをclusteringではどのようになっているのも確かめることができます。個人的には便利だったのでよければ使ってみて下さい。
・ひとまず本コードを動かすために手打ちのNSWの値等はmain/~.hの読み込むntupleの変数の定義の下、コンストラクタの定義の上あたりに書いてあります。またそのディレクトリで使う関数等もここで定義されています。
各ディレクトリの説明
・truthSegNtuple
・clustering
・transePrdToCluData
・TrigL2MuonSA
・idealTrack
・mcCompare
・eventDisplayCheck
用いるNtuple fileについて
athenaへの実装について
参考URL
NSW関係者
偉い人 : Stefano Rosati, pileup sample : Alexandre Laurier, MM clusetering (micro TPC method):Patrick Scholer
--
TakuyaKumaoka - 2020-02-25