36 ClassImp(RooBCPEffDecay);
41 RooBCPEffDecay::RooBCPEffDecay(
const char *name,
const char *title,
42 RooRealVar& t, RooAbsCategory& tag,
43 RooAbsReal& tau, RooAbsReal& dm,
44 RooAbsReal& avgMistag, RooAbsReal& CPeigenval,
45 RooAbsReal& a, RooAbsReal& b,
46 RooAbsReal& effRatio, RooAbsReal& delMistag,
47 const RooResolutionModel& model, DecayType type) :
48 RooAbsAnaConvPdf(name,title,model,t),
49 _absLambda(
"absLambda",
"Absolute value of lambda",this,a),
50 _argLambda(
"argLambda",
"Arg(Lambda)",this,b),
51 _effRatio(
"effRatio",
"B0/B0bar efficiency ratio",this,effRatio),
52 _CPeigenval(
"CPeigenval",
"CP eigen value",this,CPeigenval),
53 _avgMistag(
"avgMistag",
"Average mistag rate",this,avgMistag),
54 _delMistag(
"delMistag",
"Delta mistag rate",this,delMistag),
55 _t(
"t",
"time",this,t),
56 _tau(
"tau",
"decay time",this,tau),
57 _dm(
"dm",
"mixing frequency",this,dm),
58 _tag(
"tag",
"CP state",this,tag),
64 _basisExp = declareBasis(
"exp(-@0/@1)",RooArgList(tau,dm)) ;
65 _basisSin = declareBasis(
"exp(-@0/@1)*sin(@0*@2)",RooArgList(tau,dm)) ;
66 _basisCos = declareBasis(
"exp(-@0/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
69 _basisExp = declareBasis(
"exp(@0)/@1)",RooArgList(tau,dm)) ;
70 _basisSin = declareBasis(
"exp(@0/@1)*sin(@0*@2)",RooArgList(tau,dm)) ;
71 _basisCos = declareBasis(
"exp(@0/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
74 _basisExp = declareBasis(
"exp(-abs(@0)/@1)",RooArgList(tau,dm)) ;
75 _basisSin = declareBasis(
"exp(-abs(@0)/@1)*sin(@0*@2)",RooArgList(tau,dm)) ;
76 _basisCos = declareBasis(
"exp(-abs(@0)/@1)*cos(@0*@2)",RooArgList(tau,dm)) ;
84 RooBCPEffDecay::RooBCPEffDecay(
const RooBCPEffDecay& other,
const char* name) :
85 RooAbsAnaConvPdf(other,name),
86 _absLambda(
"absLambda",this,other._absLambda),
87 _argLambda(
"argLambda",this,other._argLambda),
88 _effRatio(
"effRatio",this,other._effRatio),
89 _CPeigenval(
"CPeigenval",this,other._CPeigenval),
90 _avgMistag(
"avgMistag",this,other._avgMistag),
91 _delMistag(
"delMistag",this,other._delMistag),
92 _t(
"t",this,other._t),
93 _tau(
"tau",this,other._tau),
94 _dm(
"dm",this,other._dm),
95 _tag(
"tag",this,other._tag),
96 _genB0Frac(other._genB0Frac),
98 _basisExp(other._basisExp),
99 _basisSin(other._basisSin),
100 _basisCos(other._basisCos)
107 RooBCPEffDecay::~RooBCPEffDecay()
117 Double_t RooBCPEffDecay::coefficient(Int_t basisIndex)
const
119 if (basisIndex==_basisExp) {
121 return (1 - _tag*_delMistag)*(1+_absLambda*_absLambda)/2 ;
125 if (basisIndex==_basisSin) {
127 return -1*_tag*(1-2*_avgMistag)*_CPeigenval*_absLambda*_argLambda ;
131 if (basisIndex==_basisCos) {
133 return -1*_tag*(1-2*_avgMistag)*(1-_absLambda*_absLambda)/2 ;
142 Int_t RooBCPEffDecay::getCoefAnalyticalIntegral(Int_t , RooArgSet& allVars, RooArgSet& analVars,
const char* rangeName)
const
144 if (rangeName)
return 0 ;
146 if (matchArgs(allVars,analVars,_tag))
return 1 ;
152 Double_t RooBCPEffDecay::coefAnalyticalIntegral(Int_t basisIndex, Int_t code,
const char* )
const
156 case 0:
return coefficient(basisIndex) ;
160 if (basisIndex==_basisExp) {
161 return (1+_absLambda*_absLambda) ;
164 if (basisIndex==_basisSin || basisIndex==_basisCos) {
178 Int_t RooBCPEffDecay::getGenerator(
const RooArgSet& directVars, RooArgSet &generateVars, Bool_t staticInitOK)
const
181 if (matchArgs(directVars,generateVars,_t,_tag))
return 2 ;
183 if (matchArgs(directVars,generateVars,_t))
return 1 ;
189 void RooBCPEffDecay::initGenerator(Int_t code)
193 Double_t sumInt = RooRealIntegral(
"sumInt",
"sum integral",*
this,RooArgSet(_t.arg(),_tag.arg())).getVal() ;
195 Double_t b0Int = RooRealIntegral(
"mixInt",
"mix integral",*
this,RooArgSet(_t.arg())).getVal() ;
196 _genB0Frac = b0Int/sumInt ;
204 void RooBCPEffDecay::generateEvent(Int_t code)
207 Double_t rand = RooRandom::uniform() ;
208 _tag = (rand<=_genB0Frac) ? 1 : -1 ;
213 Double_t rand = RooRandom::uniform() ;
218 tval = -_tau*log(rand);
221 tval= +_tau*log(rand);
224 tval = (rand<=0.5) ? -_tau*log(2*rand) : +_tau*log(2*(rand-0.5)) ;
229 Double_t maxDil = 1.0 ;
230 Double_t al2 = _absLambda*_absLambda ;
231 Double_t maxAcceptProb = (1+al2) + fabs(maxDil*_CPeigenval*_absLambda*_argLambda) + fabs(maxDil*(1-al2)/2);
232 Double_t acceptProb = (1+al2)/2*(1-_tag*_delMistag)
233 - (_tag*(1-2*_avgMistag))*(_CPeigenval*_absLambda*_argLambda)*sin(_dm*tval)
234 - (_tag*(1-2*_avgMistag))*(1-al2)/2*cos(_dm*tval);
236 Bool_t accept = maxAcceptProb*RooRandom::uniform() < acceptProb ? kTRUE : kFALSE ;
238 if (tval<_t.max() && tval>_t.min() && accept) {