Hướng dẫn sử dụng macro xử lý phổ bằng ROOT

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 18

Hng dn s dng macro x l ph bng ROOT

ng Nguyn Phng
dnphuong1984@gmail.com
Ngy 24 thng 11 nm 2014

M u

Trong thi gian gn y ti c nhn c mt s cu hi lin quan n vic x l cc ph tia X


v gamma, c th l v cc vn c fie ph, xc nh nh, lm khp, tch cc nh ph bng
ROOT. tr li cho cc cu hi ny, ti vit mt ti liu Hng dn c bn x l ph
gamma bng ROOT (http://goo.gl/05IUcp) tuy nhin c v nh n vn cn qu n gin
so vi nhu cu tht s ca cc bn.
V l do ti vit mt macro nh x l mt s ph n gin nh cc ph gamma, nhiu
x tia X, Raman,... C th xem macro ny l nh mt v d trc quan gip cc bn hiu c cc
bc tin hnh x l mt ph n gin. Cc bn c th s dng macro phc v cho cng vic
x l ph ca mnh hoc xem n nh l mt v d mu t xy dng nn chng trnh ring ca
mnh. Cc cch thc x l s liu trong macro ny tuy khng phi l nhng cch x l tt nht
nhng hi vng chng s gip cho cc bn c ci nhn r rng v c th hn v nhng g mnh cn
lm khi tin hnh x l ph bng ROOT.
Ti cng xin gi li cm n n anh Trn Duy Tp v bn Nguyn Ngc Hn (sinh vin lp
VLHNK11) v cho php ti s dng ph tn x tia X ca mnh lm v d cho ti liu hng
dn ny, c bit l bn Nguyn Ngc Hn c nhng trao i truyn cm hng cho ti to ra
macro ny.

Ti liu cn c

Trong trng hp cc bn ch cn s dng macro m khng cn quan tm n ni dung ca n,


cc bn c th b qua phn ny. Tuy nhin, nu cc bn mun hiu c cc thc vit chng
trnh thc hin cc x l hay hiu c cc hng dn trong ti liu ny, cc bn cn c mt
s kin thc nht nh v ROOT cng nh ngn ng lp trnh C++.
Nhng kin thc ny c th thu c thng qua bt c ti liu no cc bn c th tm thy (sch
bo, tp ch, mng internet,...) hoc cc bn cng c th tm c trong nhng ti liu m ti
vit trc
Hng dn s dng ROOT cho h iu hnh Windows (http://goo.gl/olLp5o).
Ngn ng lp trnh C++ (chun 2011) (http://goo.gl/ng8KyS).

Chc nng chnh ca macro

Macro x l s liu c tn l Spectrum_analysis, bao gm cc chc nng chnh nh sau


c ph gamma, tia X v Raman.
Tm nh v c lng phng nn thng qua vic s dng cc phng thc ca lp TSpectrum
trong ROOT.
1

ng Nguyn Phng

Ti liu ni b NMTP

Lm khp cc nh dng Gauss, Lorentz v Voigt vi phng nn tuyn tnh v exponential.

3.1

c ph

Macro Spectrum_analysis hin ti c th c c cc loi ph di y


Ph tn x tia X ca vt liu ethylene tetrafluoroethylene (ETFE) c cung cp bi anh
Trn Duy Tp.
Ph gamma v tia X c ghi nhn bi phn mm Genie2K ca hng Canberra (c ui
.TKA).
Ph gamma v tia X c ghi nhn bi cc phn mm ca hng Amptek (c ui .MCA).
Ph nhiu x tia X v Raman ca c s d liu RRUFF (http://rruff.info/).
Hnh 1 trnh by mt s hnh v ca cc ph c c v v bng macro Spectrum_analysis.

(a) Ph tn x tia X ca ETFE

(b) Ph

(c) Ph Raman ca Alum(K) t RRUFF

60

Co ca Amptek

(d) Ph phng nn HPGe ca Genie2K

Hnh 1: Mt s v d ph c c v v bng macro Spectrum_analysis

3.2

Tm nh

Vi macro Spectrum_analysis, cc ph c c s c lu li di dng cc histogram. Vic tm


nh ph c thc hin thng qua phng thc TSpectrum::Search trong ROOT vi cc tham
s do ngi dng t a vo. Hnh 2 trnh by kt qu ca vic tm nh ph, cc nh ph c
tm thy s c nh du bi cc hnh tam gic mu . Ngoi ra hm tm nh ph cng tr v
cho chng ta mt mng cha kt qu cc v tr nh ph tm c chng ta c th s dng cho
cc phn tch tip theo.

ng Nguyn Phng

Ti liu ni b NMTP

(a) Kt qu tm nh ca ph phng nn HPGe

(b) Kt qu tm nh ca ph nhiu x tia X

Hnh 2: Mt s v d tm nh ca macro Spectrum_analysis, cc v tr nh c nh du bng


nhng tam gic mu

3.3

c lng v tr phng nn

Cng tng t nh vi tm nh, vic c lng phng nn lin tc c thc hin thng qua
phng thc TSpectrum::Background. Hnh 3 trnh by vic c lng phng nn lin tc vi (a)
ph Raman v (b) ph phng nn phng x HPGe, vi ng mu th hin phng nn c
lng c. Cc hnh (c) v (d) l cc ph Raman v phng nn phng x sau khi tr i phng
nn lin tc.

(a) Ph Raman trc khi tr phng nn

(b) Ph phng HPGe trc khi tr phng nn

(c) Ph Raman sau khi tr phng nn

(d) Ph phng HPGe sau khi tr phng nn

Hnh 3: Mt s v d c lng phng nn lin tc bng macro Spectrum_analysis trong hnh (a)
v (b); tr phng nn trong hnh (c) v (d)

ng Nguyn Phng

3.4

Ti liu ni b NMTP

Lm khp, tch nh

Macro Spectrum_analysis cho php lm khp d liu thu c vi mt s dng nh (Hnh 4)


Gauss



(x x0 )2
G(x) = A exp
2 2

Lorentz
L(x) =

1
1
2
(x x0 )2 + ( 12 )2

Voigt (l tch chp ca hai hm Gauss v Lorentz)


V (x) = L(x) + (1 ) G(x)

Hnh 4: So snh cc hm Gauss, Lorentz va Voigt


Cn i vi phng nn th hin ti macro ch c hai dng phng nn l
Tuyn tnh
lin(x) = a + b x
Exponential

exp(x) = ea+bx

Hnh 5 trnh by kt qu lm khp s liu vi hai nh Gauss v phng nn tyn tnh cho cc ph
tn x tia X v ph gamma ca ngun 60 Co.

(a) Kt qu lm khp ca ph tn x tia X

(b) Kt qu lm khp ca ph

60

Co

Hnh 5: Mt s v d lm khp nh Gauss v phng nn tuyn tnh ca macro Spectrum_analysis


cho ph tn x tia X v ph 60 Co

ng Nguyn Phng

Ti liu ni b NMTP

Cch s dng macro

Phn ny s hng dn cc bn cch thc chy macro Spectrum_analysis.


s dng c macro x l ph, trc tin ta cn phi ci t ROOT vo my, cch thc ci t
c hng dn trong ti liu Hng dn s dng ROOT cho h iu hnh Windows nn ti s
khng nhc ti na. Sau khi ci t xong ROOT, cc bn c th ti file Spectrum_analysis.tar
ti http://goo.gl/wxkwJe.
Sau khi ti v gii nn file, ta thu c th mc Spectrum_analysis gm c cc file sau
Spectrum_analysis.cxx l file macro x l ph.
Cc file GraftedETFE.txt, AlumK_Broad_Scan_Raman.rruff, Alloclasite_Powder_Xray.rruff,
Co60_76B76.mca v phong.tka l cc file s liu ph cho ph tn x tia X (ETFE), ph Raman (Alum-K), ph nhiu x tia X (Alloclasite), ph 60 Co (Amptek) v ph phng phng x
gamma (Genie2K).
Cc file run.(....).bat l cc batch file chy macro trong mi trng thng dch CINT vi
cc file ph c tn tng ng.
ChangeLog.txt l file lu tr cc thng tin sa i, cp nht ca macro.
thc thi macro, cc bn c th s dng mt trong hai cch sau
Cch 1 cch thc thng thng, cc bn m ng dng Command Prompt (Windows) hay Terminal (Linux), di chuyn n th mc mc Spectrum_analysis v g lnh
> root -l
v sau chy macro t du nhc root
root [0] . x Sp ectrum_an alysis . cxx
Hoc ta c th vit cng trn 1 dng lnh
> root -l Sp ectrum_a nalysis . cxx
Nu mun truyn i s cho macro, ta vit
> root -l ' Spect rum_anal ysis . cxx (" GraftedETFE . txt " , " ETFE ") '
vi i s u tin l tn ca file ph, i s th hai l kiu file (vit hoa).
Hin ti macro Spectrum_analysis.cxx ch c c mt s kiu nh dng ph nh c lit k
trn. Tuy nhin cc bn c th vit thm cho mnh cc hm dc d liu ph khc ph hp vi
kiu nh dng ph m mnh ang x l.
Cch 2 s dng cc batch file1 (ch cho h iu hnh Windows), trong trng hp ny l cc file
c dng
run.<tn file>.<nh dng>.bat
Trong <tn file> l tn ca file ph (khng c ui m rng) v <nh dng> l nh dng ca
file ph m ta mun c.
i vi cc batch file, cc bn ch n gin l nhp i chut (double click ) vo file v macro s
t ng c thc thi. Nu cc bn mun c cc file ph khc, ch cn nhp chut phi, chn
1

Cch thc to batch file s c cp n trong mt ti liu khc.

ng Nguyn Phng

Ti liu ni b NMTP

Rename v i tn ca batch file li cho tng ng vi tn v nh dng ca file ph, chng trnh
s t ng cp nht v thc thi file ph .
Gi s nh ta c mt file ph Genie2K c tn l Spectrum.txt. c file ph ny, ta c th i
tn file run.GraftedETFE.ETFE.bat li thnh run.Spectrum.TKA.bat, chng trnh s tm file c
tn tng ng (trong cng th mc) v c file theo nh dng nh ta khai bo.
Hnh 6 cho ta mt v d v giao din xut hin khi chy mt batch file.

Hnh 6: V d chy file run.AlumK_Broad_Scan_Raman.RRUFF.bat

Cc thc x l ph vi macro

Trong phn ny ti s hng dn cc bn cch thc x l ph vi macro Spectrum_analysis, ti s


c gng trnh by tng bc mt cng vi nhng gii thch chi tit km theo. ng thi ti cng
s dng phong cch lp trnh th tc thay v lp trnh hng i tng tin cho vic gii thch.
Hi vng l khng qu kh theo di i vi cc bn, bi v y l phn quan trng nu cc bn
mun s dng macro ny x l ph hoc vit mt chng trnh tng ng.

5.1

Hm chnh ca macro

u tin chng ta s tm hiu cch thc thit lp cc x l ph cho macro. Trong phn ny chng
ta s lm quen vi hm chnh ca macro, hm ny s c tn trng vi tn file macro m trong
trng hp ny l Spectrum_analysis.
Cc bn m file macro v tm n hm Spectrum_analsyis(), cc bn s thy hm ny c ni dung
nh sau
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
Main function
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int Spectrum_ana lysis ( TString filename = " GraftedETFE . txt " , TString
filetype = " ETFE " , bool showplot = false )
{
................................
................................
................................
}
6

ng Nguyn Phng

Ti liu ni b NMTP

Hm Spectrum_analsyis() c tt c 3 i s
i s th nht c kiu TString khai bo tn ca file ph, y l i s quan trng nht
(tt nhin, lm sao chng ta c th x l ph nu khng bit l ph no), gi tr bn phi
ca du = l gi tr mc nh c gn cho i s nu khng c gi tr no c truyn
TString filename = " GraftedETFE . txt "
i s th hai cng c kiu TString, khai bo nh dng ca file ph cn c, hin ti macro
c sn 4 nh dng ph l ph tn x ETFE (k hiu "ETFE"), ph Genie2K (k hiu "TKA"),
ph Amptek (k hiu "MCA") v ph ca c s d liu RRUFF (k hiu "RRUFF")
TString filetype = " ETFE "
i s th ba c kiu bool ch nhn mt trong hai gi tr true hoc false (hay 1 hoc 0),
i s ny c nhim v bt tt ch hin th hnh v th khi thc thi macro (chng ta
s ni sau)
bool showplot = false
By gi chng ta s i vo ni dung u tin ca macro
/* ******** Thiet lap ******** */
if (! showplot ) gROOT - > SetBatch ( true ) ;
setPlotStyle () ;
/* ******** Thong tin ******** */
info () ;
Dng lnh u tin dng iu khin bt tt ch hin th th khi chy chng trnh thng
qua i s showplot m ta ni trn. i s ny c mc nh gi tr false tc l hnh
v th s khng xut hin khi thc thi macro (chng ta s xut hnh v ra thng file). Vic thit
lp ch hin th hnh v ca ROOT c thc hin thng qua bin ton cc gROOT
if (! showplot ) gROOT - > SetBatch ( true ) ;
(nu gi tr truyn cho SetBatch() l true th chng trnh s c thc hin ch batch mode
tc l khng hin th hnh v, ngoi ra ta cng c th thit lp ch ny thng qua ty chnh -b
khi chy root).
Hai lnh tip theo
setPlotStyle () ;
v
info () ;
s gi cc hm thit lp kiu v v in ra thng tin ca macro (nhng ni dung nm trong hm
info()).
Phn c d liu ca ph

l khi lnh di y

/* ******* Doc du lieu ******* */


TH1F * h ;
int errcode ;
switch ( hash_types ( filetype ) ) {
case ETFE :
errcode = read_ETFE ( filename , h ) ;
7

ng Nguyn Phng

break ;
case TKA :
errcode =
break ;
case MCA :
errcode =
break ;
case RRUFF :
errcode =
break ;
default :
std :: cerr
errcode =

Ti liu ni b NMTP

read_TKA ( filename , h ) ;

read_MCA ( filename , h ) ;

read_RRUFF ( filename , h ) ;

<< " Error : Undefined file type " << std :: endl ;
1;

}
if ( errcode ) return errcode ;
Trong chng ta s so snh kiu nh dng filetype vi cc kiu c sn trong macro v gi cc
hm c d liu tng ng (read_ETFE(), read_TKA(), read_MCA() hay read_RRUFF()), trong
trng hp khng c kiu nh dng no ph hp, chng trnh s xut ra cu bo li
std :: cerr << " Error : Undefined file type " << std :: endl ;
y cc bn cn lu mt iu l gi tr so snh ca chng ta khng phi l cc chui, bi v
theo c php C++ chun lnh switch ... case ... khng so snh cc chui2 . Tuy nhin trong
trng hp ny cc bn li c th so snh chui bi v khi thc thi macro chng ta s dng trnh
thng dch CINT ch khng phi trnh bin dch C++, v trnh thng dch CINT chp nhn vic
so snh chui. Mt cch khc so snh chui l cc bn c th s dng chui cc cu lnh iu
kin if ... else if ... else if ... else ... so snh.
Mc d vy y ti li khng mun so snh chui m mun th mt cch khc, trong trng hp
ny l to ra mt kiu d liu lit k thng qua t kha enum, u im ca cch ny l s trnh
c vic phi so snh chui nhng vn c th s dng c switch ... case ... trong hm
chnh so snh cc nh dng v gi hm c ph hp.
Nu cc bn nhn ln pha trn ca hm Spectrum_analsyis(), cc bn s thy mt on code
sau
enum types { ETFE , TKA , MCA , RRUFF , NONE };
types hash_types ( TString type )
{
if ( type == " ETFE " ) return ETFE ;
if ( type == " TKA " )
return TKA ;
if ( type == " MCA " )
return MCA ;
if ( type == " RRUFF " ) return RRUFF ;
return NONE ;
}
y chng ta to ra mt kiu d liu mi l types c 5 gi tr l ETFE, TKA, MCA, RRUFF,
NONE, c k hiu trng vi gi tr ca chui nh dng. Sau l mt hm hash_types(TString)
nhn vo gi tr ca chui, thc hin so snh v tr v kiu d liu types tng ng. Chng ta s
s dng d liu kiu types ny thc hin so snh vi switch ... case ...
2

Kiu chui khng phi l kiu d liu c bn ca C++

ng Nguyn Phng

Ti liu ni b NMTP

switch ( hash_types ( filetype ) ) {


case ETFE :
. . .
case TKA :
. . .
case MCA :
. . .
case RRUFF :
. . .
default :
. . .
}
Cc bn thy y, vi vic s dng enum chng ta c th trnh vic phi vi phm c php chun
C++ m vn to ra cho ngi c cm gic l ang so snh chui3 . Ngoi ra, thay v s dng
hm hash_types(), ta cng c th s dng std::map to ra mt cp gi tr (TString, types)
vi cng dng tng ng.
Mt iu na l trong on code c ph cc bn s thy xut hin mt bin errcode, bin ny
c nhim v nhn gi tr tr v t cc hm c d liu, nu c li xy ra trong qu trnh c, cc
hm ny s tr v mt s nguyn khc 0 (trong trng hp ny l 1). Nu gi tr tr v l mt s
nguyn khc 0, lnh return s c thc hin v kt thc chng trnh m khng cn phi thc
thi cc lnh theo sau .
Nu qu trnh c d liu thnh cng, khng c li xy ra, d liu c c s cha trong histogram
h.
X l histogram Chng ta s n phn tip theo l x l histogram h ny, cc lnh x l nm
trong khi di y
// std :: cout << " Making plots : " << std :: endl ;
// setRange (h , 17 , 26) ;
// draw ( h ) ;
// std :: cout << " Finding peaks : " << std :: endl ;
// float * peak_pos = peakFinding (h , 10 , 0.05) ;
// draw ( h ) ;
// std :: cout << " Estimating background : " << std :: endl ;
// TH1F * bkg = bkgEstimation (h , 80 , " B a c k In c r e a s i n g W i n d o w ") ;
// draw (h , bkg ) ;
// h = bkgSubtraction (h , bkg ) ;
// draw ( h ) ;
// std :: cout << " Fitting peaks : " << std :: endl ;
// peakFitting (h , 16 , 22) ;
multipeakFitting (h , 2 , 2600 , 3800) ;
// multipeakFitting (h , 1 , 6100 , 6200) ;
y l phn m cc bn c th chnh sa phc v cho nhu cu x l ca mnh nh tm nh,
c lng phng nn, lm khp nh,... Cc bn ng ngc nhin rng v sao c nhiu dng lnh
3

Cc bn cng c th s dng cch thc tng t vi cc s nguyn v bin hng thay v to mt kiu d liu
mi.

ng Nguyn Phng

Ti liu ni b NMTP

c comment (n i) trong phn ny, bn c th uncomment bt c dng lnh no v th xem


kt qu ca chng trnh s nh th no i vi nhng dng lnh .
u tin l hm v histogram
draw ( h ) ;
Rt n gin, ch cn truyn histogram cho hm l xong. Tuy nhin c mt iu cc bn nn bit
l chng ta c ti 3 hm draw()
void draw ( TH1F * h )
void draw ( TH1F *h , TH1F * h1 )
void draw ( TH1F *h , TF1 ** func , int N )
i vi cc bn ch quen s dng C, hn s rt ngc nhin khi ti khai bo c ba hm u c cng
tn vi nhau. y l mt tnh nng ch c trong C++ ch khng c trong C, l kh nng np
chng (hay cn gi l ti nh ngha) hm, cc hm hon ton c th c cng mt tn, min l
khc nhau v s lng hoc kiu i s truyn vo v tr v. Trnh bin dch (hoc thng dch)
s quyt nh hm no c gi da vo cc tham s m chng ta truyn cho hm, trong trng
hp ny ti ch truyn duy nht hisotgram h nn hm u tin s c gi. iu ny s c li cho
chng ta, ch cn nh duy nht 1 tn thay v phi nh nhiu tn ca cc hm v th khc nhau
(vic nh i s cng mt ri!!).
Kt qu v th s khng hin ra trn mn hnh ca chng ta m s c lu vo file nh c ui
.png trong cng th mc vi macro ca chng ta.
Trong trng hp chng ta khng mun v ton ph th c th s dng hm
void setRange ( TH1F * h , float min , float max )
thit lp khong v (min,max) trc khi gi hm draw().
Vic tm nh v c lng phng nn s c thc hin thng qua cc hm
float * peakFinding ( TH1F *h , float sigma = 2 , float threshold = 0.2)
TH1F * bkgEstimation ( TH1F *h , int Niter =50 , TString option = "
BackIn c r e a si n g W i n d o w " )
ngha ca cc tham s sigma, threshold, Niter v option c gii thch trong ti liu
Hng dn c bn x l ph gamma bng ROOT nn ti s lt qua phn ny. Trong qu trnh
tm nh hay c lng phng nn, cc bn hon ton c th t do thay i gi tr cc tham s v
chn ra b tham s ph hp nht ng vi tng trng hp c th.
Khi c lng c phng nn, hm bkgEstimation() s tr v mt histogram cha phng nn
c c lng, chng ta c th s dng histogram ny thc hin vic tr phng nn lin
tc
TH1F * bkg = bkgEstimation (h , 80 , " B a c k I n cr e a s i n g W i n d o w " ) ; // uoc
luong phong nen
draw (h , bkg ) ; // ve phong nen cung voi pho
h = bkgSubtraction (h , bkg ) ; // tru phong nen va gan tro lai cho pho
draw ( h ) ; // ve pho sau khi da tru phong nen
i vi lm khp nh, chng ta c hai hm
TF1 * peakFitting ( TH1F *h , float min , float max )
TF1 ** multipeakFitting ( TH1F *h , const int N , float min , float max )

10

ng Nguyn Phng

Ti liu ni b NMTP

Trong hm peakFitting() l hm lm khp n gin, ch s dng mt nh Gauss v phng


nn tuyn tnh hoc exponential, hm ny s dng cc nh ngha hm c sn trong ROOT lm
khp. Trong trng hp cc bn mun lm khp nhiu nh hay lm khp vi cc dng phn b
khc, cc bn nn s dng hm multipeakFitting().
Di y l mt v d ni dung tiu biu cho hm Spectrum_analysis()
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
Main function
*/
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int Spectrum_ana lysis ( TString filename = " GraftedETFE . txt " , TString
filetype = " ETFE " , bool showplot = false )
{
/* ******** Thiet lap ******** */
if (! showplot ) gROOT - > SetBatch ( true ) ;
setPlotStyle () ;
/* ******** Thong tin ******** */
info () ;
/* ******* Doc du lieu ******* */
TH1F * h ;
int errcode ;
switch ( hash_types ( filetype ) ) {
case ETFE :
errcode = read_ETFE ( filename , h ) ;
break ;
case TKA :
errcode = read_TKA ( filename , h ) ;
break ;
case MCA :
errcode = read_MCA ( filename , h ) ;
break ;
case RRUFF :
errcode = read_RRUFF ( filename , h ) ;
break ;
default :
std :: cerr << " Error : Undefined file type " << std :: endl ;
errcode = 1;
}
if ( errcode ) return errcode ;
/* ***** Xu ly histogram ***** */
std :: cout << " Making plots : " << std :: endl ;
draw ( h ) ;
std :: cout << " Finding peaks : " << std :: endl ;
float * peak_pos = peakFinding (h , 20 , 0.2) ;
draw ( h ) ;

11

ng Nguyn Phng

Ti liu ni b NMTP

std :: cout << " Estimating background : " << std :: endl ;
TH1F * bkg = bkgEstimation (h , 5 , " B a c k I n c re a s i n g W i n d o w " ) ;
draw (h , bkg ) ;
std :: cout << " Fitting peaks : " << std :: endl ;
multipeakFitting (h , 2 , 10 , 25) ;
return 0;
}

5.2

Hm lm khp nhiu nh ph

Trong phn ny ti s ni k hn v hm multipeakFitting(), cc cch thc thit lp gi tr tham


s ban u cng nh truyn tham s sau khi lm khp.
thun tin cho vic hng dn, ti sp xp hm ny ngay sau hm Spectrum_analysis()
TF1 ** multipeakFitting ( TH1F *h , const int N , float min , float max )
{
................................
}
u tin, chng ta hy xem xt cc i s ca hm ny: i s u tin l histogram h m ta s
dng cho vic lm khp, i s th hai l s lng cc nh N m ta d nh s lm khp v hai
i s cng cng l khong lm khp (min,max).
lm khp vi histogram, trc tin chng ta cn phi xy dng xy dng cc hm m t nh
v phng nn. m t phn b nh, ti to ra 3 hm
// Gaussian Peak function
double gaussianPeak ( double *x , double * par )
{
return par [0]* TMath :: Gaus ( x [0] , par [1] , par [2]) ;
}
// Lorenzian Peak function
double lorentzianPeak ( double *x , double * par )
{
return par [0]/ TMath :: Max ( 1. e -10 ,( x [0] - par [2]) *( x [0] - par [2]) +
.25* par [1]* par [1] ) ;
}
// Voigt Peak function
double voigtPeak ( double *x , double * par )
{
return par [0]* TMath :: Voigt ( x [0] - par [1] , par [2] , par [3]) ;
}
Nhim v ca cc hm ny l tnh v tr v gi tr tng ng vi cc gi tr ca x v tham s
par[] c truyn vo.
y chng ta truyn cc i s l cc con tr, nh cc bn bit, cc con tr ny s cha a
ch ca cc phn t u tin ca mt mng (c ch s l 0), cc phn t tip theo cng s nm
trong cc a ch tip theo phn t u tin ny. Do nu ta truyn a ch ca phn t u
12

ng Nguyn Phng

Ti liu ni b NMTP

tin cng ng ngha vi vic truyn a ch ca mng, cc phn t tip theo c th d dng suy
ra c. Trong trng hp ca x, n ch c mt gi tr nn ta s s dng phn t u tin x[0]
trong tnh ton.
Cc hm m t phng nn cng c nh ngha theo cch thc tng t
// Exponential Background function
double exponential ( double *x , double * par )
{
return TMath :: Exp ( par [0] + par [1]* x [0]) ;
}
// Linear Background function
double linear ( double *x , double * par )
{
return par [0] + par [1]* x [0];
}
Sau khi c cc hm m t nh v phng nn, ta s tip tc xy dng nh tng cu hai hm
ny, y chnh l hm m ta s s dng lm khp, trong trng hp ny ti xin ly v d hm
Gauss m t nh v hm tuyn tnh m t phng nn, ta c hm tng nh sau
// Gaussian Peaks + Background
double gaussianF ( double *x , double * par )
{
double f ;
f = linear (x ,& par [1]) ;
for ( int i = 1; i <= par [0]; ++ i ) {
f += gaussianPeak (x ,& par [ i *3]) ;
}
return f ;
}
Bin f s lu tr v tr v gi tr tnh c. Mc ch ca hm tng gaussianF() khi c xy
dng l phc v cho vic lm khp nhiu hm do ta phi tnh ton sao cho hm ny c
xy dng mt cch uyn chuyn, gi tr f c th tnh c vi s lng hm nh Gauss thay i
(khng nht thit l ch mt hm Gauss). bit c s lng nh Gauss cn lm khp, ta cn
phi truyn thng tin vo hm gaussianF(). C nhiu cch thc hin vic ny, y ti s
s dng ngay chnh mng tham s par c truyn cho hm, c th l phn t u tin par[0] s
mang thng tin v s lng nh Gauss cn lm khp. Nh vy chng ta s s dng phn t tham
s t par[1] tr i.
u tin gi tr ca f s c gn cho gi tr ca phng tuyn tnh
f = linear (x ,& par [1]) ;
Do chng ta s dng phn t u tin cha thng tin v s lng nh nn hm linear(
x,par) s s dng t par[1] tr i, c php &par[1] s gn a ch phn t th hai ca mng
par[] thuc hm gaussianF() cho a ch ca phn t u tin (par[0]) trong hm linear()4 .
Sau chng ta s cng dn cc gi tr ca cc nh Gauss vo bin f trc khi tr gi tr ny v
cho hm
for ( int i = 1; i <= par [0]; ++ i ) {
4

C v hi rc ri nhng s d dng hn nu cc bn t tn cho i s par ca cc hm khc i, v d nh


parGaussF cho hm gaussianF(), parLin cho hm linear().

13

ng Nguyn Phng

Ti liu ni b NMTP

f += gaussianPeak (x ,& par [ i *3]) ;


}
return f ;
Nh cc bn thy, bin i s lp t 1 n par[0] vi par[0] chnh l tham s cha s lng cc
nh Gauss m ta cn lm khp.
Nu cc bn s thy cc hm Gauss c gi vi tham s par[i*3], l do l v chng ta s
dng 3 tham s u tin, 1 cho s lng cc nh (par[0]) v hai cho hm phng nn tuyn tnh
(par[1], par[2]), ng thi mi hm Gauss cng s dng 3 tham s. Nh vy hm Gauss th i
s s dng tham s t par[i*3] tr i.
Sau khi xy dng xong hm tng, chng ta s quay tr li hm multipeakFitting() v bt
u khai bo cc hm
TF1 ** multipeakFitting ( TH1F *h , const int N , float min , float max )
{
TF1 * f = new TF1 ( " f " , gaussianF , min , max , 3*( N +1) ) ;
f - > SetTitle ( " Total " ) ;
TF1 * bkg = new TF1 ( " bkg " , linear , min , max , 2) ;
bkg - > SetTitle ( " Background " ) ;
}
y chng ta khai bo hai i tng (object) thuc lp TF1 l f (hm tng) s dng hm ni
dung ca hm gaussianF() m ta nh ngha trc , v bkg s dng hm linear(). Hai
tham s min v max quy nh khong gi tr s dng hm, i tng f c tt c 3*(N+1) tham
s (1 cho s lng nh, 2 cho phng nn tuyn tnh v 3N cho N hm Gauss). Cc phng thc
TF1::SetTitle() s thit lp tiu cho cc i tng f v bkg, m chng ta s s dng cc tiu
ny trong phn ch gii khi v th phn sau.
Tip theo chng ta s tin hnh thit lp cc gi tr ban u v lm khp
TF1 ** multipeakFitting ( TH1F *h , const int N , float min , float max )
{
TF1 * f = new TF1 ( " f " , gaussianF , min , max , 3*( N +1) ) ;
f - > SetTitle ( " Total " ) ;
TF1 * bkg = new TF1 ( " bkg " , linear , min , max , 2) ;
bkg - > SetTitle ( " Background " ) ;
h - > GetXaxis () -> SetRangeUser ( min , max ) ;
f - > FixParameter (0 , N ) ;
// f - > SetParLimits (2 , -2 ,2) ;
for ( int i =1; i <= N ; ++ i ) {
f - > SetParameter ( i *3 ,h - > GetMaximum () /2) ;
f - > SetParameter ( i *3+1 ,( max + min ) /2) ;
f - > SetParameter ( i *3+2 ,( max - min ) /6) ;
}
h - > Fit ( " f " , " r0 " ) ;
}
Dng lnh
h - > GetXaxis () -> SetRangeUser ( min , max ) ;
s thit lp khong gi tr hin th cho histogram phc v cho mc ch v th sau ny.
14

ng Nguyn Phng

Ti liu ni b NMTP

Nu cc bn nh li, chng ta mun s dng par[0] truyn thng tin v s nh Gauss cn lm


khp cho hm gaussianF(), lm c iu ny chng ta cn thit lp gi tr c nh tham s
ny
f - > FixParameter (0 , N ) ;
vi phng thc TF1::FixParameter(), gi tr ca tham s s c nh trong sut qu trnh lm
khp. Trong cu lnh trn ti thit lp gi tr c nh cho par[0] l N, nh vy tham s par[0]
ch mang duy nht gi tr ny trong sut qu trnh lm khp v chng ta s yn tm l thng tin
v s nh s khng thay i.
Chng ta c th thit lp cc gi tr u tin cho tham s thng qua phng thc TF1::SetParameter
() v gii hn khong gi tr ca tham s thng qua phng thc TF1::SetParLimits()
for ( int i =1; i <= N ; ++ i ) {
f - > SetParameter ( i *3 ,h - > GetMaximum () /2) ;
f - > SetParameter ( i *3+1 ,( max + min ) /2) ;
f - > SetParameter ( i *3+2 ,( max - min ) /6) ;
}
Trong on code ny, vng l[ for s lp qua ton cc nh Gauss v thit lp gi tr ban u
cho cc tham s tng ng vi cao nh (i*3), v tr nh (i*3+1) v rng nh (i*3+2). Cc
gi tr u vo nh trong on code ch l cc v d, khng phi l cc gi tr ti u nht. Khi
thc hin vic lm khp hm, cc bn cn phi iu chnh cc gi tr ny sao cho ph hp vi tn
trng hp c th. Chng hn nh nu trc khi lm khp chng ta thc hin vic tm nh,
chng ta c th truyn cc v tr nh tm c vo trong hm multipeakFitting() v s dng
chng nh nhng gi tr ban u cho vic lm khp.
Sau khi hon thnh xong cc bc chun b, chng ta sn sng cho vic lm khp. thc
hin vic ny, chng ta n gin ch g
h - > Fit ( " f " , " r0 " ) ;
Chng trnh s lm khp histogram h theo hm f, ty chn "r" y dng bo cho chng
trnh rng vic lm khp ch tin hnh trn khong m hm c gii hn (trong trng hp ny
l t min n max), ty chn "0" bo cho chng trnh khng hin th hm lm khp cng vi
histogram khi v hnh, chng ta s thc hin vic v hnh sau.
Cui cng, phn vic cn li l thm on code ly cc tham s c lm khp v v kt qu
TF1 ** multipeakFitting ( TH1F *h , const int N , float min , float max )
{
TF1 * f = new TF1 ( " f " , gaussianF , min , max , 3*( N +1) ) ;
f - > SetTitle ( " Total " ) ;
TF1 * bkg = new TF1 ( " bkg " , linear , min , max , 2) ;
bkg - > SetTitle ( " Background " ) ;
h - > GetXaxis () -> SetRangeUser ( min , max ) ;
f - > FixParameter (0 , N ) ;
// f - > SetParLimits (2 , -2 ,2) ;
for ( int i =1; i <= N ; ++ i ) {
f - > SetParameter ( i *3 ,h - > GetMaximum () /2) ;
f - > SetParameter ( i *3+1 ,( max + min ) /2) ;
f - > SetParameter ( i *3+2 ,( max - min ) /6) ;
}
h - > Fit ( " f " , " r0 " ) ;
15

ng Nguyn Phng

Ti liu ni b NMTP

double pars [3*( N +1) ];


TF1 * func [ N +2];
f - > GetParameters ( pars ) ;
func [0] = f ;
bkg - > SetParameters (& pars [1]) ;
func [1] = bkg ;
for ( int i =0; i < N ; ++ i ) {
TString str ;
str . Form ( " Peak % d " ,i +1) ;
TF1 * peak = new TF1 ( " peak " , gaussianPeak , min , max , 3) ;
peak - > SetTitle ( str ) ;
peak - > SetParameters (& pars [( i +1) *3]) ;
func [ i +2] = peak ;
}
draw (h , func , N ) ;
return func ;
}
ly c cc tham s sau khi lm khp ta khai bo mt mng pars[] v lu cc tham s vo
mng ny thng qua phng thc TF1::GetParameters()
double pars [3*( N +1) ];
f - > GetParameters ( pars ) ;
Chng ta cng to thm 1 mng func[] lu tr tt c cc hm sau khi lm khp, v phn t
u tin ca mng ny chnh l f
TF1 * func [ N +2];
func [0] = f ;
Phn t th hai s l bkg, nhng i tng bkg y cha c tham s c th cho nn ta cn phi
truyn tham s vo bkg trc khi a vo mng func[] (nu cc bn vn cn nh th tham s ca
phng nn bt u t phn t th hai, tc l par[1])
bkg - > SetParameters (& pars [1]) ;
func [1] = bkg ;
Cc hm nh Gauss cng ln lt c a vo trong mng func[]
for ( int i =0; i < N ; ++ i ) {
TString str ;
str . Form ( " Peak % d " ,i +1) ;
TF1 * peak = new TF1 ( " peak " , gaussianPeak , min , max , 3) ;
peak - > SetTitle ( str ) ;
peak - > SetParameters (& pars [( i +1) *3]) ;
func [ i +2] = peak ;
}
Cui cng l ta gi hm draw() v th v tr mng func[] v cho hm
draw (h , func , N ) ;
return func ;

16

ng Nguyn Phng

5.3

Ti liu ni b NMTP

Hm v th

Chng ta c tt c 3 hm draw() nhng y ti ch xin trnh by v hm va c gi bi


multipeakFitting()
void draw ( TH1F *h , TF1 ** func , int N )
{
................................
}
Hm ny c 3 i s, i s th nht l histogram, th hai l mng func[] cha cc hm mi
c lm khp v i s th ba l s lng cc nh. L do s dng i s th ba l ta khng
c phng thc trc tip ta bit c kch thc ca mng func[], cng chnh l s nh m
ta lm khp. Nu trong C++ ta c th s dng mt s cch bit c chng hn nh dng
sizeof() hay s dng std::vector<TF1*> thay cho vic s dng mng, tuy nhin trnh thng
dch CINT c mt s gii hn ca n nn cch nhanh gn nht l truyn thng gi tr N.
bt u cho vic v th, chng ta cn tin hnh mt s thit lp, u tin l to canvas
void draw ( TH1F *h , TF1 ** func , int N )
{
/* ***** Ve histogram ***** */
std :: cout << " ... Drawing histograms '" << h - > GetName () << " ' and
fitted functions " << std :: endl ;
TCanvas * canvas = new TCanvas () ;
canvas - > cd () ;
}
Sau l chn ra mt s mu ng nht v (cc bn c th tham kho cc gi tr mu trong
ti liu Hng dn s dng ROOT cho h iu hnh Windows)
void draw ( TH1F *h , TF1 ** func , int N )
{
/* ***** Ve histogram ***** */
std :: cout << " ... Drawing histograms '" << h - > GetName () << " ' and
fitted functions " << std :: endl ;
TCanvas * canvas = new TCanvas () ;
canvas - > cd () ;
int colors [9];
colors [0] = 2; colors [1] = 4; colors [2] = 6; colors [3] = 7; colors
[4] = 8;
colors [5] = 9; colors [6] = 32; colors [7] = 40; colors [8] = 46;
}
Thit lp cc gi tr cho trc ta v v histogram
void draw ( TH1F *h , TF1 ** func , int N )
{
/* ***** Ve histogram ***** */
std :: cout << " ... Drawing histograms '" << h - > GetName () << " ' and
fitted functions " << std :: endl ;
TCanvas * canvas = new TCanvas () ;
canvas - > cd () ;

17

ng Nguyn Phng

Ti liu ni b NMTP

int colors [9];


colors [0] = 2; colors [1] = 4; colors [2] = 6; colors [3] = 7; colors
[4] = 8;
colors [5] = 9; colors [6] = 32; colors [7] = 40; colors [8] = 46;
h - > GetYaxis () -> SetRangeUser (0 ,h - > GetMaximum () *1.2) ;
h - > GetXaxis () -> SetTitle (h - > GetTitle () ) ;
h - > GetYaxis () -> SetTitle ( " Counts " ) ;
h - > GetXaxis () -> SetTitleSize ( gStyle - > GetTitleSize ( " x " ) ) ;
h - > GetYaxis () -> SetTitleSize ( gStyle - > GetTitleSize ( " x " ) ) ;
h - > DrawCopy ( " p " ) ;
}
V cc hm mi c lm khp (lu s dng ty chn "same" v trn cng canvas vi
histogram)
for ( int i = 0; i < N +2; ++ i ) {
func [ i ] - > SetLineColor ( colors [ i ]) ;
func [ i ] - > DrawCopy ( " same " ) ;
}
Thm bng ch gii bng cch to mt i tng thuc lp TLegend
/* **** Bang chu giai ***** */
TLegend * leg = new TLegend (0.75 , 0.75 , 0.9 , 0.9) ;
leg - > SetBorderSize (0) ;
leg - > SetTextSize ( gStyle - > GetTitleSize ( " x " ) *0.7) ;
leg - > SetFillColor (0) ;
for ( int i = 0; i < N +2; ++ i ) {
leg - > AddEntry ( func [ i ] , func [ i ] - > GetTitle () , " L " ) ;
}
leg - > Draw () ;
V cui cng l lu li cavas sau khi v xong ra file c hu t l "_fit" v phn m rng l ".png"
/* ***** Luu hinh ve ***** */
TString name = h - > GetName () ;
name . Append ( " _fit . png " ) ;
std :: cout << " ... Saving plot as '" << name << " '" << std :: endl ;
canvas - > SaveAs ( name ) ;
Cc bn c th chnh li cc thit lp v hnh cng nh tn file c lu li ty theo nhu cu ring.

Li kt

Mc d cn mt s hm vn cha c cp n trong ti liu ny nhng ti ngh rng hy


nhng hm nh l nhng iu b n ang ch cc bn tip tc khm ph . Tt c nhng iu
ti trnh by y ch l nhng kin thc c bn, li khuyn cho cc bn l hy tm hiu su hn
v nhng vn ny vn dng mt cch ph hp vo trong cng vic ca mnh, ng ngh rng
macro ny c th x l c tt c cc ph m cc bn gp phi. y ch l s khi u, l nn
tng cc bn c th t xy dng nn cc chng trnh x l s liu ca mnh.
Chc cc bn thnh cng!
18

You might also like