65 ClassImp(RooStats::PdfProposal);
67 using namespace RooFit;
68 using namespace RooStats;
75 PdfProposal::PdfProposal() : ProposalFunction()
88 PdfProposal::PdfProposal(RooAbsPdf& pdf) : ProposalFunction()
100 Bool_t PdfProposal::Equals(RooArgSet& x1, RooArgSet& x2)
103 TIterator* it = x1.createIterator();
105 while ((r = (RooRealVar*)it->Next()) != NULL)
106 if (r->getVal() != x2.getRealValue(r->GetName())) {
119 void PdfProposal::Propose(RooArgSet& xPrime, RooArgSet& x)
121 if (fLastX.getSize() == 0) {
125 RooStats::SetParameters(&x, &fMaster);
126 if (fMap.size() > 0) {
127 for (fIt = fMap.begin(); fIt != fMap.end(); fIt++)
128 fIt->first->setVal(fIt->second->getVal(&x));
130 fCache = fPdf->generate(xPrime, fCacheSize);
133 Bool_t moved =
false;
134 if (fMap.size() > 0) {
135 moved = !Equals(fLastX, x);
143 RooStats::SetParameters(&x, &fMaster);
145 for (fIt = fMap.begin(); fIt != fMap.end(); fIt++)
146 fIt->first->setVal(fIt->second->getVal(&x));
149 RooStats::SetParameters(&x, &fLastX);
154 if (moved || fCachePosition >= fCacheSize) {
156 fCache = fPdf->generate(xPrime, fCacheSize);
160 const RooArgSet* proposal = fCache->get(fCachePosition);
162 RooStats::SetParameters(proposal, &xPrime);
170 Bool_t PdfProposal::IsSymmetric(RooArgSet& , RooArgSet& )
180 Double_t PdfProposal::GetProposalDensity(RooArgSet& x1, RooArgSet& x2)
182 RooStats::SetParameters(&x2, &fMaster);
183 for (fIt = fMap.begin(); fIt != fMap.end(); fIt++)
184 fIt->first->setVal(fIt->second->getVal(&x2));
185 RooArgSet* temp = fPdf->getObservables(x1);
186 RooStats::SetParameters(&x1, temp);
188 return fPdf->getVal(&x1);
200 void PdfProposal::AddMapping(RooRealVar& proposalParam, RooAbsReal& update)
202 fMaster.add(*update.getParameters((RooAbsData*)NULL));
203 if (update.getParameters((RooAbsData*)NULL)->getSize() == 0)
205 fMap.insert(pair<RooRealVar*, RooAbsReal*>(&proposalParam, &update));