200        bool useWeights, 
bool cloneData, 
const char* newName,
 
  212  for (
const auto arg : yieldsList) {
 
  214      coutE(InputArguments) << 
"SPlot::SPlot(" << 
GetName() << 
") input argument " 
  215             << arg->GetName() << 
" is not of type RooRealVar (or RooLinearVar)." 
  216             << 
"\nRooStats must be able to set it to 0 and to 1 to probe the PDF." << endl ;
 
  217      throw std::invalid_argument(
Form(
"SPlot::SPlot(%s) input argument %s is not of type RooRealVar/RooLinearVar",
GetName(),arg->GetName())) ;
 
  225  this->
AddSWeight(pdf, yieldsList, projDeps, useWeights, arg5, arg6, arg7, arg8);
 
  255      coutE(InputArguments)  << 
"Invalid Entry Number" << endl;
 
  261      coutE(InputArguments)  << 
"Invalid Entry Number" << endl;
 
  265  double totalYield = 0;
 
  267  std::string varname(sVariable);
 
  289    coutE(InputArguments) << 
"InputVariable not in list of sWeighted variables" << endl;
 
  304      coutE(InputArguments)  << 
"Invalid Entry Number" << endl;
 
  310      coutE(InputArguments)  << 
"Invalid Entry Number" << endl;
 
  316  double eventSWeight = 0;
 
  320  for (
Int_t i = 0; i < numSWeightVars; i++)
 
  334  double totalYield = 0;
 
  336  std::string varname(sVariable);
 
  363    coutE(InputArguments) << 
"InputVariable not in list of sWeighted variables" << endl;
 
  420         const RooArgSet &projDeps, 
bool includeWeights,
 
  427  for (
unsigned int i=0; i < constParameters->size(); ++i) {
 
  429    auto& par = *(*constParameters)[i];
 
  430    if (std::any_of(yieldsTmp.
begin(), yieldsTmp.
end(), [&](
const RooAbsArg* yield){ return yield->dependsOn(par); })) {
 
  431      constParameters->remove(par, 
true, 
true);
 
  439  std::vector<RooAbsRealLValue*> constVarHolder;
 
  441  for(
Int_t i = 0; i < constParameters->getSize(); i++)
 
  447      constVarHolder.push_back(varTemp);
 
  457  vars.
remove(projDeps, 
true, 
true);
 
  460  std::vector<double> yieldsHolder;
 
  462  yieldsHolder.reserve(yieldsTmp.
getSize());
 
  471    coutI(InputArguments) << 
"Printing Yields" << endl;
 
  477  std::vector<RooAbsRealLValue*> yieldvars ;
 
  481  std::vector<double> yieldvalues ;
 
  482  for (
Int_t k = 0; k < nspec; ++k) {
 
  483    auto thisyield = 
static_cast<const RooAbsReal*
>(yields.
at(k)) ;
 
  488      coutI(InputArguments)<< 
"yield in pdf: " << yieldinpdf->GetName() << 
" " << thisyield->getVal(&vars) << endl;
 
  490      yieldvars.push_back(yieldinpdf) ;
 
  491      yieldvalues.push_back(thisyield->getVal(&vars)) ;
 
  506    if (theVar->getMin() > 0) {
 
  507      coutE(InputArguments)  << 
"Yield variables need to have a range that includes at least [0, 1]. Minimum for " 
  508          << theVar->GetName() << 
" is " << theVar->getMin() << std::endl;
 
  510        coutE(InputArguments)  << 
"Setting min range to 0" << std::endl;
 
  513        throw std::invalid_argument(std::string(
"Yield variable ") + theVar->GetName() + 
" must have a range that includes 0.");
 
  517    if (theVar->getMax() < 1) {
 
  518      coutW(InputArguments)  << 
"Yield variables need to have a range that includes at least [0, 1]. Maximum for " 
  519          << theVar->GetName() << 
" is " << theVar->getMax() << std::endl;
 
  521        coutE(InputArguments)  << 
"Setting max range to 1" << std::endl;
 
  524        throw std::invalid_argument(std::string(
"Yield variable ") + theVar->GetName() + 
" must have a range that includes 1.");
 
  536  std::unique_ptr<RooArgSet> pdfvars{pdf->
getVariables()};
 
  537  std::vector<std::vector<double> > pdfvalues(numevents,std::vector<double>(nspec,0)) ;
 
  539  for (
Int_t ievt = 0; ievt <numevents; ievt++)
 
  545    for(
Int_t k = 0; k < nspec; ++k) {
 
  551      double f_k = pdf->
getVal(&vars) ;
 
  552      pdfvalues[ievt][k] = f_k ;
 
  553      if( !(f_k>1 || f_k<1) )
 
  554        coutW(InputArguments) << 
"Strange pdf value: " << ievt << 
" " << k << 
" " << f_k << std::endl ;
 
  555      theVar->setVal( 0 ) ;
 
  560  std::vector<double> norm(nspec,0) ;
 
  561  for (
Int_t ievt = 0; ievt <numevents ; ievt++)
 
  564      for(
Int_t k=0; k<nspec; ++k) dnorm += yieldvalues[k] * pdfvalues[ievt][k] ;
 
  565      for(
Int_t j=0; j<nspec; ++j) norm[j] += pdfvalues[ievt][j]/dnorm ;
 
  568  coutI(Contents) << 
"likelihood norms: "  ;
 
  570  for(
Int_t k=0; k<nspec; ++k)  
coutI(Contents) << norm[k] << 
" " ;
 
  571  coutI(Contents) << std::endl ;
 
  575  for (
Int_t i = 0; i < nspec; i++) 
for (
Int_t j = 0; j < nspec; j++) covInv(i,j) = 0;
 
  577  coutI(Contents) << 
"Calculating covariance matrix";
 
  581  for (
Int_t ievt = 0; ievt < numevents; ++ievt)
 
  591      for(
Int_t k = 0; k < nspec; ++k)
 
  592   dsum += pdfvalues[ievt][k] * yieldvalues[k] ;
 
  595   for(
Int_t j=0; j<nspec; ++j)
 
  598         covInv(
n,j) +=  
fSData->
weight()*pdfvalues[ievt][
n]*pdfvalues[ievt][j]/(dsum*dsum) ;
 
  600         covInv(
n,j) +=                   pdfvalues[ievt][
n]*pdfvalues[ievt][j]/(dsum*dsum) ;
 
  612      coutE(Eval) << 
"SPlot Error: covariance matrix is singular; I can't invert it!" << std::endl;
 
  621    coutI(Eval) << 
"Checking Likelihood normalization:  " << std::endl;
 
  622    coutI(Eval) << 
"Yield of specie  Sum of Row in Matrix   Norm" << std::endl;
 
  623    for(
Int_t k=0; k<nspec; ++k)
 
  626      for(
Int_t m=0; 
m<nspec; ++
m) covnorm += covInv[k][
m]*yieldvalues[
m] ;
 
  628      for(
Int_t m = 0; 
m < nspec; ++
m) sumrow += covMatrix[k][
m] ;
 
  629      coutI(Eval)  << yieldvalues[k] << 
" " << sumrow << 
" " << covnorm << endl ;
 
  634  coutI(Eval) << 
"Calculating sWeight" << std::endl;
 
  635  std::vector<RooRealVar*> sweightvec ;
 
  636  std::vector<RooRealVar*> pdfvec ;
 
  644  for(
Int_t k=0; k<nspec; ++k)
 
  646       std::string wname = std::string(yieldvars[k]->
GetName()) + 
"_sw";
 
  648       sweightvec.push_back( var) ;
 
  649       sweightset.
add(*var) ;
 
  652       wname = 
"L_" + std::string(yieldvars[k]->
GetName());
 
  653       var = 
new RooRealVar(wname.c_str(),wname.c_str(),0) ;
 
  654       pdfvec.push_back( var) ;
 
  655       sweightset.
add(*var) ;
 
  663  for(
Int_t ievt = 0; ievt < numevents; ++ievt)
 
  670      for(
Int_t k = 0; k < nspec; ++k)   dsum +=  pdfvalues[ievt][k] * yieldvalues[k] ;
 
  675     for(
Int_t j=0; j<nspec; ++j) nsum += covMatrix(
n,j) * pdfvalues[ievt][j] ;
 
  683     if(includeWeights) sweightvec[
n]->setVal(
fSData->
weight() * nsum/dsum) ;
 
  684     else  sweightvec[
n]->setVal( nsum/dsum) ;
 
  686     pdfvec[
n]->setVal( pdfvalues[ievt][
n] ) ;
 
  688     if( !(std::abs(nsum/dsum)>=0 ) )
 
  690         coutE(Contents) << 
"error: " << nsum/dsum << endl ;
 
  695      sWeightData->
add(sweightset) ;
 
  712  for(
Int_t i=0; i < (
Int_t) constVarHolder.size(); i++)
 
  713    constVarHolder.at(i)->setConstant(
false);
 
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
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 > 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.
Int_t getSize() const
Return the number of elements in the collection.
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
const_iterator end() const
void assign(const RooAbsCollection &other) const
Sets the value, cache and constant attribute of any argument in our set that also appears in the othe...
virtual RooAbsArg * addClone(const RooAbsArg &var, bool silent=false)
Add a clone of the specified argument to list.
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.
virtual Int_t numEntries() const
Return number of entries in dataset, i.e., count unweighted entries.
Abstract interface for all probability density functions.
RooFit::OwningPtr< RooFitResult > fitTo(RooAbsData &data, CmdArgs_t const &... cmdArgs)
Fit PDF to given dataset.
RooAbsRealLValue is the common abstract base class for objects that represent a real value that may a...
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...
RooDataSet is a container class to hold unbinned data.
const RooArgSet * get(Int_t index) const override
Return RooArgSet with coordinates of event 'index'.
bool merge(RooDataSet *data1, RooDataSet *data2=nullptr, RooDataSet *data3=nullptr, RooDataSet *data4=nullptr, RooDataSet *data5=nullptr, RooDataSet *data6=nullptr)
void add(const RooArgSet &row, double weight, double weightError)
Add one ore more rows of data.
double weight() const override
Return event weight of current event.
static RooMsgService & instance()
Return reference to singleton instance.
bool isActive(T self, RooFit::MsgTopic topic, RooFit::MsgLevel level)
Check if logging is active for given object/topic/RooFit::MsgLevel combination.
RooRealVar represents a variable that can be changed from the outside.
A class to calculate "sWeights" used to create an "sPlot".
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.
The TNamed class is the base class for all named ROOT classes.
const char * GetName() const override
Returns name of object.
virtual void Clear(Option_t *="")
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.