74 ClassImp(RooResolutionModel);
80 RooResolutionModel::RooResolutionModel(
const char *name,
const char *title, RooRealVar& _x) :
81 RooAbsPdf(name,title),
82 x(
"x",
"Dependent or convolution variable",this,_x),
83 _basisCode(0), _basis(0),
94 RooResolutionModel::RooResolutionModel(
const RooResolutionModel& other,
const char* name) :
95 RooAbsPdf(other,name),
97 _basisCode(other._basisCode), _basis(0),
101 _basis = (RooFormulaVar*) other._basis->Clone() ;
107 TIterator* bsIter = _basis->serverIterator() ;
108 RooAbsArg* basisServer ;
109 while((basisServer = (RooAbsArg*)bsIter->Next())) {
110 addServer(*basisServer,kTRUE,kFALSE) ;
121 RooResolutionModel::~RooResolutionModel()
123 if (_ownBasis && _basis) {
133 RooFormulaVar* RooResolutionModel::identity()
135 static RooFormulaVar identity(
"identity",
"1",RooArgSet(
""));
151 RooResolutionModel* RooResolutionModel::convolution(RooFormulaVar* inBasis, RooAbsArg* owner)
const
154 if (inBasis->getParameter(0) != x.absArg()) {
155 coutE(InputArguments) <<
"RooResolutionModel::convolution(" << GetName() <<
"," <<
this
156 <<
") convolution parameter of basis function and PDF don't match" << endl
157 <<
"basis->findServer(0) = " << inBasis->findServer(0) << endl
158 <<
"x.absArg() = " << x.absArg() << endl ;
162 if (basisCode(inBasis->GetTitle())==0) {
163 coutE(InputArguments) <<
"RooResolutionModel::convolution(" << GetName() <<
"," <<
this
164 <<
") basis function '" << inBasis->GetTitle() <<
"' is not supported." << endl ;
168 TString newName(GetName()) ;
169 newName.Append(
"_conv_") ;
170 newName.Append(inBasis->GetName()) ;
171 newName.Append(
"_[") ;
172 newName.Append(owner->GetName()) ;
173 newName.Append(
"]") ;
175 RooResolutionModel* conv = (RooResolutionModel*) clone(newName) ;
177 TString newTitle(conv->GetTitle()) ;
178 newTitle.Append(
" convoluted with basis function ") ;
179 newTitle.Append(inBasis->GetName()) ;
180 conv->SetTitle(newTitle.Data()) ;
182 conv->changeBasis(inBasis) ;
193 void RooResolutionModel::changeBasis(RooFormulaVar* inBasis)
197 TIterator* bsIter = _basis->serverIterator() ;
198 RooAbsArg* basisServer ;
199 while((basisServer = (RooAbsArg*)bsIter->Next())) {
200 removeServer(*basisServer) ;
213 TIterator* bsIter = _basis->serverIterator() ;
214 RooAbsArg* basisServer ;
215 while((basisServer = (RooAbsArg*)bsIter->Next())) {
216 addServer(*basisServer,kTRUE,kFALSE) ;
221 _basisCode = inBasis?basisCode(inBasis->GetTitle()):0 ;
230 const RooRealVar& RooResolutionModel::basisConvVar()
const
233 TIterator* sIter = basis().serverIterator() ;
234 RooRealVar* var = (RooRealVar*) sIter->Next() ;
245 RooRealVar& RooResolutionModel::convVar()
const
247 return (RooRealVar&) x.arg() ;
257 Double_t RooResolutionModel::getValV(
const RooArgSet* nset)
const
259 if (!_basis)
return RooAbsPdf::getValV(nset) ;
262 if (isValueDirty()) {
263 _value = evaluate() ;
266 if (_verboseDirty) cxcoutD(Tracing) <<
"RooResolutionModel(" << GetName() <<
") value = " << _value << endl ;
281 Bool_t RooResolutionModel::redirectServersHook(
const RooAbsCollection& newServerList, Bool_t mustReplaceAll, Bool_t nameChange, Bool_t )
288 RooFormulaVar* newBasis = (RooFormulaVar*) newServerList.find(_basis->GetName()) ;
299 _basis->redirectServers(newServerList,mustReplaceAll,nameChange) ;
301 return (mustReplaceAll && !newBasis) ;
320 void RooResolutionModel::normLeafServerList(RooArgSet& list)
const
322 _norm->leafNodeServerList(&list) ;
330 Double_t RooResolutionModel::getNorm(
const RooArgSet* nset)
const
336 syncNormalization(nset,kFALSE) ;
337 if (_verboseEval>1) cxcoutD(Tracing) << IsA()->GetName() <<
"::getNorm(" << GetName()
338 <<
"): norm(" << _norm <<
") = " << _norm->getVal() << endl ;
340 Double_t ret = _norm->getVal() ;
353 void RooResolutionModel::printMultiline(ostream& os, Int_t content, Bool_t verbose, TString indent)
const
355 RooAbsPdf::printMultiline(os,content,verbose,indent) ;
358 os << indent <<
"--- RooResolutionModel ---" << endl;
359 os << indent <<
"basis function = " ;
361 _basis->printStream(os,kName|kAddress|kTitle,kSingleLine,indent) ;
363 os <<
"<none>" << endl ;