36 ClassImp(RooBMixDecay);
41 RooBMixDecay::RooBMixDecay(
const char *name,
const char *title,
42 RooRealVar& t, RooAbsCategory& mixState,
43 RooAbsCategory& tagFlav,
44 RooAbsReal& tau, RooAbsReal& dm,
45 RooAbsReal& mistag, RooAbsReal& delMistag,
46 const RooResolutionModel& model,
48 RooAbsAnaConvPdf(name,title,model,t),
50 _mistag(
"mistag",
"Mistag rate",this,mistag),
51 _delMistag(
"delMistag",
"Delta mistag rate",this,delMistag),
52 _mixState(
"mixState",
"Mixing state",this,mixState),
53 _tagFlav(
"tagFlav",
"Flavour of tagged B0",this,tagFlav),
54 _tau(
"tau",
"Mixing life time",this,tau),
55 _dm(
"dm",
"Mixing frequency",this,dm),
56 _t(
"_t",
"time",this,t), _genMixFrac(0)
60 _basisExp = declareBasis(
"exp(-@0/@1)",RooArgList(tau,dm)) ;
61 _basisCos = declareBasis(
"exp(-@0/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
64 _basisExp = declareBasis(
"exp(@0/@1)",RooArgList(tau,dm)) ;
65 _basisCos = declareBasis(
"exp(@0/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
68 _basisExp = declareBasis(
"exp(-abs(@0)/@1)",RooArgList(tau,dm)) ;
69 _basisCos = declareBasis(
"exp(-abs(@0)/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
77 RooBMixDecay::RooBMixDecay(
const RooBMixDecay& other,
const char* name) :
78 RooAbsAnaConvPdf(other,name),
80 _mistag(
"mistag",this,other._mistag),
81 _delMistag(
"delMistag",this,other._delMistag),
82 _mixState(
"mixState",this,other._mixState),
83 _tagFlav(
"tagFlav",this,other._tagFlav),
84 _tau(
"tau",this,other._tau),
85 _dm(
"dm",this,other._dm),
86 _t(
"t",this,other._t),
87 _basisExp(other._basisExp),
88 _basisCos(other._basisCos),
89 _genMixFrac(other._genMixFrac),
90 _genFlavFrac(other._genFlavFrac),
91 _genFlavFracMix(other._genFlavFracMix),
92 _genFlavFracUnmix(other._genFlavFracUnmix)
99 RooBMixDecay::~RooBMixDecay()
106 Double_t RooBMixDecay::coefficient(Int_t basisIndex)
const
108 if (basisIndex==_basisExp) {
109 return (1 - _tagFlav*_delMistag) ;
112 if (basisIndex==_basisCos) {
113 return _mixState*(1-2*_mistag) ;
122 Int_t RooBMixDecay::getCoefAnalyticalIntegral(Int_t , RooArgSet& allVars, RooArgSet& analVars,
const char* rangeName)
const
128 if (matchArgs(allVars,analVars,_mixState,_tagFlav))
return 3 ;
129 if (matchArgs(allVars,analVars,_mixState))
return 2 ;
130 if (matchArgs(allVars,analVars,_tagFlav))
return 1 ;
136 Double_t RooBMixDecay::coefAnalyticalIntegral(Int_t basisIndex, Int_t code,
const char* )
const
140 case 0:
return coefficient(basisIndex) ;
144 if (basisIndex==_basisExp) {
147 if (basisIndex==_basisCos) {
154 if (basisIndex==_basisExp) {
155 return 2.0*coefficient(basisIndex) ;
157 if (basisIndex==_basisCos) {
164 if (basisIndex==_basisExp) {
167 if (basisIndex==_basisCos) {
168 return 2.0*coefficient(basisIndex) ;
181 Int_t RooBMixDecay::getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK)
const
184 if (matchArgs(directVars,generateVars,_t,_mixState,_tagFlav))
return 4 ;
185 if (matchArgs(directVars,generateVars,_t,_mixState))
return 3 ;
186 if (matchArgs(directVars,generateVars,_t,_tagFlav))
return 2 ;
189 if (matchArgs(directVars,generateVars,_t))
return 1 ;
195 void RooBMixDecay::initGenerator(Int_t code)
201 Double_t sumInt = RooRealIntegral(
"sumInt",
"sum integral",*
this,RooArgSet(_t.arg(),_tagFlav.arg())).getVal() ;
203 Double_t flavInt = RooRealIntegral(
"flavInt",
"flav integral",*
this,RooArgSet(_t.arg())).getVal() ;
204 _genFlavFrac = flavInt/sumInt ;
210 Double_t sumInt = RooRealIntegral(
"sumInt",
"sum integral",*
this,RooArgSet(_t.arg(),_mixState.arg())).getVal() ;
212 Double_t mixInt = RooRealIntegral(
"mixInt",
"mix integral",*
this,RooArgSet(_t.arg())).getVal() ;
213 _genMixFrac = mixInt/sumInt ;
219 Double_t sumInt = RooRealIntegral(
"sumInt",
"sum integral",*
this,RooArgSet(_t.arg(),_mixState.arg(),_tagFlav.arg())).getVal() ;
221 Double_t mixInt = RooRealIntegral(
"mixInt",
"mix integral",*
this,RooArgSet(_t.arg(),_tagFlav.arg())).getVal() ;
222 _genMixFrac = mixInt/sumInt ;
225 RooRealIntegral dtInt(
"mixInt",
"mix integral",*
this,RooArgSet(_t.arg())) ;
228 _genFlavFracMix = dtInt.getVal() / mixInt ;
231 _genFlavFracUnmix = dtInt.getVal() / (sumInt - mixInt) ;
240 void RooBMixDecay::generateEvent(Int_t code)
245 Double_t rand = RooRandom::uniform() ;
246 _tagFlav = (Int_t) ((rand<=_genFlavFrac) ? 1 : -1) ;
251 Double_t rand = RooRandom::uniform() ;
252 _mixState = (Int_t) ((rand<=_genMixFrac) ? -1 : 1) ;
257 Double_t rand = RooRandom::uniform() ;
258 _mixState = (Int_t) ((rand<=_genMixFrac) ? -1 : 1) ;
260 rand = RooRandom::uniform() ;
261 Double_t genFlavFrac = (_mixState==-1) ? _genFlavFracMix : _genFlavFracUnmix ;
262 _tagFlav = (Int_t) ((rand<=genFlavFrac) ? 1 : -1) ;
269 Double_t rand = RooRandom::uniform() ;
274 tval = -_tau*log(rand);
277 tval= +_tau*log(rand);
280 tval = (rand<=0.5) ? -_tau*log(2*rand) : +_tau*log(2*(rand-0.5)) ;
285 Double_t dil = 1-2.*_mistag ;
286 Double_t maxAcceptProb = 1 + TMath::Abs(_delMistag) + TMath::Abs(dil) ;
287 Double_t acceptProb = (1-_tagFlav*_delMistag) + _mixState*dil*cos(_dm*tval);
288 Bool_t mixAccept = maxAcceptProb*RooRandom::uniform() < acceptProb ? kTRUE : kFALSE ;
290 if (tval<_t.max() && tval>_t.min() && mixAccept) {