80
BELLE 1 BELLE Analysis Software Fest 2000 STL, Panther and 1st example of Analysis Nakadaira Takeshi [email protected] Apr, 21, 2000 STL, Panther and 1st example of Analysis/1

BELLE STL, Panther and 1st example of Analysishep.phys.s.u-tokyo.ac.jp/workshops/software2000/pdf/nakadaira1.pdf · 点を除いてはstd::vector::iterator と同じ。上の例では、for

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

BELLE

1

BELLE Analysis Software Fest 2000

STL, Pantherand

1st example of Analysis

Nakadaira Takeshi

[email protected]

Apr, 21, 2000 STL, Panther and 1st example of Analysis/1

BELLE

2

BELLE Analysis Software Fest 2000

List of Slides

STL, Panther and 1st example of Analysis

STL

3 STL(Standard Template Library)

4 コンテナクラス (container class)

6 vector その 1

8 イテレータ (iterator)

9 vector その 2

10 STLの参考文献

環境設定11 環境設定

Panther

Apr, 21, 2000 STL, Panther and 1st example of Analysis/2

BELLE

3

BELLE Analysis Software Fest 2000

13 Panther — BELLE Bank System

14 Data Structure

15 どんな Tableがあるのか

18 bbsview

1st example of Analysis

20 1st example of Analysis

21 0.準備

22 1. 解析モジュールのスケルトンを作成

30 2.実際の解析 codeの implement

31 Panther Tableから必要なデータを引くには

36 仕様

37 ${MY TOP DIR}/src/rec charm/rec charm/rec charm.h

41 ${MY TOP DIR}/basf if/rec charm.cc

Apr, 21, 2000 STL, Panther and 1st example of Analysis/2

BELLE

4

BELLE Analysis Software Fest 2000

42 ${MY TOP DIR}/src/rec charm event.cc

77 Result

Apr, 21, 2000 STL, Panther and 1st example of Analysis/2

BELLE

STL(Standard Template Library) 5

BELLE Analysis Software Fest 2000

STL(Standard Template Library)

C++では、汎用的なデータ構造やアルゴリズム (ソートやサーチなど)がテンプレート (クラス,関数)として供給されている。

テンプレート� ✏C++では、引数の型に依らない関数やメンバ変数の型に依らないクラスを汎用的に定義できる。例えば 2つの量の最大値を求める関数は、template<class T> const T&

max(const T& ob1, const T& ob2){

return (ob1>=0b2) ? ob1 : ob2;

}

と定義しておけば,

int i_a, i_b;

int i_c = max(i_a, i_b);

double d_a, d_b;

double d_c = max(d_a, d_b);

と引数の方に依らず使える。また、次のようにクラスを定義すれば、

templete<class T1, class T2>

class Dstar{

public:

Dstar(const T1& ob1, const T2& ob2)

:D(ob1), SlowPion(ob2){};

const T1& D;

const T2& SlowPion;

};

以 下 の よ う な こ と が 可 能 に な る 。

// D*+ => D0 PI+

class D0 d0; class Pi pi;

class Dstar dstar_plus(d0, pi);

// D*+ => D+ PI0

class D dplus; class Pi0 pi0;

class Dstar dstar_plus(dplus, pi0);

✒ ✑Apr, 21, 2000 STL/1

BELLE

コンテナクラス (container class) 6

BELLE Analysis Software Fest 2000

コンテナクラス (container class)

STLでは様々なデータ構造でデータを蓄積するためのクラス (コンテナクラス)が用意されている。

主なコンテナクラス� ✏• vector · · · ランダムアクセス可能な動的配列。最も汎用的。• list · · · Sequential Access に特化した動的配列.

• map, multimap · · · 連想配列。• queue, priority queue · · · キュー(FIFO)

• stack · · · スタック(LIFO)

他に、bitset, deque, set, multsetがある。✒ ✑STLコンテナクラスを使うには、それぞれ対応するへッダファイルをインクルードする必要がある。(インクルードするだけ!) 例えばvectorク

Apr, 21, 2000 STL/2

BELLE

コンテナクラス (container class) 7

BELLE Analysis Software Fest 2000

ラスを使うには、

#include <vetctor>

とする。また実際にvectorクラスのオブジェクトは、型を指定して次のように宣言する。

std::vector<Particle> particles;

これは Particleという名の classの動的配列 (vector)を宣言した例である。(この状態では中身は空。)

C++で Panther のデータ構造は、vectorクラスが baseになっている。

Apr, 21, 2000 STL/2

BELLE

vector その 1 8

BELLE Analysis Software Fest 2000

vector その 1

簡単な例。まずは宣言。

std::vector<double> Pt_list;

vector に要素を入れるには、メンバ関数 push back を使う。

Pt_list.push_back(1.2);

Pt_list.push_back(0.4);

Pt_list.push_back(1.3);

Pt_list.push_back(1.6);

要素を取り出すには, 配列と同じように[] 演算子を使う.

std::cout << "0th component: " << Pt_list[0] << std::endl;

std::cout << "1th component: " << Pt_list[1] << std::endl;

0th component: 1.2

1th component: 0.4

今要素が何個詰まっているかを知るにはメンバ関数size() を使う。

std::cout << "Num. of component: " << Pt_list.size() << std::endl;

Num. of component: 4

Apr, 21, 2000 STL/3

BELLE

vector その 1 9

BELLE Analysis Software Fest 2000

vectorは配列とちがってポインタによるアクセスは危険なので注意が必要。例えば, 上の例の続きの状態で、

double* prt = &(Pt_list[0]);

Pt_list.push_back(0.9);

double* ptr2 = &(Pt_list[0]);

この状態で、prt+4==&(Pt list[4])はおろか prt==ptr2 さえも保証さ

れていない!

↓STLコンテナクラスの操作には、ポインタではな

く、イテレータ (iterator)使う。

Apr, 21, 2000 STL/3

BELLE

イテレータ (iterator) 10

BELLE Analysis Software Fest 2000

イテレータ (iterator)

STLコンテナの要素をさすポインタもどき。ポインタと同じように*演算子や->演

算子が使える。また、==,!=演算子によって、2つのイテレータが同じものをさし

ているかどうかがわかる。コンテナのメンバ関数begin()は先頭の要素を指すイ

テレータを、メンバ関数end()は最後の要素の次の位置を指すイテレータを返す。

v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] v[9]

1.3 1.6 2.5 0.2 3.8 4.0 1.9 ?? ?? ??

v.begin() v.end()

v.front()= v.back()=

i j k

+1 +1 +1 +1 +1 +1 +1 /* k==v.end() */

/* (*i)==1.3 */ /* (*j)==0.2 */ /* (*k)==?? */

Segmentation Fault

/* v.size()==7 */std::vector<double> v;

std::vector<double>::iterator i = v.begin();std::vector<double>::iterator j = i+3;std::vector<double>::iterator k = i+7;

……

Figure 1: Conseptual drawing of iterator

Apr, 21, 2000 STL/4

BELLE

vector その 2 11

BELLE Analysis Software Fest 2000

vector その 2

イテレータを使った例。vector の要素の平均と、最大値を求める.

std::vector<double> Pz_list;

Pz_list.push_back(1.2); Pz_list.push_back(1.4); ... ; Pz_list.push_back(0.1);

double max_elm = -DBL_MAX;

double sum = 0.0;

for(std::vector<double>::const_iterator i = Pz_list.begin();

i != Pz_list.end();++i){

sum += *i;

if(*i>max_elm) max_elm = *i;

}

std::cout << "Max : " << max_elm << endl;

std::cout << "Avg : " << sum/(double)Pz_list.size() << endl;

Max : 1.4

Avg : 0.9

std::vector<double>::const iterator(定数イテレータ) は、指している要素の内容を変更できない

点を除いてはstd::vector<double>::iterator と同じ。上の例では、for の中で要素を書き換える予

定がないので、定数イテレータを使う方が望ましい.

Apr, 21, 2000 STL/5

BELLE

STLの参考文献 12

BELLE Analysis Software Fest 2000

STLの参考文献

• http://bsunsrv1.kek.jp/ software/c++/stl/sgi/index.html

リファレンスとしては最適。具体例はない。

• STL標準講座, ハーバード・シルト著, 多摩ソフトウェア訳

具体例中心に書かれているが, 具体例に出てこない関数やクラスの説明は殆んどないのでリファレンスとしては不向き.

• C++ライブラリハンドブック, 越田一郎著

辞書風.分厚いが,大部分はへッダファイルの写し。マニア向けかも。

• Standard Template Libraryプログラミング, επιστηµη著

比較的良くまとまっている。

Apr, 21, 2000 STL/6

BELLE

環境設定 13

BELLE Analysis Software Fest 2000

環境設定

BELLE Libraryを使うには環境変数の設定が必要. 以下を~/.cshrcに加えておく.setenv BHOME /belle

setenv BELLE_LEVEL b20000408_1015

setenv MY_TOP_DIR /svddata/nakadair/belle

source /belle/local/etc/cshrc_general

setenv LD_LIBRARY_PATH ${MY_TOP_DIR}/lib/so:${LD_LIBRARY_PATH}

• $BELLE LEVEL

BELLE Libraryのバージョンを指定する. 通常 b20000408 1015 のように bYYYYMMDD HHMMの形式. どの日付が有効かは,

% ls /belle/belle/ | grep "b[0-9]*\_[0-9]*"

でわかる。

• $MY TOP DIR

Apr, 21, 2000 環境設定/1

BELLE

環境設定 14

BELLE Analysis Software Fest 2000

最新のソースファイルを取ってきたり、自分の解析モジュールを置くdirectoryを指定する。最新の$BELLE LEVELの日時よりも後にライブラリーに修正が入れられる場合がある。そのような場合に最新のソースファイルを取ってきたい場合には,

% mkdir -p $MY_TOP_DIR/src

% cd $MY_TOP_DIR/src

% get_packages (パッケージ名)

とする。

Apr, 21, 2000 環境設定/1

BELLE

Panther — BELLE Bank System 15

BELLE Analysis Software Fest 2000

Panther — BELLE Bank System

Panther · · · BELLE実験の Officalなデータフォーマット。実験データや検出器のデータ,モンテカルロサンプルは Panther形式でやり取りされる。

特徴

• Fortran, C, C++から読み書き可能.(Cでは一部機能制限がある。)

• データの型: INTEGER*4(int), REAL*4(float), REAL*8(double),

CHARCTER*4(char[4]), CHARCTER*8(char[8]), Alias, Pointer

• C++からのアクセスの方法は、STLがベースになっている。

詳しいマニュアルはhttp://bsunsrv1.kek.jp/~nagayama/panther/にある。バージョンが古いので気をつけなければいけないが、PANTHER

version 2.0 --- Primer --- の Chapter5が とっかかりとしては良い。

Apr, 21, 2000 Panther/1

BELLE

Data Structure 16

BELLE Analysis Software Fest 2000

Data Structure

Event# 1Event# 2

Event# n

Group TableMDST_Charged

chargepxpypz

ID

masstrk

…… ……

1-10.10.81.80.11

……

2+10.30.41.40.52

……

3+10.10.10.80.54

……

4-10.20.50.60.15

……

n+10.10.30.10.0m-1

……

n-1-10.50.00.20.1m-3

…………………

MDST_TRK

mhyp(1)mhyp(2)mhyp(3)mhyp(4)

ID

mhyp(5)quality

…… ……

1123451

……

26789

101

……

311121314150

……

416171819201

……

m41424344450

……m-136373839401

…………………

MDST_Run_HeadMDST_Run_End

MDST_EventMDST_Charged

MDST_VeeMDST_Vee2

MDST_Vee_Daughters

MDST_Gamma

MDST_Pi0

MDST_Klong

MDST_ElidMDST_Muid

MDST_TRKMDST_TRK_Fit

MDST_ACCMDST_TOFMDST_ECl

MDST_KLM

MDST_Sim_XrefMDST_Sim_Rand

……

mdst_allGroups

ip_all

acc_allcdc_all

ecl_all

efc_allklm_all

svd_all

level4_all

elid_allmdst_all

run_info_all

trk_all

klid_allmuid_all

tof_all

qq_all

belle_tdf_all

gsim_allhepevt_all

evtvtx_allevt_cls_all

……

trg_all

Begin_run record

End_run record

Variables

Entities Event# 0

Figure 2: Conseptual drawing of Panther datastructure

Apr, 21, 2000 Panther/2

BELLE

どんな Tableがあるのか 17

BELLE Analysis Software Fest 2000

どんなTableがあるのか

Panther Tableは TDF ファイル (Table Definition file)で定義されている。BELLE officalな TDF ファイルは、$BELLE TOP DIR/tables/*.tdf

にある。また,自分で TDFファイルを作成することにより Tableを増やすことも可能である。TDFファイルはbbstableというコマンドに書けると、LATEX形式のドキュメントと、Panther Library のためのC++, C,

fortranのソースファイルが生成される。[belsrv1]:nakadair(938)> ls

mdst.tdf

[belsrv1]:nakadair(939)> bbstable mdst.tdf

BBStable warning: the date (1999/04/07) is older than today (2000/4/20).

BBStable warning: Pointer destination isn’t found (MDST_Sim_Xref->Gen_HEPEVT).

Table Gen_HEPEVT is expected to be defined in another file.

[belsrv1]:nakadair(940)> ls

mdst.cc mdst.h mdst.inc mdst.tdf mdst.tex mdst_w.tex panther_mdst.c

生成されたmdst w.texを LATEXで処理することによりどんな Tableがあるのかが調べられる。特に解析で良く参照される Tableを挙げておく.

Apr, 21, 2000 Panther/3

BELLE

どんな Tableがあるのか 18

BELLE Analysis Software Fest 2000

• MDST Charged, MDST TRK, MDST TRK Fit(mdst.tdf) · · ·CDC+SVDの情報から,トラッキングソフトウェア (Trasan, TRAK)によって再構成された Charged Track の information

• MDST Gamma(mdst.tdf) · · · ECLによって検出された Gammaのinformation

• MDST Klong(mdst.tdf) · · · KLMによって検出された KLのinformation

• MDST PI0(mdst.tdf) · · · 2つの Gammaから再構成された π0

Candidate の information

• MDST Vee, MDST Vee2(mdst.tdf) · · · 2つの Charged Track から再構成された V-particle (KS,Λ) Candidate の information

• Gen HEPEVT(hepevt.tdf) · · · qq98によって生成された粒子の情報(MC)

これらの Tableがどんな変数を持っているかは、bbstableで生成されるド

Apr, 21, 2000 Panther/3

BELLE

どんな Tableがあるのか 19

BELLE Analysis Software Fest 2000

キュメント (別紙)を参照.

PID Information や IP Profileなどに関してはC++のクラスライブラリ(eid, atc pid, IpProfile, etc.)として整備されているのでユーザが解析プログラムで Panther Tableから情報を得る必要性は殆んどない。

しかし、今のところ BASF でデータのファイル I/Oやモジュール間のデータの受け渡しには, Panther 形式しか (Officailには)サポートされていないので、 Library/Module の Developer/Maintainerには Panther の知識が必要。

Pantherのデータの取り扱いの詳細はマニュアルを参照. Pantherデータの読みかたについては解析プログラムの例で説明する.

Apr, 21, 2000 Panther/3

BELLE

bbsview 20

BELLE Analysis Software Fest 2000

bbsview

Panther形式でセーブされたファイルを直接目でみるには、bbsview というコマンドを用いる. 例えば,

• /belle/dst/nfs/ に 実験データ

• /belle/belle/b19991109 1648/share/mcprod/ に モンテカルロサンプル

があるので実際に見てみると,% bbsview /belle/dst/nfs/e000007/HadronC/0209/e000007r000146to475-b20000209\_1315.mdst

PANTHER version 3.0 (27/Mar/1997)

PANTHER target date: latest

(途中略)

BsDfOpen:file\_name (/belle/dst/nfs/e000007/HadronC/0209/e000007r000146to475-b20000209\_1315.mdst).

----- Table -----

----- Command -----

L (Load) P (Print) R (Rewind) S (Skip) G (Goto) Q (Quit) F (Format) D (Dump)

Command: l

Format record (table definition) is read.

----- Table -----

----- Command -----

L (Load) P (Print) R (Rewind) S (Skip) G (Goto) Q (Quit) F (Format) D (Dump)

Command: l

*** Record number = -10 ***

----- Table -----

-BEGIN_RUN_AUX_RECORD ( 1) BEGIN_RUN_RECORD ( 1) BELLE_RUNHEAD( 1)

L (Load) P (Print) R (Rewind) S (Skip) G (Goto) Q (Quit) F (Format) D (Dump)

Apr, 21, 2000 Panther/4

BELLE

bbsview 21

BELLE Analysis Software Fest 2000

----- Command -----

Command: l

*** Record number = 3 ***

----- Table -----

BELLE_EVENT ( 1) EVTCLS_FLAG ( 1) EVTCLS_FLAG2 ( 1) EVTCLS_HADRON_CHARGED ( 5)

EVTCLS_HADRON_INFO ( 1) EVTCLS_HADRON_NEUTRAL ( 8) EVTVTX_PRIMARY_VERTEX ( 1)

EVTVTX_TRK ( 4) MDST_ACC ( 6) MDST_CHARGED ( 6) MDST_ECL ( 25) MDST_ECL_AUX ( 25) MDST_ECL_CR ( 22)

MDST_ECL_TRK ( 7) MDST_EVENT ( 1) MDST_GAMMA ( 12) MDST_KLM ( 6) MDST_KLM_CLUSTER ( 6)

MDST_KLM_MU ( 6) MDST_MUID ( 6) MDST_PI0 ( 11) MDST_SIM_XREF( 7) MDST_TOF ( 4) MDST_TRK ( 6)

MDST_TRK_FIT ( 12) MDST_VEE ( 1)

----- Crate= 1, Event No.= 33 -----

----- Command -----

L (Load) P (Print) R (Rewind) S (Skip) G (Goto) Q (Quit) F (Format) D (Dump)

Command: p

Table name: MDST_CHARGED

Table: MDST_CHARGED (number of entities = 6)

--------------------------------------------------------------------------------------------------------------------

ID CHARGE PX PY PZ MASSUSED_PI PID_E PID_MU PID_PI PID_K PID_P ELID TRK ACC TOF KLM MUID

--------------------------------------------------------------------------------------------------------------------

1 1.00 -2.14 1.28 2.83 0.14 0 0.00 0.00 0.00 0.00 0.00 0 1 1 1 1 1

2 1.00 0.12 -1.12 1.31 0.14 0 0.00 0.00 0.00 0.00 0.00 0 2 2 2 2 2

3 1.00 0.62 -0.28 -0.38 0.14 0 0.00 0.00 0.00 0.00 0.00 0 3 3 3 3 3

4 -1.00 0.36 0.24 0.18 0.14 0 0.00 0.00 0.00 0.00 0.00 0 4 4 4 4 4

5 -1.00 -0.07 -0.19 0.50 0.14 0 0.00 0.00 0.00 0.00 0.00 0 5 5 0 5 5

6 -1.00 0.18 0.10 -0.34 0.14 0 0.00 0.00 0.00 0.00 0.00 0 6 6 0 6 6

--------------------------------------------------------------------------------------------------------------------

----- Command -----

L (Load) P (Print) R (Rewind) S (Skip) G (Goto) Q (Quit) F (Format) D (Dump)

Command: q

Apr, 21, 2000 Panther/4

BELLE

1st example of Analysis 22

BELLE Analysis Software Fest 2000

1st example of Analysis

C++で実際に解析プログラムを書いてみましょう。サンプルとしてチャームメソン D0, D∗+を Reconstructionしてみましょう。Reconstruct するモードは終状態の粒子数が最も少ない

D∗± → D0π±

→ K∓π±

にします。ちなみに D∗+のMassは 2010.0± 0.5[MeV]で D∗+ → D0π+

モードの Branching ratio は 68.3± 1.4%です。また D0のMassは1864.6± 0.5[MeV]で D0 → K−π+モードの Branching ratio は3.85± 0.09%です。ここで、「D0 → K−π+を Reconstruct する」とは、Kらしい Charged Track と π0らしい Charged Track の それぞれの 4元運動量から不変質量を計算し (Massを組む), D0のMassの領域にピークを見いだすことです。

Apr, 21, 2000 1st example of Analysis/1

BELLE

0.準備 23

BELLE Analysis Software Fest 2000

0.準備

環境変数$MY TOP DIR以下に必要となる directoryを作成します。% mkdir -p ${MY_TOP_DIR}/src/

% cd ${MY_TOP_DIR}/src/

もし ,$MY TOP DIR/src/configが無ければ,$BELLE TOP/src/configをコピーします。% if ( ! -f ${MY_TOP_DIR}/src/config ) then

% cp -r $BELLE_TOR_DIR/src/config ${MY_TOP_DIR}/src/

% endif

Apr, 21, 2000 1st example of Analysis/2

BELLE

1. 解析モジュールのスケルトンを作成 24

BELLE Analysis Software Fest 2000

1. 解析モジュールのスケルトンを作成

まずこれから作成する BASFモジュールの名前を決めます。今回は、rec charm とします。まず BASFのモジュールとなるのに必要な部分となる骨格を作成します。~nakadair/public/bin/make templeteというコマンドを実行すれば、スケルトンファイルができます。% ~nakadair/public/bin/make_templete rec_charm

このコマンドにより${MY TOP DIR}/src/rec charm/どいうディレクトリが掘られ、その下にも幾つかファイルが作成されます.そのうちで重要なのは

${MY_TOP_DIR}/src/rec_charm/rec_charm/rec_charm.h

${MY_TOP_DIR}/src/rec_charm/basf_if/rec_charm.cc

${MY_TOP_DIR}/src/rec_charm/src/rec_charm_event.cc

の3つです。ヘッダファイル${MY TOP DIR}/src/rec charm/rec charm/rec charm.h

にはモジュールクラスの宣言文があります。

Apr, 21, 2000 1st example of Analysis/3

BELLE

1. 解析モジュールのスケルトンを作成 25

BELLE Analysis Software Fest 2000

#ifndef __REC_CHARM_H__

#define __REC_CHARM_H__

#define HEP_SHORT_NAMES

#include "event/BelleEvent.h"

#include "tuple/BelleTupleManager.h"

#include "basf/module.h"

#include "basf/module_descr.h"

#include "panther/panther.h"

//

// Declaration of class rec_charm

//

class rec_charm : public Module {

public:

rec_charm();

virtual ~rec_charm();

void init(int*);

void term();

void disp_stat(const char*);

void hist_def();

void event(BelleEvent*, int*);

void begin_run(BelleEvent*, int*);

void end_run(BelleEvent*, int*);

void other ( int*, BelleEvent*, int* ){};

public: // BASF Parameters

protected:

};

#endif /* __REC_CHARM_H__ */

Apr, 21, 2000 1st example of Analysis/4

BELLE

1. 解析モジュールのスケルトンを作成 26

BELLE Analysis Software Fest 2000

${MY TOP DIR}/src/rec charm/basf if/rec charm.ccに BASFinterface functionがあります。#include "rec_charm/rec_charm.h"

extern "C" Module_descr *mdcl_rec_charm() {

rec_charm* module = new rec_charm;

Module_descr* dscr = new Module_descr("rec_charm", module);

// dscr->define_param ( "Parameter", "Description", &module->var);

return dscr;

}

Apr, 21, 2000 1st example of Analysis/5

BELLE

1. 解析モジュールのスケルトンを作成 27

BELLE Analysis Software Fest 2000

${MY TOP DIR}/src/rec charm/src/rec charm event.cc

には、BASF Module クラスの定義があります。#include <iostream.h>

#include "event/BelleEvent.h"

#include "tuple/BelleTupleManager.h"

#include "basf/module.h"

#include "basf/module_descr.h"

#include "panther/panther.h"

#include MDST_H

#include "rec_charm/rec_charm.h"

rec_charm::rec_charm(){

return;

}

rec_charm::~rec_charm(){

}

void

rec_charm::init(int* status){

return;

}

void

rec_charm::term(){

return;

}

Apr, 21, 2000 1st example of Analysis/6

BELLE

1. 解析モジュールのスケルトンを作成 28

BELLE Analysis Software Fest 2000

void

rec_charm::disp_stat(const char* str){

return;

}

void

rec_charm::hist_def(){

extern BelleTupleManager* BASF_Histogram;

BelleTupleManager* tm = BASF_Histogram;

return;

}

void

rec_charm::event(BelleEvent* evptr, int* status){

return;

}

void

rec_charm::begin_run(BelleEvent* evptr, int* status){

return;

}

void

rec_charm::end_run(BelleEvent* evptr, int* status){

return;

}

この状態ですでに ”何もしない BASF Module”が出来上がっています。ためしに コンパイルしてみましょう.

Apr, 21, 2000 1st example of Analysis/6

BELLE

1. 解析モジュールのスケルトンを作成 29

BELLE Analysis Software Fest 2000

まずconfigureスクリプトを実行してMakefileを作成する必要があります。% cd $MY_TOP_DIR/src/config

% ./configure

loading cache ./config.cache

checking host system type... sparc-sun-solaris2.5.1

checking target system type... sparc-sun-solaris2.5.1

(途中省略)

configuring in ../rec_charm/config

running /bin/sh ./configure --cache-file=../../.././config\.cache --srcdir=.

loading cache ../../.././config.cache

creating ./config.status

creating ../Makefile

creating ../basf_if/Makefile

creating ../basf_if/Makefile.link_options

creating ../rec_charm/Makefile

creating ../src/Makefile

正常に終了すると$MY TOP DIR/src/rec charm/Makefileが出来ているので makeを実行します。

Apr, 21, 2000 1st example of Analysis/7

BELLE

1. 解析モジュールのスケルトンを作成 30

BELLE Analysis Software Fest 2000

% cd $MY_TOP_DIR/src/rec_charm/

% make

making libs in src/rec_charm/src

(途中省略)

Installing rec_charm.so

mkdir /svddata/nakadair/belle/lib/basf_if/rec_charm

Installing rec_charm.o

making all in src/rec_charm/src

making all in src/rec_charm/rec_charm

"gmake[2]:Error "とか文句が出ていなければコンパイルは正常に終了しています。試しに作業用のディレクトリに移動して実行してみます。

Apr, 21, 2000 1st example of Analysis/7

BELLE

1. 解析モジュールのスケルトンを作成 31

BELLE Analysis Software Fest 2000

% cd /svddata/username/working_dir

% basf

shared memory id = 66566

main process pid = 21989

SCL initializaion done

PANTHER version 3.0 (27/Mar/1997)

(途中省略)

basf> path add_module main rec_charm

module loaded from /svddata/nakadair/belle/bin/rec_charm.so

basf> initialize

basf> generate_event 10

gen_event started

Framework::mc_begin_run removing run_head

process_control - Begin_Run processing done.

SDS_set : done!

***** FPDA elapsed time summary *****

Total elapsed time : 0 sec.

*************************************

---------------- BASF Execution Statistics -----------------

Module | CPU time(sec) | # of calls

---------------------+-------------------+------------------

rec_charm | 0 | 10

---------------------+-------------------+------------------

Total CPU time(sec) | 0 |

---------------------+-------------------+

basf> terminate

正常にモジュールが basfにロードされ、実行されていることがわかります。(当然何もしていませんが)

Apr, 21, 2000 1st example of Analysis/8

BELLE

2.実際の解析 codeの implement 32

BELLE Analysis Software Fest 2000

2.実際の解析 codeの implement

準備が整ったので実際のコーディングに移ります. 実際にコードにするべきことは, 大まかに別けて

• Panther Tableから必要なデータを引く.

• ターゲットの粒子の Reconstruction.

• (モンテカルロシミュレーション)Reconstructされた Candidateが本物かどうかを Tagする。

• Histogramを定義し、データを実際に Fillする。

となります。これらの Code をスケルトンプログラムに追加していく作業になります。

Apr, 21, 2000 1st example of Analysis/9

BELLE

Panther Tableから必要なデータを引くには 33

BELLE Analysis Software Fest 2000

Panther Tableから必要なデータを引くには

BASF Moduleで Panther Tableから必要なデータを引くには以下のような手順を踏む.

1. 必要なヘッダファイルを includeする。

例えばfoo.tdfという TDFファイルで定義されている Tableからデータを引きたい時には,#include FOO_H とします。(TDFファイル名を大文字にして、.を に置き換える。) 今回の解析では, MDST Charged, MDST TRK,MDST TRK Fit, Gen HEPEVT,

BELLE RunHeadを引きたいので,#include MDST_H

#include HEPEVT_H

#include BELLETDF_H

を${MY TOP DIR}/src/rec charm event.ccに追加する.

Apr, 21, 2000 1st example of Analysis/10

BELLE

Panther Tableから必要なデータを引くには 34

BELLE Analysis Software Fest 2000

2. Panther Table Managerを呼ぶ。

具体例で説明します。D0 → K−π+を Reconstructする場合, まず最初にそのイベントで Detectされた Charged Trackの情報を引く必要があります。Charged Trackに関する情報は Table: MDST Charged

にあるということは TDFファイルから作ったドキュメント (別紙)から分かります。C++ではその情報はどう見えるのでしょうか?

• Table:MDST Chargedの Entity(1つ1つの Charged Track)の構造は、Mdst chargedというクラス (Tableの名前の先頭のみ大文字で後は小文字にした名前のクラス)として定義されている。Entityを表すクラス (この例ではclass Mdst charged)は,TDFファイルで定義されている variableと同じ名前のメンバ関数を持っている。

Apr, 21, 2000 1st example of Analysis/10

BELLE

Panther Tableから必要なデータを引くには 35

BELLE Analysis Software Fest 2000

class Mdst_charged {

public: // Extractors

float charge(void) const;

float px(void) const;

float py(void) const;

float pz(void) const;

float p(int) const;

float mass(void) const;

Mdst_trk& trk(void) const;

int trk_ID(void) const { return m_p->m_trk; }

// (省略)

};

• Table:MDST Chargedは, Mdst charged Managerというクラス(Entityを表すクラスの名前のあとに Managerを付けた名前のクラス)で参照される。これは,Entityを表すクラスのvectorクラスを継承して機能拡張したものである。

Apr, 21, 2000 1st example of Analysis/10

BELLE

Panther Tableから必要なデータを引くには 36

BELLE Analysis Software Fest 2000

class Mdst_charged_Manager : public Table_Manager<Mdst_charged> {

private:

static Mdst_charged_Manager *manager;

static Mdst_charged *null;

// (省略)

};

template<class Entity> class Table_Manager : public vector<Entity>,

public Table_Manager_Base {

public:

Entity& add(void);

void remove(Entity&);

void remove(void);

int count(void) const;

int max_id(void) const;

void dump(void) const;

// (省略)

};

普通にデータを引く場合,Mdst charged Managerクラスはstd::vector<Mdst charged>と思って差し支えない。ただし、要素を増やしたいときはpush back()ではなくメンバ関

Apr, 21, 2000 1st example of Analysis/10

BELLE

Panther Tableから必要なデータを引くには 37

BELLE Analysis Software Fest 2000

数add()を使う必要がある。また、Tableの中の有効な Entityの数を調べるのには vectorクラスのsize()ではなくメンバ関数count()を使ったほうが幸せ。

• TableのオブジェクトにアクセスするにはMdst charged Manager クラスのメンバ関数 get manager() を使う。BASF Module の event(...)関数の中では,

Mdst_charged_Manager& chg_mgr = Mdst_charged_Manager::get_manager();

とすると、深く考えなくても,現在解析中のイベントに対応するEntityが入ったテーブル (への参照)が得られる。そこで、

double PzSum = 0.0;

for(std::vector<Mdst_charged>::const_iterator i = chg_mgr.begin();

i != chg_mgr.end(); ++i){

const Mdst_charged& ith_trak = *i; // i-th charged track !

PzSum += ith_trak.pz();

}

double PzAvg = PzSum/(double) chg_mgr.count();

とやればそのイベントの Charged Track の Pz (Z方向の運動量)の 合計と平均が求められる。

Apr, 21, 2000 1st example of Analysis/10

BELLE

仕様 38

BELLE Analysis Software Fest 2000

仕様

実際の場面で必要とされそうなことを含むように,解析例のプログラムは以下のような仕様にしましょう.

• BELLE 標準 の Particle Class を使う.

• D0の Candidateを select する mass region の上限,下限 や, D∗+ のCandidateを select する mass difference (m(D∗)− m(D0)) regionの上限,下限 は実行時に変えられるようにする.

• MCデータとリアルデータの両方を解析し , MC の場合にはReconstruct された Candidateが 本物かガセかを Tagする。

• Candidateの Mass 分布 と CM系での Momentum 分布 をHistogram にセーブする. 同時に, それらの量を ntuple に保存する。

Apr, 21, 2000 1st example of Analysis/11

BELLE

${MY TOP DIR}/src/rec charm/rec charm/rec charm.h 39

BELLE Analysis Software Fest 2000

${MY TOP DIR}/src/rec charm/rec charm/rec charm.h

まず先頭に何のためのファイルかをコメント.//

// rec_charm.h

// ---- Reconstruct D*+ ==> D0 PI+

// \==> K- PI+

// 2000/4/21

// Nakadaira Takehsi (Univ. of Tokyo, D1)

#ifndef __REC_CHARM_H__

#define __REC_CHARM_H__

#define HEP_SHORT_NAMES

// Use Particle class

#include "particle/Particle.h"

Particle class を使うので#include "particle/Particle.h"を include.このファイルはプログラムの先頭で includeしたほうが 良いそうです。(田中さん談)

Apr, 21, 2000 1st example of Analysis/12

BELLE

${MY TOP DIR}/src/rec charm/rec charm/rec charm.h 40

BELLE Analysis Software Fest 2000

class rec_charm : public Module {

public:

rec_charm();

virtual ~rec_charm(){};

void init(int*){};

void term(){};

void disp_stat(const char*){};

void hist_def();

void event(BelleEvent*, int*);

void begin_run(BelleEvent*, int*);

void end_run(BelleEvent*, int*){};

void other ( int*, BelleEvent*, int* ){};

今回は使わない関数をインライン定義に変更.public: // BASF Parameters

double d0_mass_lower;

double d0_mass_upper;

double dstar_dmass_lower;

double dstar_dmass_upper;

Moduleのパラメーターにしたいメンバ変数は publcに宣言.

次にいくつかのメンバ関数を定義. 解析コードをコンポーネント化.

Apr, 21, 2000 1st example of Analysis/12

BELLE

${MY TOP DIR}/src/rec charm/rec charm/rec charm.h 41

BELLE Analysis Software Fest 2000

protected:

// Reconstruction routine of "D0 ==> K PI"

int recon_d0(std::vector<Particle>& d0s,

std::vector<Particle>& d0_kaons,

std::vector<Particle>& d0_pions);

// Analysis on D0 candidate

void analysis_d0(std::vector<Particle>& d0s);

// Reconstruction routine of "D*+ ==> D0 PI+"

int recon_dstar(std::vector<Particle>& dstars,

std::vector<Particle>& dstar_pions,

std::vector<Particle>& d0s);

// Analysis on D*+ candidate

void analysis_dstar(std::vector<Particle>& dstars);

// Function to Access Generator information

const Gen_hepevt* get_pGenHepevt(const Mdst_charged& chg);

const Gen_hepevt* get_pGenHepevt(const Particle& d0);

const Gen_hepevt* get_pGenHepevt(const Particle& d0,

const Mdst_charged& pion);

Apr, 21, 2000 1st example of Analysis/12

BELLE

${MY TOP DIR}/src/rec charm/rec charm/rec charm.h 42

BELLE Analysis Software Fest 2000

プライベートメンバ変数の定義。Histogramや Ntupleを作るにはその分の数だけ,BelleHistogram*,BelleTuple*型のメンバ変数が必要。配列でもよいが、お勧めしない. やるなら連想配列。いずれにせよ、Histogramや Ntupleのためのメンバ変数は必ず privateに宣言.

メンバ変数mcは MC か Real Data かの識別用フラグ.private: // Historgams;

BelleHistogram* h_d0_mass;

BelleHistogram* h_d0_pstar;

BelleHistogram* h_dstar_massdiff;

BelleHistogram* h_dstar_mass;

BelleHistogram* h_dstar_mass_vs_d0_mass;

BelleHistogram* h_dstar_pstar;

BelleHistogram* h_dstar_pstar_pi;

BelleTuple* nt_d0;

BelleTuple* nt_dstar;

int mc;

};

#endif /* __REC_CHARM_H__ */

Apr, 21, 2000 1st example of Analysis/12

BELLE

$fMY TOP DIRg/basf if/rec charm.cc 43

BELLE Analysis Software Fest 2000

${MY TOP DIR}/basf if/rec charm.cc

やっぱり先頭には何のプログラムかをコメント.//

// rec_charm.cc

// ---- Reconstruct D*+ ==> D0 PI+

// \==> K- PI+

// 2000/4/21

// Nakadaira Takehsi (Univ. of Tokyo, D1)

#include "rec_charm/rec_charm.h"

extern "C" Module_descr *mdcl_rec_charm() {

rec_charm* module = new rec_charm;

Module_descr* dscr = new Module_descr("rec_charm", module);

モジュールの実行時パラメータの登録をする。テンプレートのコメントに従う。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 44

BELLE Analysis Software Fest 2000

// dscr->define_param ( "Parameter", "Description", &module->var);

dscr->define_param("d0_mass_lower",

"Lower limit of D0 mass",

&module->d0_mass_lower);

dscr->define_param("d0_mass_upper",

"Upper limit of D0 mass",

&module->d0_mass_upper);

dscr->define_param("dstar_dmass_lower",

"Lower limit of D*+ mass difference",

&module->dstar_dmass_lower);

dscr->define_param("dstar_dmass_upper",

"Upper limit of D*+ mass difference",

&module->dstar_dmass_upper);

return dscr;

}

こうしておくと,コンパイルして basfにロードしたときにbasf> module inquire_parameter rec_charm

4

d0_mass_lower\Lower limit of D0 mass\D\8\1.840000e+00

d0_mass_upper\Upper limit of D0 mass\D\8\1.890000e+00

dstar_dmass_lower\Lower limit of D*+ mass difference\D\8\1.400000e-01

dstar_dmass_upper\Upper limit of D*+ mass difference\D\8\1.550000e-01

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 45

BELLE Analysis Software Fest 2000

${MY TOP DIR}/src/rec charm event.cc

ここでも Particle class のヘッダファイルは先頭で include//

// rec_charm_event.cc

// ---- Reconstruct D*+ ==> D0 PI+

// \==> K- PI+

// 2000/4/21

// Nakadaira Takehsi (Univ. of Tokyo, D1)

// Use Particle class

#include "particle/Particle.h"

#include "particle/utility.h"

#include <iostream.h>

#include "event/BelleEvent.h"

#include "tuple/BelleTupleManager.h"

#include "basf/module.h"

#include "basf/module_descr.h"

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 46

BELLE Analysis Software Fest 2000

自分が引きたい Panther table 用のヘッダファイルをインクルード .

#include "panther/panther.h"

#include MDST_H // access table defined in mdst.tdf

#include HEPEVT_H // access table defined in hepevt.tdf

#include BELLETDF_H // access table defined in belletdf.tdf

自分自身の宣言を include#include "rec_charm/rec_charm.h"

使用するライブラリ用のヘッダファイルを include. この例では CLHEPと Kaon ID.// Use CLHEP LorentzVector

#include "CLHEP/Vector/LorentzVector.h"

// Use kaon id

#include "kid/atc_pid.h"

マクロ定義

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 47

BELLE Analysis Software Fest 2000

#define LUND_D0 (421)

#define LUND_D0B (-421)

#define LUND_DSTAR_PLUS (413)

#define LUND_DSTAR_MINUS (-413)

高エネルギー物理学の業界で共通に使われている粒子のナンバリング.Particle Data Book に載っている。また、$BELLE TOP DIR/share/data-files/qq98/decay.decにの一覧があるので、% grep "^PDG" $BELLE_TOP_DIR/share/data-files/qq98/decay.dec | less

で探せます.Charged Lepton は 電荷の符号と番号の符号が逆なので注意.

モジュールクラスのコンストラクタ. メンバ変数をもっとらしい値で初期化.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 48

BELLE Analysis Software Fest 2000

// default constructor

rec_charm::rec_charm(){

d0_mass_lower = 1.840;

d0_mass_upper = 1.890;

dstar_dmass_lower = 0.140;

dstar_dmass_upper = 0.155;

mc = 1;

return;

}

Histogramの定義void

rec_charm::hist_def(){

extern BelleTupleManager* BASF_Histogram;

BelleTupleManager* tm = BASF_Histogram;

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 49

BELLE Analysis Software Fest 2000

// Define 1D histograms

h_d0_mass = tm->histogram("D0 mass",

50, 1.84, 1.89);

h_d0_pstar = tm->histogram("D0 p*",

50, 0.0, 5.0);

h_dstar_massdiff = tm->histogram("D* mass - D0 mass",

50, 0.14, 0.155);

h_dstar_mass = tm->histogram("D* mass",

50, 1.990, 2.030);

h_dstar_pstar = tm->histogram("D* p*",

50, 0.0, 4.5);

h_dstar_pstar_pi = tm->histogram("slow pion p* ",

50, 0.0, 0.8);

// Define 2D histograms

h_dstar_mass_vs_d0_mass = tm->histogram("D0 mass VS D* mass",

50, 1.84, 1.89,

50, 1.990, 2.030);

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 50

BELLE Analysis Software Fest 2000

// Define N-tupels

nt_d0 = tm->ntuple("D0 candidate",

"lund mass fake p pstar");

nt_dstar = tm->ntuple("D* candidate",

"lund mass dmass mass_d0 fake fake_d0 p pstar pstr_pi");

return;

}

まずは BelleTupleManager を 呼ぶ。マネージャーさんのhistogram(...)関数によりヒストグラムが, ntuple(...)によりNtupleが出来る。あとで Dataを Fillするために 出来たヒストグラムやNtupleへのポインタを保持する。

• histogram(title, # of bin, lower limit, upper limit) · · · 1dhistogram

• histogram(title, x # of bin, x lower limit, x upper limit,

y # of bin, y lower limit, y upper limit) · · · 2d histogram

• ntuple(title, name viriables) · · · ntuple, 変数名はスペース区

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 51

BELLE Analysis Software Fest 2000

切りの文字列で指定する。変数名は 8文字以内ですべて小文字にすると吉。

begin run(...)の定義. Panther Table: Belle RunHeadから MCデータか Realデータかを判定.void

rec_charm::begin_run(BelleEvent* evptr, int* status){

// Judge data is Real Data or MC.

Belle_runhead_Manager& rhd_mgr = Belle_runhead_Manager::get_manager();

std::vector<Belle_runhead>::const_iterator rhd = rhd_mgr.begin();

if(rhd==rhd_mgr.end()){

cerr << "[rec_charm] Can not Access to Belle_RunHead" << endl;

cerr << "[rec_charm] Regard the data as MC sample" << endl;

}else if(rhd->ExpMC()==1){ // Data is Real Data!

cout << "[rec_charm] Real data Analysis" << endl;

mc = 0;

}else{

cout << "[rec_charm] MC Analysis" << endl;

}

また Particle Class を 初期化する。何でもいいから Ptype クラス (粒子の種類をあらわすクラス)のオブジェクトを作れば良い.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 52

BELLE Analysis Software Fest 2000

// init Particle class

Ptype dummy("VPHO");

return;

}

event(..)関数. この関数が各イベントの処理をする。各行程を関数にして見通しを良くしている.

void

rec_charm::event(BelleEvent* evptr, int* status){

static int evt = 0;

if(evt%1000==0)

std::cout << "Event# " << evt++ << std::endl;

黙っていると仕事が進んでいるか分からないので、1000 eventに 1回 経過報告させる.

// vector to store Candidate

static std::vector<Particle> d0s(50);

static std::vector<Particle> d0_kaons(50);

static std::vector<Particle> d0_pions(50);

static std::vector<Particle> dstars(50);

static std::vector<Particle> dstar_pions(50);

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 53

BELLE Analysis Software Fest 2000

Candidateをためるための vectorクラスを用意する. 引数の 50は”Vectorと Pointerに絡む問題”から逃げるための苦し紛れの対応. static に 定義したのは 毎回 メモリをアロケートしてると遅くなりそうだから。そのために、毎回クリアする必要がある。

// Clear vector to store Candidate

d0s.clear();

d0_kaons.clear();

d0_kaons.clear();

dstars.clear();

dstar_pions.clear();

D0の Candidateを Reconstructして、d0sに積める. 関数recon d0()の返り値は見つかった Candidateの個数.

// Reconstruction of "D0 ==> K PI"

int num_d0 = recon_d0(d0s, d0_kaons, d0_pions);

集まった D0Candidatesのデータの解析.// Analysis on D0 candidate

analysis_d0(d0s);

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 54

BELLE Analysis Software Fest 2000

もう 1step.集まった D0を Candidates使って D∗−を Reconstructしてdstarsに積める。そして集まった D∗−Candidatesのデータの解析.

// Reconstruction of "D*+ ==> D0 PI+"

int num_dstar = recon_dstar(dstars, dstar_pions, d0s);

// Analysis on D* candidate

analysis_dstar(dstars);

集まった D∗−の数をstatusに返す.こうすれば ”B0 → D∗−l+ν”など解析したいときに便利.

// Pass # of dstar candidate as status

*status = num_dstar;

return;

}

recon d0(...) D0の Reconstruction Routine.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 55

BELLE Analysis Software Fest 2000

// Reconstruction routine of "D0 ==> K PI"

int

rec_charm::recon_d0(std::vector<Particle>& d0s,

std::vector<Particle>& d0_kaons,

std::vector<Particle>& d0_pions){

// D0 mass (PDG value)

const double d0_mass_pdg = 1.8646;

int num = 0; // # of candidate

Mdst_charged_Manager& chg_mgr = Mdst_charged_Manager::get_manager();

Mdst charged の マネージャさんを呼ぶ。これで、Charged Trackの情報が引ける。これからすべきことは, そのイベントの Charged Tracks からできる 異なる 2つの trackの組み合わせに付いて, massを組んで D0のmass regionに入っているかどうかを調べることである。異なる 2つの組合わせを作るには 2重の for loop をつくれば良い。

まず1つ目をとるfor loop

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 56

BELLE Analysis Software Fest 2000

// make pair of charged track

for(std::vector<Mdst_charged>::const_iterator i = chg_mgr.begin();

i != chg_mgr.end();++i){

1つ目の Charged Trackに対応する Particle classのオブジェクトをつくる。Trackingでは粒子の massが決まらないので, K mass と π mass を仮定する. つまり 2つの Track aと bがあったとき、aを K,bを πだと思った場合と逆に aを π,bを Kだと思った場合との 2通りがある。

Particle classに関する詳細は後の講義で。

// Make Particle w/ K mass hypothesis

const char* ki_str = (i->charge()>0)? "K+" : "K-";

Particle K_i(*i, Ptype(ki_str));

// Make Particle w/ PI mass hypothesis

const char* PIi_str = (i->charge()>0)? "PI+" : "PI-";

Particle PI_i(*i, Ptype(PIi_str));

MCの場合には, Generator Information との比較が重要である。get pGenHepevt()関数(後で定義する)は,Charged trackに対応するTable: Gen HEPEVTの entityへのポインタを返す. 返り値が NULL なら

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 57

BELLE Analysis Software Fest 2000

ば Ghost Track.

// Add Generator information to Particle class

if(mc){

const Gen_hepevt* pG = get_pGenHepevt(*i);

if(pG!=NULL){

K_i.relation().genHepevt(*pG);

PI_i.relation().genHepevt(*pG);

}

}

2つ目をとるfor loop. iの次の要素から始めて重複がない組み合わせにする。

for(std::vector<Mdst_charged>::const_iterator j = i+1;

j != chg_mgr.end(); ++j){

// Charge sum must be 0;

if(i->charge()*j->charge()>0) continue;

D0の電荷はゼロなので電荷が同符号のペアにはお引き取り願った。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 58

BELLE Analysis Software Fest 2000

// Make Particle w/ K mass hypothesis

const char* kj_str = (j->charge()>0)? "K+" : "K-";

Particle K_j(*j, Ptype(kj_str));

// Make Particle w/ PI mass hypothesis

const char* PIj_str = (j->charge()>0)? "PI+" : "PI-";

Particle PI_j(*i, Ptype(PIj_str));

// Add Generator information to Particle class

if(mc){

const Gen_hepevt* pG = get_pGenHepevt(*j);

if(pG!=NULL){

K_j.relation().genHepevt(*pG);

PI_j.relation().genHepevt(*pG);

}

}

この時点で 2つの Charged Trackの組み合わせに対応する Particleのobjectが作られた。次にこれらのペアに対して 4元運動量を足して, 不変質量を出す. そのために CLHEP, Class Library for High Energy Physicsで用意されている class HepLorentzVector を用いる。CLHEPに関してはmanがあり、また、

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 59

BELLE Analysis Software Fest 2000

http://wwwinfo.cern.ch/asd/lhc++/clhep/index.htmlにドキュメントがある。Particle classも CLHEPを利用している. 実際メンバ関数p()は class HepLorentzVector を返す.

// Calculate invariant mass of K(i) and PI(j)

HepLorentzVector p4_KiPIj(K_i.p()+PI_j.p());

double d0_mass_KiPIj = p4_KiPIj.mag();

// Calculate invariant mass of K(j) and PI(i)

HepLorentzVector p4_KjPIi(K_j.p()+PI_i.p());

double d0_mass_KjPIi = p4_KjPIi.mag();

ここで、2つmassの仮定のうち D0 mass の world avarageに近い方をセレクト.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 60

BELLE Analysis Software Fest 2000

// Select 1 candidate near to PDG D0 mass

double d0_mass = 0.0;

const Particle* ptr_K = NULL, *ptr_PI = NULL;

const HepLorentzVector* p4_D0 = NULL;

if(fabs(d0_mass_KiPIj-d0_mass_pdg) < fabs(d0_mass_KjPIi-d0_mass_pdg)){

d0_mass = d0_mass_KiPIj;

ptr_K = &K_i;

ptr_PI = &PI_j;

p4_D0 = &p4_KiPIj;

}else{

d0_mass = d0_mass_KjPIi;

ptr_K = &K_j;

ptr_PI = &PI_i;

p4_D0 = &p4_KjPIi;

}

massが 今考えている rangeにないものは却下.

// Check Mass Range

if(d0_mass<d0_mass_lower||

d0_mass>d0_mass_upper) continue;

粒子識別 (PID, Particle IDentification)の情報から

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 61

BELLE Analysis Software Fest 2000

バックグラウンドと考えられるものを廃棄. PIDに関して詳細は後の講義で.// check pid

atc_pid selKpi;

// Kaon Probability

double Kprob_K = selKpi.prob(&(ptr_K->mdstCharged()));

double Kprob_PI = selKpi.prob(&(ptr_PI->mdstCharged()));

if(Kprob_K<0.1||Kprob_PI>0.9) continue;

これまでの関門を潜り抜けたものを D0 Candidateとして認定.Candidateに関する Particle class のオブジェクトを作る。また、K, πのD0の Dautherとして登録する.(std::vector)

const char* d0_str = (ptr_K->charge()<0.0)? "D0" : "D0B";

Particle D0(*p4_D0, Ptype(d0_str));

// Register i and j as dauther_particle

d0_kaons.push_back(*ptr_K);

d0_pions.push_back(*ptr_PI);

D0 Particle のオブジェクトにどの粒子から組んだかという情報を負荷する。その際気をつけないといけないのは,この関数内で定義したオブジェクトは関数が返った後には残っていないので, 別の関数から参照しようと

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 62

BELLE Analysis Software Fest 2000

すると痛い目に合う. したがって、この関数の外側にあるオブジェクトであるd0 kaons, d0 pionsの中にコピーをつくりそちらの情報を付加する必要がある。

// Get Registered daughter particle

Particle& kaon = d0_kaons.back();

Particle& pion = d0_pions.back();

// Append K & PI to D0 child list

D0.relation().append(kaon);

D0.relation().append(pion);

MCの場合には D0Candidateが本物かバッタもんか判定する.// Associate with Generator information

if(mc){

const Gen_hepevt* pG = get_pGenHepevt(D0);

if(pG!=NULL){

D0.relation().genHepevt(*pG);

}

}

最後に Candidateのリストに追加し count する。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 63

BELLE Analysis Software Fest 2000

// Register D0 as a condidate

d0s.push_back(D0);

++num;

} // End of loop (j)

} // End of loop (i)

return num;

};

次にrecon dstar(...).// Reconstruction routine of "D*+ ==> D0 PI+"

int

rec_charm::recon_dstar(std::vector<Particle>& dstars,

std::vector<Particle>& dstar_pions,

std::vector<Particle>& d0s){

Mdst_charged_Manager& chg_mgr = Mdst_charged_Manager::get_manager();

int num = 0; // # of candidate

D0の Reconstruction

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 64

BELLE Analysis Software Fest 2000

を同じくPanther Tableを引く. 今度はD0とCharged Trackのペアを作る.for(std::vector<Particle>::iterator i = d0s.begin();

i != d0s.end();++i){

// Make alias

const Particle& d0 = *i;

Charged Trackが D0の Reconstruction に使われていたらアウト!

(goto文は 2重ループから抜ける場合に使うのはぎりぎりセーフ.)

for(std::vector<Mdst_charged>::const_iterator j = chg_mgr.begin();

j != chg_mgr.end();j++){

// Reject Track which already used in D0 reconstruction

for(int k=0;k<d0.nChildren();++k){

if(!d0.child(k).mdstCharged()||

d0.child(k).mdstCharged().get_ID()==j->get_ID())

goto skip_pi;

}

πの電荷の適当な方を選んで、Particle classのオブジェクトを生成。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 65

BELLE Analysis Software Fest 2000

{

// Select proper charge.

if((d0.lund()==LUND_D0 && j->charge()<0.0)||

(d0.lund()==LUND_D0B && j->charge()>0.0))

continue;

const char* str_pi = (j->charge()>0.0) ? "PI+" : "PI-";

Particle slow_pion(*j, Ptype(str_pi));

if(mc){

const Gen_hepevt* pG = get_pGenHepevt(*j);

if(pG!=NULL){

slow_pion.relation().genHepevt(*pG);

}

}

D∗ の場合, mass の 分布よりも mass difference m(D∗)− m(D0)の方がピークが鋭いので, mass difference の 分布で Cutする。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 66

BELLE Analysis Software Fest 2000

// Calculate Mass difference

HepLorentzVector p4_Dstar(d0.p()+slow_pion.p());

double dmass_Dstar = p4_Dstar.mag()-d0.mass();

// Cut w/ Mass difference

if(dmass_Dstar<dstar_dmass_lower||

dmass_Dstar>dstar_dmass_upper)

continue;

Mass Differenceが Selected region にあるものを Candidate としてParticle classのオブジェクトを作成.

// Make Particle of Candidate

const char* str_dstar = (j->charge()>0.0) ? "D*+" : "D*-";

Particle Dstar(p4_Dstar, Ptype(str_dstar));

// Registar pion as D* daughter candidate

dstar_pions.push_back(slow_pion);

Particle& pion = dstar_pions.back();

Genetator Informationと Daugther Particle の情報を付加して,リストに追加.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 67

BELLE Analysis Software Fest 2000

// Append d0 & pion to Dstar child list

Dstar.relation().append(*i);

Dstar.relation().append(pion);

// Associate with Generator information

if(mc){

const Gen_hepevt* pG = get_pGenHepevt(d0, *j);

if(pG!=NULL){

Dstar.relation().genHepevt(*pG);

}

}

// Register Dstar as a condidate

dstars.push_back(Dstar);

num++;

}

skip_pi:

;

}

}

return num;

}

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 68

BELLE Analysis Software Fest 2000

analysis d0(), analysis dstar(..) Reconstruct された Candidateに対して 各種の情報を引き出し, Histogramや ntupleとしてセーブする.

// Analysis on D0 candidate

void

rec_charm::analysis_d0(std::vector<Particle>& d0s){

for(std::vector<Particle>::const_iterator i = d0s.begin();

i != d0s.end();++i){

const Particle& d0 = *i; // Make alias

const Particle& k = d0.child(0);

const Particle& pi = d0.child(1);

BELLE では Laboratory Frame と Center-of-Mass frameが 違う. 粒子の運動量を CM系に 変換したいことが多い. その様なときは"particle/utility.h"にあるpStar(...)関数が便利。

// Judge candidate is fake or not

int d0_fake = (mc&&!d0.genHepevt()) ? 1 : 0;

// Calculate Momentum in U(4S) rest frame.

// Using pStar function in "particle/utility.h"

HepLorentzVector pstar_d0(pStar(d0));

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 69

BELLE Analysis Software Fest 2000

1D の Hisotogram にデータを追加するには, メンバ関数accumulate(data, weight)を使う.

// Fill Histograms

if(h_d0_mass!=NULL)

h_d0_mass->accumulate(d0.mass(), 1.0);

if(h_d0_pstar!=NULL)

h_d0_pstar->accumulate(pstar_d0.rho(), 1.0);

Ntuple にデータを追加したいときは メンバ関数column("変数名",

data)でデータをセットしてから、メンバ関数dumpData()とすると追加される。column("変数名", data)でデータをセットしてもdumpData()

をしわすれると追加されない。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 70

BELLE Analysis Software Fest 2000

// Fill Ntuple

if(nt_d0!=NULL){

nt_d0->column;

nt_d0->column("lund", d0.lund());

nt_d0->column("mass", d0.mass());

nt_d0->column("fake", d0_fake);

nt_d0->column("p", d0.ptot());

nt_d0->column("pstar", pstar_d0.rho());

nt_d0->dumpData();

}

}

return;

}

D∗の Candidateの情報も同様に Histogram/Ntuple につめる。

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 71

BELLE Analysis Software Fest 2000

// Analysis on D*+ candidate

void

rec_charm::analysis_dstar(std::vector<Particle>& dstars){

for(std::vector<Particle>::const_iterator i = dstars.begin();

i != dstars.end(); ++i){

const Particle& dstar = *i;

const Particle& d0 = dstar.child(0);

const Particle& pi = dstar.child(1);

// Judge candidate is fake or not

int dstar_fake = (mc&&!dstar.genHepevt()) ? 1 : 0;

int d0_fake = (mc&&!d0.genHepevt()) ? 1 : 0;

// Calculate Momentum in U(4S) rest frame.

// Using pStar function in "particle/utility.h"

HepLorentzVector pstar_dstar(pStar(dstar));

HepLorentzVector pstar_pion(pStar(pi));

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 72

BELLE Analysis Software Fest 2000

// Fill Histograms

if(h_dstar_massdiff!=NULL)

h_dstar_massdiff->accumulate(dstar.mass()-d0.mass(), 1.0);

if(h_dstar_mass!=NULL)

h_dstar_mass->accumulate(dstar.mass(), 1.0);

if(h_dstar_pstar!=NULL)

h_dstar_pstar->accumulate(pstar_dstar.rho(), 1.0);

if(h_dstar_pstar_pi!=NULL)

h_dstar_pstar_pi->accumulate(pstar_pion.rho(), 1.0);

2D の Hisotogram にデータを追加するには, メンバ関数accumulate(data1, data2, weight)を使う.この時引数に(float)

にキャストしないとコンパイル時に怒られる.

if(h_dstar_mass_vs_d0_mass!=NULL)

h_dstar_mass_vs_d0_mass->accumulate((float)d0.mass(),

(float)dstar.mass(), (float)1.0);

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 73

BELLE Analysis Software Fest 2000

// Fill Ntuple

if(nt_dstar!=NULL){

nt_dstar->column("lund", dstar.lund());

nt_dstar->column("mass", dstar.mass());

nt_dstar->column("dmass", dstar.mass()-d0.mass());

nt_dstar->column("mass_d0", d0.mass());

nt_dstar->column("fake", dstar_fake);

nt_dstar->column("fake_d0", d0_fake);

nt_dstar->column("p", dstar.ptot());

nt_dstar->column("pstar", pstar_dstar.rho());

nt_dstar->column("pstr_pi", dstar.mass());

nt_dstar->dumpData();

}

}

return;

}

Generator Information を 引く関数:get pGenHepevt(...)

Mdst chargedとGen hepevtの対応表がMdst sim xrefにあるのでそれを調べる.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 74

BELLE Analysis Software Fest 2000

// Function to Access Generator information

const Gen_hepevt*

rec_charm::get_pGenHepevt(const Mdst_charged& chg){

Mdst_sim_xref_Manager & xrefmgr = Mdst_sim_xref_Manager::get_manager();

for(vector<Mdst_sim_xref>::const_iterator i = xrefmgr.begin();

i != xrefmgr.end();i++){

if((i->charged())&&

(i->charged().get_ID() == chg.get_ID())){

const Gen_hepevt& hepevt = i->hepevt();

return &(hepevt);

}

}

return NULL;

}

D0や D∗のような Reconstructed Particle に関しては次のように調べる.

• daughter charged track の Gen hepevtを引く。

対応するGen hepevtが なければ fake.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 75

BELLE Analysis Software Fest 2000

• daughter charged track の Generator Information の motherparticleが一致しているか?

一致していなければ fake.

• daughter charged track の Generator Information の motherparticle は 目的としている Particleと同じ粒子か?

一致していなければ fake.

ただし ,D0 → K∗0π0 → K − π+π0のような Resonanceを経由する崩壊が

あるときには注意が必要.

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 76

BELLE Analysis Software Fest 2000

const Gen_hepevt*

rec_charm::get_pGenHepevt(const Particle& d0){

int mother_ID = -1;

const Gen_hepevt* p_mother = NULL;

for(int i=0;i<d0.nChildren();++i){

const Particle& Pi = d0.child(i);

if((!Pi.genHepevt())|| // Ghost Track

(!Pi.genHepevt().mother())||

(Pi.genHepevt().mother().idhep()!=d0.lund()))

// Not d0 child

return NULL;

if(i==0){

mother_ID = (int)Pi.genHepevt().mother().get_ID();

p_mother = &(Pi.genHepevt().mother());

}else if(mother_ID!=(int)Pi.genHepevt().mother().get_ID())

return NULL;

}

return p_mother;

}

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 77

BELLE Analysis Software Fest 2000

const Gen_hepevt*

rec_charm::get_pGenHepevt(const Particle& d0,

const Mdst_charged& pion){

const Gen_hepevt* pGpi = get_pGenHepevt(pion);

const int lund = (pion.charge()>0.0) ? LUND_DSTAR_PLUS : LUND_DSTAR_MINUS;

if(pGpi==NULL) return 0; // Ghost Track

if((!d0.genHepevt())||

(!d0.genHepevt().mother())||

(!pGpi->mother())||

(pGpi->mother().get_ID()!=d0.genHepevt().mother().get_ID())||

(pGpi->mother().idhep()!=lund))

return NULL;

return &(pGpi->mother());

}

これで code は 出来上がりました。これをコンパイルする前にMakefile

を修正する必要があります。解析プログラム中でParticle classやatc pid classを使ったので,対応するライブラリをリンクする必要があるからです。

$MY TOP DIR/src/rec charm/basf if/Makefile.link options.in

Apr, 21, 2000 1st example of Analysis/13

BELLE

$fMY TOP DIRg/src/rec charm event.cc 78

BELLE Analysis Software Fest 2000

BELLE_LIBS = -l$(PACKAGE)

の行に Particle class をリンクする設定を足す。BELLE_LIBS = -l$(PACKAGE) -lparticle -lqqutil -lkid -leid -lhelix

もう一度configure & make するとモジュールが完成する.これを走らせるにはmodule registar qq98

path add_module main rec_charm

initialize

histogram define charmmeson.hbook

process_event data-file 0

terminate

という内容のbasf.script

% basf < basf.script |& tee basf.log

とすれば, つつがなく実行される (致命的バグが無ければ...). できあがったcharmmeson.hbookをあとの講義ででてくる PAWを使ってプロットすると結果がでる。

Apr, 21, 2000 1st example of Analysis/13

BELLE

Result 79

BELLE Analysis Software Fest 2000

Result

Sample Plot

0

200

400

600

800

1000

1200

1400

1.84 1.845 1.85 1.855 1.86 1.865 1.87 1.875 1.88 1.885 1.89

D0 invariant massD0 invariant mass[GeV/c2]

[ent

ries

/ 0.

001G

eV/c

2 ]

Figure 3: Example of 1d plot

Sample Plot

0

100

200

300

400

500

600

700

0.14 0.142 0.144 0.146 0.148 0.15 0.152 0.154

D*+-D0 mass differenceD*+-D0 mass difference[GeV/c2]

[ent

ries

/ 0.

0003

GeV

/c2 ]

Figure 4: Example of 1d plot

Apr, 21, 2000 1st example of Analysis/14

BELLE

Result 80

BELLE Analysis Software Fest 2000

Sample Plot

1.841.8451.851.8551.861.8651.871.8751.881.8851.891.99

1.9952

2.0052.01

2.0152.02

2.0252.03

0

20

40

60

80

100

120

140

D0 invariant mass vs. D*+-D0 mass difference

D 0 mass [GeV/c 2]

D*+ -D

0 [GeV

/c2 ][e

ntri

es /

(0.0

01G

eV/c

2 x 0

.000

8GeV

/c2 )]

Figure 5: Example of 2d plot

Sample Plot

0

100

200

300

400

500

600

700

1.84 1.85 1.86 1.87 1.88 1.89

D0 invariant massD0 invariant mass[GeV/c2]

[ent

ries

/ 0.

0005

GeV

/c2 ]

Figure 6: Example of plot w/ ntu-ple

Apr, 21, 2000 1st example of Analysis/15