= ATLAS Run-2データの解析 = <> == 説明 == ATLAS実験で取得したデータは、検出器からの生データから粒子の情報を再構成してxAODと呼ばれる形式に変換される。ほとんどのデータ解析はxAOD形式のファイルを使って行えるはずである。 [[https://twiki.cern.ch/twiki/bin/view/AtlasComputing/SoftwareTutorialxAODAnalysisInROOT|Tutorial on ATLAS TWiki]] == データ解析の環境整備 == 以下の作業はCVMFSのインストールされたLinuxマシンのターミナル上で行うことを前提とする。 === 解析環境を用意するために一度だけ行う === 解析を行うディレクトリを作り、そこで以下のコマンドを実行する。 {{{ setupATLAS lsetup 'rcsetup Base,2.3.34' rc find_packages rc compile }}} これを実行するといくつかのディレクトリや環境変数が定義される。 最初のsetupATLASというコマンドは、ATLASでよく使うソフトウェアを使えるようにするためのものである。二つ目のコマンドはxAODデータの解析に必要な環境を整備するためのものであり、xAODファイルを解析する上で便利なフレームワーク(!RootCore)の設定をしてくれる。2.3.34の部分は、!RootCoreのバージョンで、おそらく最新のバージョンを使うべきである。Baseというのは、解析を行うグループごとに特別のソフトウェアを使っている場合があり、どのグループのソフトウェアを使うかを指定している。Baseは特定のグループに依らない一般的なソフトウェアという意味である。 xAODファイルはROOTファイルであるが、保存されているデータはATLASの衝突データをモデル化したクラスのオブジェクトたちである。データを解析するためには!RootCoreと呼ばれるフレームワークを使うことが推奨されている。利点は * 事象データを読み込んで自動的にオブジェクトとしてメモリ上に展開してくれる。 * 複数のファイルを順番に読んでいくことができる。 * データ解析でよく使う実験全体で共通のコードをライブラリから利用できる。 * 他にもあると思う。 === 新しくセッションを始めた時、毎回行う === {{{ setupATLAS lsetup rcsetup }}} 最初に環境を作った時のコマンドと似ているが、2つ目のコマンドでソフトウェアのバージョンを指定していない。最初に設定を行ったときに、設定情報を保存したファイルが作られていてそこから情報を読み込んでいるので必要ない。同じバージョンを指定しても問題はない。 == RootCoreの使い方 == !RootCoreで管理するソフトウェアに対してコンパイル等の操作をするには、{{{rc}}}というコマンドを用いる。 {{{ rc help }}} のように、{{{rc}}}に続けて操作内容を指定する。{{{rc help}}}とやると、どんな操作が可能かを表示してくれる。 == 解析コードを書く == === パッケージの作成 === !RootCoreでは、ファイルから事象を一つずつ読み込んでいく機能は用意されており、解析する際に書く必要があるのは事象データを基に何を行うかということである。 ここでは、チュートリアルに従って新しく!MyPackageというパッケージ(ライブラリのこと)を作って、その中にMyxAODAnalysisというクラスを作る。 {{{ rc make_skeleton MyPackage $ROOTCOREBIN/user_scripts/EventLoop/make_skeleton MyPackage MyxAODAnalysis }}} 最初のコマンドを実行すると、!RootCoreディレクトリの下に!MyAnalysisというディレクトリが新たに作られ、その下にさらにいくつかのファイルやディレクトリができているはずである。2つ目のコマンドを実行すると、その中にMyPackage/MyxAODAnalysis.h、Root/MyxAODAnalysis.cxxというファイルができる。 !MyPackageや!MyxAODAnalysisという名前は適切なものに変換して使う。 === データ解析のためのアルゴリズム(C++クラス)の作成 === 事象解析の基本的な流れは次のようになる。 1. 初期化 initialize() * ヒストグラムの作成など 1. ファイルにある事象をループ * 事象データを基に何か処理を行う execute() 1. 終了処理 finalize() * ヒストグラム・出力ファイルの保存 !EventLoopではファイルから事象データを順番に読み込むための仕組みが用意されている。ユーザーが書くべきコードは、ヒストグラムの作成、データ処理等の解析の内容に関連した部分だけでよい。これらのコードをクラスの決まった関数(initialize, execute, finalize)に記述することで、!EventLoopが適切に呼び出してくれる。上の流れは実際に、もう少し細かいステップに分かれていて、ヒストグラムの作成はhistInitialize()という関数の中で行うとよい。 ATLASの事象データにアクセスするためには、TEventというクラスを利用する。これはMyxAODAnalysisクラスの関数からは {{{ xAOD::TEvent* event = wk()->event(); }}} として利用できる。ここから事象のデータを取ってくるには{{{retrieve(...)}}}という関数を利用する。例えば、飛跡(Track)の情報を取ってくるには {{{ const xAOD::TrackParticleContainer* tracks=0; if (!event->retrieve(tracks, "TrackParticles").isSuccess()) { // エラー } else { // データを処理 auto p_track = tracks->begin(); for (; p_track!=tracks->end(); ++p_track) { const TrackParticle* track = *p_track; // ..... } } }}} のようにして個々の!TrackParticleオブジェクトにアクセスできる。 xAOD::TEventやxAOD::!TrackParticle等のクラスは、それぞれxAODRootAccess、xAODTrackingというパッケージで定義されているので、!MyPackageがこれらのパッケージに依存することを記述する必要がある。そのためにはMyPackage/cmt/Makefile.!RootCoreの中の"_DEP = "の部分に"xAODRootAccess xAODTracking"を追加する。Makefile.!RootCoreを編集した後には、もう一度{{{rc find_packages}}}を実行する必要がある。その後、{{{rc compile}}}とやってコードをコンパイルする。 === xAODファイルに入っている情報 === xAODファイルにはATLAS測定器で測定した検出器の情報や、そこから事象を再構成した粒子の情報が保存されている。検出器のヒットや粒子は複数あるものなので、これらの情報のほとんどは、コンテナという形で保存されている。コンテナとはクラス・オブジェクトの配列のようなものである。xAODファイルに実際にどのようなデータが保存されているかを確認するには、checkxAOD.pyというプログラムを利用する。 {{{ checkxAOD.py xaod.root }}} とすると、ファイルに保存されているコンテナとそれに関連づけられたキーの一覧が出力される。 xAODに含まれる情報に関連するクラスがどのようなデータを保持しているかを調べるにはソースコードで確認するのが最も便利である。 [[http://acode-browser2.usatlas.bnl.gov/lxr-AthAna/source/atlas/Event/xAOD/|xAODクラスのソースコード]] || 内容 || パッケージ || 主なクラス || || 事象情報 || xAODEventInfo || !EventInfo || || トリガー || xAODTrigger || !TriggerMenu, !TrigDecision, !TrigNavigation || || Tracking || xAODTracking || !TrackParticle || || カロリメータ || xAODCaloEvent || || || ミューオン || xAODMuon || Muon || || 電子・光子 || xAODEgamma || Egamma, Electron, Photon || || ジェット || xAODJet || Jet || === メイン・プログラムの作成 === !EventLoopとMyxAODAnalysisを使って実際にxAODデータを解析するためには、これらを一つのプログラムとしてまとめ上げるために、もう少し準備が必要である。 MyPackage/util/にtestRun.cxxというファイルを作って、ここにmain関数を書く。