作成したtestRun frameworkを使って、EventInfoコンテナに保存されている、run numberやevent numberにアクセスしてみましょう。
MyAnalysisAlg.cxxを編集していきます。まず、ヘッダーファイルをインクルードします:
#include "xAODEventInfo/EventInfo.h”
次にexecute()に以下を追加します。
xAOD::TEvent* event = wk()->xaodEvent();
// Event information
const xAOD::EventInfo* eventInfo = 0;
ANA_CHECK(event->retrieve(eventInfo, "EventInfo"));
unsigned long runNumber = eventInfo->runNumber();
unsigned long eventNumber = eventInfo->eventNumber();
Info("execute()", "Run = %lu : Event = %lu", runNumber, eventNumber);
1行目で、先程導入しておいたTEventのclass object (xAOD::TEvent* event = ...)を作り、今見ているイベントの情報をロードしました。
event->retrieve(container, "container name");
というフォーマットでそのイベントに保存されているコンテナの情報を取ってこれます。今はrun numberやevent numberなどの情報が保存されているEventInfoコンテナを取ってきました。
RootCoreにxAODEventInfoを加えます:
PACKAGE_DEP = EventLoop xAODRootAccess AsgTools xAODEventInfo
コンパイルした後、プログラムを実行してみます。
$ rc find_packages
$ rc compile
$ rm -r submitDir/
$ testRun submitDir
Run number, event numberにアクセスできたでしょうか?
同様にMuonコンテナの変数にも触ってみましょう。
MyAnalysisAlg.cxxを編集していきます。 上部に以下を追加します:
#include "xAODMuon/MuonContainer.h"
次に、execute()に以下を追加します
// Muons
const xAOD::MuonContainer* muons = nullptr;
ANA_CHECK(event->retrieve( muons, "Muons"));
xAOD::MuonContainer::const_iterator muon_itr = muons->begin();
xAOD::MuonContainer::const_iterator muon_end = muons->end();
for ( ; muon_itr != muon_end; ++muon_itr ){
Info("execute()", " muon pt = %.2f GeV", ((*muon_itr)->pt()*0.001));
}
DataVector<xAOD::Muons*>ミューオンコンテナを取得し、forループ回して中に入っているミューオンのpTを吐き出すコードです。
Makefile.RootCoreにxAODMuonを追加します:
PACKAGE_DEP = EventLoop xAODRootAccess AsgTools xAODEventInfo xAODMuon
コンパイルして実行してみましょう。ミューオンのpTにアクセスできましたか?
xAODMuon/versions/Muon_v1.hに定義されている変数 (pt, eta, phiなど) はこのように
muon->pt()
とすればアクセスできます。それ以外の変数は、
muon->auxdata<float>("ptvarcone30")
などとすればアクセス可能です。
ElectronのpTも同様に吐き出してみましょう。使用するコンテナ名はElectrons。使用するpackageはxAODEgamma/ElectronContainer.hです。
Muonと比べてなぜかelectronは1イベント中に含まれる数が多いですね。何でだろう?