184 bool useWeights,
bool cloneData,
const char* newName,
196 for (
const auto arg : yieldsList) {
198 coutE(InputArguments) <<
"SPlot::SPlot(" <<
GetName() <<
") input argument "
199 << arg->GetName() <<
" is not of type RooRealVar (or RooLinearVar)."
200 <<
"\nRooStats must be able to set it to 0 and to 1 to probe the PDF." << std::endl ;
201 throw std::invalid_argument(
Form(
"SPlot::SPlot(%s) input argument %s is not of type RooRealVar/RooLinearVar",
GetName(),arg->GetName())) ;
209 this->
AddSWeight(pdf, yieldsList, projDeps, useWeights, arg5, arg6, arg7, arg8);
237 if(numEvent >
fSData->numEntries() )
239 coutE(InputArguments) <<
"Invalid Entry Number" << std::endl;
245 coutE(InputArguments) <<
"Invalid Entry Number" << std::endl;
249 double totalYield = 0;
251 std::string varname(sVariable);
273 coutE(InputArguments) <<
"InputVariable not in list of sWeighted variables" << std::endl;
286 if(numEvent >
fSData->numEntries() )
288 coutE(InputArguments) <<
"Invalid Entry Number" << std::endl;
294 coutE(InputArguments) <<
"Invalid Entry Number" << std::endl;
300 double eventSWeight = 0;
304 for (
Int_t i = 0; i < numSWeightVars; i++)
318 double totalYield = 0;
320 std::string varname(sVariable);
347 coutE(InputArguments) <<
"InputVariable not in list of sWeighted variables" << std::endl;
411 for (
auto const *yield : yieldsTmp) {
412 if (discrimVars->find(yield->GetName()) || yield->dependsOn(*discrimVars)) {
413 coutE(InputArguments) <<
"SPlot::AddSWeight(" <<
GetName() <<
") the yield variable \"" << yield->GetName()
414 <<
"\" is also a discriminating variable used in the fit, "
415 <<
"or depends on one. The sPlot formalism requires the yield parameters to be "
416 <<
"independent of the discriminating observables. The resulting sWeights would "
417 <<
"be invalid. Please remove this variable from either the fit observables or "
418 <<
"from the list of yields." << std::endl;
419 throw std::invalid_argument(
Form(
"SPlot::AddSWeight(%s) yield variable \"%s\" is also used "
420 "as a discriminating variable in the fit.",
428 for (
unsigned int i=0; i < constParameters->size(); ++i) {
430 auto& par = *(*constParameters)[i];
431 if (std::any_of(yieldsTmp.
begin(), yieldsTmp.
end(), [&](
const RooAbsArg* yield){ return yield->dependsOn(par); })) {
432 constParameters->remove(par,
true,
true);
440 std::vector<RooAbsRealLValue*> constVarHolder;
442 for(std::size_t i = 0; i < constParameters->size(); i++)
448 constVarHolder.push_back(varTemp);
458 vars.
remove(projDeps,
true,
true);
461 std::vector<double> yieldsHolder;
463 yieldsHolder.reserve(yieldsTmp.
size());
464 for(std::size_t i = 0; i < yieldsTmp.
size(); i++) {
469 std::unique_ptr<RooArgList> yieldsSnapshot{
static_cast<RooArgList *
>(yieldsTmp.
snapshot(
false))};
473 coutI(InputArguments) <<
"Printing Yields" << std::endl;
479 std::vector<RooAbsRealLValue*> yieldvars ;
483 std::vector<double> yieldvalues ;
484 for (
Int_t k = 0; k < nspec; ++k) {
485 auto thisyield =
static_cast<const RooAbsReal*
>(yields.
at(k)) ;
490 coutI(InputArguments)<<
"yield in pdf: " << yieldinpdf->GetName() <<
" " << thisyield->getVal(&vars) << std::endl;
492 yieldvars.push_back(yieldinpdf) ;
493 yieldvalues.push_back(thisyield->getVal(&vars)) ;
508 if (theVar->getMin() > 0) {
509 coutE(InputArguments) <<
"Yield variables need to have a range that includes at least [0, 1]. Minimum for "
510 << theVar->GetName() <<
" is " << theVar->getMin() << std::endl;
512 coutE(InputArguments) <<
"Setting min range to 0" << std::endl;
515 throw std::invalid_argument(std::string(
"Yield variable ") + theVar->GetName() +
" must have a range that includes 0.");
519 if (theVar->getMax() < 1) {
520 coutW(InputArguments) <<
"Yield variables need to have a range that includes at least [0, 1]. Maximum for "
521 << theVar->GetName() <<
" is " << theVar->getMax() << std::endl;
523 coutE(InputArguments) <<
"Setting max range to 1" << std::endl;
526 throw std::invalid_argument(std::string(
"Yield variable ") + theVar->GetName() +
" must have a range that includes 1.");
538 std::unique_ptr<RooArgSet> pdfvars{pdf->
getVariables()};
539 std::vector<std::vector<double> > pdfvalues(numevents,std::vector<double>(nspec,0)) ;
541 for (
Int_t ievt = 0; ievt <numevents; ievt++)
545 pdfvars->assign(*
fSData->get(ievt));
547 for(
Int_t k = 0; k < nspec; ++k) {
553 double f_k = pdf->
getVal(&vars) ;
554 pdfvalues[ievt][k] = f_k ;
555 if( !(f_k>1 || f_k<1) )
556 coutW(InputArguments) <<
"Strange pdf value: " << ievt <<
" " << k <<
" " << f_k << std::endl ;
557 theVar->setVal( 0 ) ;
562 std::vector<double> norm(nspec,0) ;
563 for (
Int_t ievt = 0; ievt <numevents ; ievt++)
566 for(
Int_t k=0; k<nspec; ++k) dnorm += yieldvalues[k] * pdfvalues[ievt][k] ;
567 for(
Int_t j=0; j<nspec; ++j) norm[j] += pdfvalues[ievt][j]/dnorm ;
570 coutI(Contents) <<
"likelihood norms: " ;
572 for(
Int_t k=0; k<nspec; ++k)
coutI(Contents) << norm[k] <<
" " ;
573 coutI(Contents) << std::endl ;
577 for (
Int_t i = 0; i < nspec; i++)
for (
Int_t j = 0; j < nspec; j++) covInv(i,j) = 0;
579 coutI(Contents) <<
"Calculating covariance matrix";
583 for (
Int_t ievt = 0; ievt < numevents; ++ievt)
593 for(
Int_t k = 0; k < nspec; ++k)
594 dsum += pdfvalues[ievt][k] * yieldvalues[k] ;
597 for(
Int_t j=0; j<nspec; ++j)
599 if (includeWeights) {
600 covInv(
n, j) +=
fSData->weight() * pdfvalues[ievt][
n] * pdfvalues[ievt][j] / (dsum * dsum);
602 covInv(
n, j) += pdfvalues[ievt][
n] * pdfvalues[ievt][j] / (dsum * dsum);
616 coutE(Eval) <<
"SPlot Error: covariance matrix is singular; I can't invert it!" << std::endl;
625 coutI(Eval) <<
"Checking Likelihood normalization: " << std::endl;
626 coutI(Eval) <<
"Yield of specie Sum of Row in Matrix Norm" << std::endl;
627 for(
Int_t k=0; k<nspec; ++k)
630 for(
Int_t m=0;
m<nspec; ++
m) covnorm += covInv[k][
m]*yieldvalues[
m] ;
632 for(
Int_t m = 0;
m < nspec; ++
m) sumrow += covMatrix[k][
m] ;
633 coutI(Eval) << yieldvalues[k] <<
" " << sumrow <<
" " << covnorm << std::endl ;
638 coutI(Eval) <<
"Calculating sWeight" << std::endl;
639 std::vector<RooRealVar*> sweightvec ;
640 std::vector<RooRealVar*> pdfvec ;
648 for(
Int_t k=0; k<nspec; ++k)
650 std::string wname = std::string(yieldvars[k]->
GetName()) +
"_sw";
652 sweightvec.push_back( var) ;
653 sweightset.
add(*var) ;
656 wname =
"L_" + std::string(yieldvars[k]->
GetName());
657 var =
new RooRealVar(wname.c_str(),wname.c_str(),0) ;
658 pdfvec.push_back( var) ;
659 sweightset.
add(*var) ;
667 for(
Int_t ievt = 0; ievt < numevents; ++ievt)
674 for(
Int_t k = 0; k < nspec; ++k) dsum += pdfvalues[ievt][k] * yieldvalues[k] ;
679 for(
Int_t j=0; j<nspec; ++j) nsum += covMatrix(
n,j) * pdfvalues[ievt][j] ;
687 if(includeWeights) sweightvec[
n]->setVal(
fSData->weight() * nsum/dsum) ;
688 else sweightvec[
n]->setVal( nsum/dsum) ;
690 pdfvec[
n]->setVal( pdfvalues[ievt][
n] ) ;
692 if( !(std::abs(nsum/dsum)>=0 ) )
694 coutE(Contents) <<
"error: " << nsum/dsum << std::endl ;
699 sWeightData->
add(sweightset) ;
705 fSData->merge(sWeightData);
711 for(std::size_t i = 0; i < yieldsTmp.
size(); i++)
716 for(
Int_t i=0; i < (
Int_t) constVarHolder.size(); i++)
717 constVarHolder.at(i)->setConstant(
false);
int Int_t
Signed integer 4 bytes (int)
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Common abstract base class for objects that represent a value and a "shape" in RooFit.
bool dependsOn(const RooAbsCollection &serverList, const RooAbsArg *ignoreArg=nullptr, bool valueOnly=false) const
Test whether we depend on (ie, are served by) any object in the specified collection.
bool isConstant() const
Check if the "Constant" attribute is set.
RooFit::OwningPtr< RooArgSet > getParameters(const RooAbsData *data, bool stripDisconnected=true) const
Create a list of leaf nodes in the arg tree starting with ourself as top node that don't match any of...
RooFit::OwningPtr< RooArgSet > getObservables(const RooArgSet &set, bool valueOnly=true) const
Given a set of possible observables, return the observables that this PDF depends on.
RooFit::OwningPtr< RooArgSet > getVariables(bool stripDisconnected=true) const
Return RooArgSet with all variables (tree leaf nodes of expression tree)
void treeNodeServerList(RooAbsCollection *list, const RooAbsArg *arg=nullptr, bool doBranch=true, bool doLeaf=true, bool valueOnly=false, bool recurseNonDerived=false) const
Fill supplied list with nodes of the arg tree, following all server links, starting with ourself as t...
double getRealValue(const char *name, double defVal=0.0, bool verbose=false) const
Get value of a RooAbsReal stored in set with given name.
virtual bool remove(const RooAbsArg &var, bool silent=false, bool matchByNameOnly=false)
Remove the specified argument from our list.
RooAbsCollection * snapshot(bool deepCopy=true) const
Take a snap shot of current collection contents.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
const_iterator end() const
Storage_t::size_type size() const
const_iterator begin() const
RooAbsArg * find(const char *name) const
Find object with given name in list.
void Print(Option_t *options=nullptr) const override
This method must be overridden when a class wants to print itself.
Abstract interface for all probability density functions.
RooFit::OwningPtr< RooFitResult > fitTo(RooAbsData &data, CmdArgs_t const &... cmdArgs)
Fit PDF to given dataset.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
void setConstant(bool value=true)
virtual void setVal(double value)=0
Set the current value of the object. Needs to be overridden by implementations.
Abstract base class for objects that represent a real value and implements functionality common to al...
double getVal(const RooArgSet *normalisationSet=nullptr) const
Evaluate object.
RooArgList is a container object that can hold multiple RooAbsArg objects.
RooAbsArg * at(Int_t idx) const
Return object at given index, or nullptr if index is out of range.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
Named container for two doubles, two integers two object points and three string pointers that can be...
Container class to hold unbinned data.
void add(const RooArgSet &row, double weight, double weightError)
Add one ore more rows of data.
static RooMsgService & instance()
Return reference to singleton instance.
Variable that can be changed from the outside.
double GetSWeight(Int_t numEvent, const char *sVariable) const
Retrieve an s weight.
void AddSWeight(RooAbsPdf *pdf, const RooArgList &yieldsTmp, const RooArgSet &projDeps=RooArgSet(), bool includeWeights=true, const RooCmdArg &fitToarg5={}, const RooCmdArg &fitToarg6={}, const RooCmdArg &fitToarg7={}, const RooCmdArg &fitToarg8={})
Method which adds the sWeights to the dataset.
RooArgList GetSWeightVars() const
Return a RooArgList containing all parameters that have s weights.
double GetSumOfEventSWeight(Int_t numEvent) const
Sum the SWeights for a particular event.
SPlot()
Default constructor.
Int_t GetNumSWeightVars() const
Return the number of SWeights In other words, return the number of species that we are trying to extr...
RooDataSet * SetSData(RooDataSet *data)
Set dataset (if not passed in constructor).
RooDataSet * GetSDataSet() const
Retrieve s-weighted data.
double GetYieldFromSWeight(const char *sVariable) const
Sum the SWeights for a particular species over all events.
void Print(Option_t *name="") const override
Print the matrix as a table of elements.
Double_t Determinant() const override
Return the matrix determinant.
const char * GetName() const override
Returns name of object.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
RooCmdArg SumW2Error(bool flag)
RooCmdArg PrintEvalErrors(Int_t numErrors)
RooCmdArg PrintLevel(Int_t code)
RooCmdArg Extended(bool flag=true)
Namespace for the RooStats classes.