76using std::string, std::make_unique, std::vector;
86#define NaN std::numeric_limits<double>::quiet_NaN()
95template <
typename Test,
template <
typename...>
class Ref>
99template <
template <
typename...>
class Ref,
typename... Args>
110template <
class MatrixT>
111inline size_t size(
const MatrixT &matrix);
121template <
class MatrixT>
124 if (!stream.good()) {
127 for (
size_t i = 0; i <
size(matrix); ++i) {
128 for (
size_t j = 0; j <
size(matrix); ++j) {
130 stream << std::setprecision(RooFit::SuperFloatPrecision::digits10) << matrix(i, j) <<
"\t";
132 stream << matrix(i, j) <<
"\t";
142template <
class MatrixT>
145 std::ofstream of(fname);
147 std::cerr <<
"unable to read file '" << fname <<
"'!" << std::endl;
156#pragma GCC diagnostic push
157#pragma GCC diagnostic ignored "-Wshadow"
158#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
159#include <boost/numeric/ublas/io.hpp>
160#include <boost/numeric/ublas/lu.hpp>
161#include <boost/numeric/ublas/matrix.hpp>
162#include <boost/numeric/ublas/matrix_expression.hpp>
163#include <boost/numeric/ublas/symmetric.hpp>
164#include <boost/numeric/ublas/triangular.hpp>
165#include <boost/operators.hpp>
167#pragma GCC diagnostic pop
169typedef boost::numeric::ublas::matrix<RooFit::SuperFloat>
Matrix;
176 for (
size_t i = 0; i < mat.size1(); ++i) {
177 for (
size_t j = 0; j < mat.size2(); ++j) {
178 std::cout << std::setprecision(RooFit::SuperFloatPrecision::digits10) << mat(i, j) <<
" ,\t";
180 std::cout << std::endl;
190 return matrix.size1();
198 return boost::numeric::ublas::identity_matrix<RooFit::SuperFloat>(
n);
208 for (
size_t i = 0; i <
n; ++i) {
209 for (
size_t j = 0; j <
n; ++j) {
210 mat(i, j) =
double(in(i, j));
223 for (
size_t i = 0; i <
n; ++i) {
224 for (
size_t j = 0; j <
n; ++j) {
225 mat(i, j) =
double(in(i, j));
237 return prod(
m, otherM);
245 boost::numeric::ublas::permutation_matrix<size_t> pm(
size(matrix));
249 int res = lu_factorize(lu, pm);
251 std::stringstream ss;
253 cxcoutP(Eval) << ss.str << std::endl;
256 lu_substitute(lu, pm, inverse);
257 }
catch (boost::numeric::ublas::internal_logic &error) {
311 bool status = lu.
Invert(inverse);
314 std::cerr <<
" matrix is not invertible!" << std::endl;
317 const size_t n =
size(inverse);
319 for (
size_t i = 0; i <
n; ++i) {
320 for (
size_t j = 0; j <
n; ++j) {
321 if (std::abs(inverse(i, j)) < 1
e-9)
340typedef std::vector<std::vector<bool>> FeynmanDiagram;
341typedef std::vector<std::vector<int>> MorphFuncPattern;
342typedef std::map<int, std::unique_ptr<RooAbsReal>> FormulaList;
350 retval.ReplaceAll(
"/",
"_");
351 retval.ReplaceAll(
"^",
"");
352 retval.ReplaceAll(
"*",
"X");
353 retval.ReplaceAll(
"[",
"");
354 retval.ReplaceAll(
"]",
"");
362std::string concatNames(
const List &
c,
const char *sep)
364 std::stringstream ss;
369 ss << itr->GetName();
379template <
class A,
class B>
380inline void assignElement(A &
a,
const B &
b)
382 a =
static_cast<A
>(
b);
387template <
class MatrixT>
388inline MatrixT readMatrixFromStreamT(std::istream &stream)
390 std::vector<std::vector<RooFit::SuperFloat>> matrix;
391 std::vector<RooFit::SuperFloat>
line;
392 while (!stream.eof()) {
393 if (stream.peek() ==
'\n') {
401 while (stream.peek() ==
' ' || stream.peek() ==
'\t') {
404 if (stream.peek() ==
'\n') {
405 matrix.push_back(
line);
409 MatrixT retval(matrix.size(), matrix.size());
410 for (
size_t i = 0; i < matrix.size(); ++i) {
411 if (matrix[i].
size() != matrix.size()) {
412 std::cerr <<
"matrix read from stream doesn't seem to be square!" << std::endl;
414 for (
size_t j = 0; j < matrix[i].size(); ++j) {
415 assignElement(retval(i, j), matrix[i][j]);
424template <
class MatrixT>
425inline MatrixT readMatrixFromFileT(
const char *fname)
427 std::ifstream in(fname);
429 std::cerr <<
"unable to read file '" << fname <<
"'!" << std::endl;
431 MatrixT mat = readMatrixFromStreamT<MatrixT>(in);
440void readValues(std::map<const std::string, T> &myMap,
TH1 *h_pc)
444 for (
int ibx = 1; ibx <= h_pc->
GetNbinsX(); ++ibx) {
449 if (!s_coup.empty()) {
450 myMap[s_coup] = T(coup_val);
459void setOwnerRecursive(
TFolder *theFolder)
467 setOwnerRecursive(thisfolder);
480std::unique_ptr<TFolder> readOwningFolderFromFile(
TDirectory *inFile,
const std::string &folderName)
482 std::unique_ptr<TFolder> theFolder(inFile->
Get<
TFolder>(folderName.c_str()));
484 std::cerr <<
"Error: unable to access data from folder '" << folderName <<
"' from file '" << inFile->
GetName()
485 <<
"'!" << std::endl;
488 setOwnerRecursive(theFolder.get());
501template <
class AObjType>
502std::unique_ptr<AObjType> loadFromFileResidentFolder(
TDirectory *inFile,
const std::string &folderName,
503 const std::string &objName,
bool notFoundError =
true)
505 auto folder = readOwningFolderFromFile(inFile, folderName);
509 AObjType *loadedObject =
dynamic_cast<AObjType *
>(folder->FindObject(objName.c_str()));
512 std::stringstream errstr;
513 errstr <<
"Error: unable to retrieve object '" << objName <<
"' from folder '" << folderName
514 <<
"'. contents are:";
515 TIter next(folder->GetListOfFolders()->begin());
517 while ((
f =
static_cast<TFolder *
>(next()))) {
518 errstr <<
" " <<
f->GetName();
520 std::cerr << errstr.str() << std::endl;
526 return std::unique_ptr<AObjType>{
static_cast<AObjType *
>(loadedObject->Clone())};
533void readValues(std::map<const std::string, T> &myMap,
TDirectory *file,
const std::string &
name,
534 const std::string &key =
"param_card",
bool notFoundError =
true)
536 auto h_pc = loadFromFileResidentFolder<TH1F>(file,
name, key, notFoundError);
537 readValues(myMap, h_pc.get());
546void readValues(std::map<
const std::string, std::map<const std::string, T>> &inputParameters,
TDirectory *
f,
547 const std::vector<std::string> &names,
const std::string &key =
"param_card",
bool notFoundError =
true)
549 inputParameters.clear();
552 for (
size_t i = 0; i < names.size(); i++) {
553 const std::string
name(names[i]);
555 readValues(inputParameters[
name],
f,
name, key, notFoundError);
570 if (!file || !file->
IsOpen()) {
573 std::cerr <<
"could not open file '" <<
filename <<
"'!" << std::endl;
595inline void extractServers(
const RooAbsArg &coupling,
T2 &operators)
598 for (
const auto server : coupling.
servers()) {
599 extractServers(*server, operators);
603 operators.add(coupling);
610template <class T1, class T2, typename std::enable_if<!is_specialization<T1, std::vector>::value,
T1>
::type * =
nullptr>
611inline void extractOperators(
const T1 &couplings,
T2 &operators)
615 for (
auto itr : couplings) {
616 extractServers(*itr, operators);
623template <class T1, class T2, typename std::enable_if<is_specialization<T1, std::vector>::value,
T1>
::type * =
nullptr>
624inline void extractOperators(
const T1 &
vec,
T2 &operators)
626 for (
const auto &
v :
vec) {
627 extractOperators(
v, operators);
634template <
class T1,
class T2>
635inline void extractCouplings(
const T1 &inCouplings,
T2 &outCouplings)
637 for (
auto itr : inCouplings) {
638 if (!outCouplings.find(itr->GetName())) {
641 outCouplings.add(*itr);
650inline bool setParam(
RooRealVar *p,
double val,
bool force)
657 std::cerr <<
": parameter " << p->
GetName() <<
" out of bounds: " << val <<
" > " << p->
getMax() << std::endl;
660 }
else if (val < p->getMin()) {
664 std::cerr <<
": parameter " << p->
GetName() <<
" out of bounds: " << val <<
" < " << p->
getMin() << std::endl;
677template <
class T1,
class T2>
678inline bool setParams(
const T2 &args,
T1 val)
683 setParam(param, val,
true);
692template <
class T1,
class T2>
694setParams(
const std::map<const std::string, T1> &point,
const T2 &args,
bool force =
false,
T1 defaultVal = 0)
698 if (!param || param->isConstant())
700 ok = setParam(param, defaultVal, force) && ok;
703 for (
auto paramit : point) {
705 const std::string param(paramit.first);
711 ok = setParam(p, paramit.second, force) && ok;
721inline bool setParams(
TH1 *hist,
const T &args,
bool force =
false)
728 ok = setParam(param, 0., force) && ok;
733 for (
int i = 1; i <= ax->
GetNbins(); ++i) {
754 retval[param->GetName()] = param->getVal();
767 bool binningOK =
false;
768 for (
auto sampleit : inputParameters) {
769 const std::string sample(sampleit.first);
770 auto hist = loadFromFileResidentFolder<TH1>(file, sample, varname,
true);
778 auto it = list_hf.find(sample);
779 if (it != list_hf.end()) {
791 std::vector<double> bins;
792 for (
int i = 1; i <
n + 1; ++i) {
800 TString histname = makeValidName(
"dh_" + sample +
"_" +
name);
801 TString funcname = makeValidName(
"phys_" + sample +
"_" +
name);
805 auto dh = std::make_unique<RooDataHist>(histname.
Data(), histname.
Data(), vars, hist.get());
807 auto hf = std::make_unique<RooHistFunc>(funcname.
Data(), funcname.
Data(), var, std::move(dh));
808 int idx = physics.
size();
809 list_hf[sample] = idx;
820void collectRooAbsReal(
const char * ,
TDirectory *file, std::map<std::string, int> &list_hf,
821 RooArgList &physics,
const std::string &varname,
824 for (
auto sampleit : inputParameters) {
825 const std::string sample(sampleit.first);
826 auto obj = loadFromFileResidentFolder<RooAbsReal>(file, sample, varname,
true);
829 auto it = list_hf.find(sample);
830 if (it == list_hf.end()) {
831 int idx = physics.
size();
832 list_hf[sample] = idx;
843void collectCrosssections(
const char *
name,
TDirectory *file, std::map<std::string, int> &list_xs,
RooArgList &physics,
846 for (
auto sampleit : inputParameters) {
847 const std::string sample(sampleit.first);
848 auto obj = loadFromFileResidentFolder<TObject>(file, sample, varname,
false);
861 std::stringstream errstr;
862 errstr <<
"Error: unable to retrieve cross section '" << varname <<
"' from folder '" << sample;
866 auto it = list_xs.find(sample);
868 if (it != list_xs.end()) {
872 std::string objname =
"phys_" + std::string(
name) +
"_" + sample;
873 auto xsOwner = std::make_unique<RooRealVar>(objname.c_str(), objname.c_str(), xsection->
GetVal());
876 int idx = physics.
size();
877 list_xs[sample] = idx;
878 physics.
addOwned(std::move(xsOwner));
879 assert(physics.
at(idx) == xs);
891void collectCrosssectionsTPair(
const char *
name,
TDirectory *file, std::map<std::string, int> &list_xs,
892 RooArgList &physics,
const std::string &varname,
const std::string &basefolder,
895 auto pair = loadFromFileResidentFolder<TPair>(file, basefolder, varname,
false);
899 collectCrosssections<double>(
name, file, list_xs, physics, varname, inputParameters);
901 collectCrosssections<float>(
name, file, list_xs, physics, varname, inputParameters);
903 std::cerr <<
"cannot morph objects of class 'TPair' if parameter is not "
917void collectPolynomialsHelper(
const FeynmanDiagram &diagram, MorphFuncPattern &morphfunc, std::vector<int> &term,
918 int vertexid,
bool first)
921 for (
size_t i = 0; i < diagram[vertexid - 1].size(); ++i) {
922 if (!diagram[vertexid - 1][i])
924 std::vector<int> newterm(term);
927 ::collectPolynomialsHelper(diagram, morphfunc, newterm, vertexid,
false);
929 ::collectPolynomialsHelper(diagram, morphfunc, newterm, vertexid - 1,
true);
934 for (
size_t i = 0; i < morphfunc.size(); ++i) {
935 bool thisfound =
true;
936 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
937 if (morphfunc[i][j] != term[j]) {
948 morphfunc.push_back(term);
956void collectPolynomials(MorphFuncPattern &morphfunc,
const FeynmanDiagram &diagram)
958 int nvtx(diagram.size());
959 std::vector<int> term(diagram[0].
size(), 0);
961 ::collectPolynomialsHelper(diagram, morphfunc, term, nvtx,
true);
968inline void fillFeynmanDiagram(FeynmanDiagram &diagram,
const std::vector<List *> &vertices,
RooArgList &couplings)
970 const int ncouplings = couplings.
size();
972 for (
auto const &vertex : vertices) {
973 std::vector<bool> vertexCouplings(ncouplings,
false);
978 std::cerr <<
"encountered invalid list of couplings in vertex!" << std::endl;
981 if (vertex->find(coupling->
GetName())) {
982 vertexCouplings[idx] =
true;
985 diagram.push_back(vertexCouplings);
992template <
class MatrixT,
class T1,
class T2>
996 const size_t dim = inputParameters.size();
997 MatrixT matrix(dim, dim);
999 for (
auto sampleit : inputParameters) {
1000 const std::string sample(sampleit.first);
1002 if (!setParams<double>(sampleit.second, args,
true, 0)) {
1003 std::cout <<
"unable to set parameters for sample " << sample <<
"!" << std::endl;
1005 auto flagit = flagValues.find(sample);
1006 if (flagit != flagValues.end() && !setParams<int>(flagit->second, flags,
true, 1)) {
1007 std::cout <<
"unable to set parameters for sample " << sample <<
"!" << std::endl;
1011 for (
auto const &formula : formulas) {
1012 if (!formula.second) {
1013 std::cerr <<
"Error: invalid formula encountered!" << std::endl;
1015 matrix(row, col) = formula.second->getVal();
1028 if (inputParameters.size() != formulas.size()) {
1029 std::stringstream ss;
1030 ss <<
"matrix is not square, consistency check failed: " << inputParameters.size() <<
" samples, "
1031 << formulas.size() <<
" expressions:" << std::endl;
1032 ss <<
"formulas: " << std::endl;
1033 for (
auto const &formula : formulas) {
1034 ss << formula.second->GetTitle() << std::endl;
1036 ss <<
"samples: " << std::endl;
1037 for (
auto sample : inputParameters) {
1038 ss << sample.first << std::endl;
1040 std::cerr << ss.str() << std::endl;
1047inline void inverseSanity(
const Matrix &matrix,
const Matrix &inverse,
double &unityDeviation,
double &largestWeight)
1049 Matrix unity(inverse * matrix);
1051 unityDeviation = 0.;
1053 const size_t dim =
size(unity);
1054 for (
size_t i = 0; i < dim; ++i) {
1055 for (
size_t j = 0; j < dim; ++j) {
1056 if (inverse(i, j) > largestWeight) {
1057 largestWeight = (
double)inverse(i, j);
1059 if (std::abs(unity(i, j) -
static_cast<int>(i == j)) > unityDeviation) {
1060 unityDeviation = std::abs((
double)unity(i, j)) -
static_cast<int>(i == j);
1068template <
class List>
1071 for (
auto sampleit : inputParameters) {
1072 const std::string sample(sampleit.first);
1073 RooAbsArg *arg = args.find(sample.c_str());
1075 std::cerr <<
"detected name conflict: cannot use sample '" << sample
1076 <<
"' - a parameter with the same name of type '" << arg->
ClassName() <<
"' is present in set '"
1077 << args.GetName() <<
"'!" << std::endl;
1089 const std::vector<std::vector<std::string>> &nonInterfering)
1098 const int ncouplings = couplings.
size();
1099 std::vector<bool> couplingsZero(ncouplings,
true);
1100 std::map<TString, bool> flagsZero;
1103 extractOperators(couplings, operators);
1104 size_t nOps = operators.
size();
1106 for (
auto sampleit : inputParameters) {
1107 const std::string sample(sampleit.first);
1108 if (!setParams(sampleit.second, operators,
true)) {
1109 std::cerr <<
"unable to set parameters for sample '" << sample <<
"'!" << std::endl;
1112 if (nOps != (operators.
size())) {
1113 std::cerr <<
"internal error, number of operators inconsistent!" << std::endl;
1119 if (obj0->getVal() != 0) {
1120 couplingsZero[idx] =
false;
1129 for (
auto sampleit : inputFlags) {
1130 const auto &flag = sampleit.second.find(obj1->GetName());
1131 if (flag != sampleit.second.end()) {
1132 if (flag->second == 0.) {
1139 if (nZero > 0 && nNonZero == 0) {
1140 flagsZero[obj1->GetName()] =
true;
1142 flagsZero[obj1->GetName()] =
false;
1146 FormulaList formulas;
1147 for (
size_t i = 0; i < morphfunc.size(); ++i) {
1149 bool isZero =
false;
1152 for (
const auto &
group : nonInterfering) {
1153 int nInterferingOperators = 0;
1154 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
1155 if (morphfunc[i][j] % 2 == 0)
1159 nInterferingOperators++;
1162 if (nInterferingOperators > 1) {
1164 reason =
"blacklisted interference term!";
1170 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
1171 const int exponent = morphfunc[i][j];
1175 for (
int k = 0; k < exponent; ++k) {
1184 reason =
"coupling " +
cname +
" was listed as leading-order-only";
1187 if (!isZero && couplingsZero[j]) {
1189 reason =
"coupling " +
cname +
" is zero!";
1194 bool removedByFlag =
false;
1199 TString sval(obj->getStringAttribute(
"NewPhysics"));
1200 int val = atoi(sval);
1202 if (flagsZero.find(obj->GetName()) != flagsZero.end() && flagsZero.at(obj->GetName())) {
1203 removedByFlag =
true;
1204 reason =
"flag " + std::string(obj->GetName()) +
" is zero";
1211 if (!isZero && !removedByFlag) {
1213 const auto name = std::string(mfname) +
"_pol" + std::to_string(i);
1214 formulas[i] = std::make_unique<RooProduct>(
name.c_str(), ::concatNames(ss,
" * ").c_str(), ss);
1225 const std::vector<std::vector<RooArgList *>> &diagrams,
RooArgList &couplings,
1226 const RooArgList &flags,
const std::vector<std::vector<std::string>> &nonInterfering)
1228 MorphFuncPattern morphfuncpattern;
1230 for (
const auto &vertices : diagrams) {
1232 ::fillFeynmanDiagram(
d, vertices, couplings);
1233 ::collectPolynomials(morphfuncpattern,
d);
1235 FormulaList retval = buildFormulas(
name, inputs, inputFlags, morphfuncpattern, couplings, flags, nonInterfering);
1236 if (retval.empty()) {
1237 std::stringstream errorMsgStream;
1239 <<
"no formulas are non-zero, check if any if your couplings is floating and missing from your param_cards!"
1241 const auto errorMsg = errorMsgStream.str();
1242 throw std::runtime_error(errorMsg);
1244 checkMatrix(inputs, retval);
1253 FormulaList &formulas,
const Matrix &inverse)
1257 for (
auto sampleit : inputParameters) {
1258 const std::string sample(sampleit.first);
1259 std::stringstream title;
1260 TString name_full(makeValidName(sample));
1262 name_full.Append(
"_");
1263 name_full.Append(fname);
1264 name_full.Prepend(
"w_");
1269 auto sampleformula = std::make_unique<RooLinearCombination>(name_full.Data());
1270 for (
auto const &formulait : formulas) {
1272 sampleformula->add(val, formulait.second.get());
1275 weights.addOwned(std::move(sampleformula));
1280inline std::map<std::string, std::string>
1285 std::map<std::string, std::string> weights;
1286 for (
auto sampleit : inputParameters) {
1287 const std::string sample(sampleit.first);
1288 std::stringstream str;
1291 for (
auto const &formulait : formulas) {
1292 double val(inverse(formulaidx, sampleidx));
1294 if (formulaidx > 0 && val > 0)
1296 str << val <<
"*(" << formulait.second->GetTitle() <<
")";
1300 weights[sample] = str.str();
1335 args.
add(*(it.second));
1345 const std::vector<std::vector<RooListProxy *>> &diagramProxyList,
1346 const std::vector<std::vector<std::string>> &nonInterfering,
const RooArgList &flags)
1349 std::vector<std::vector<RooArgList *>> diagrams;
1350 for (
const auto &diagram : diagramProxyList) {
1351 diagrams.emplace_back();
1354 diagrams.back().emplace_back(vertex);
1358 _formulas = ::createFormulas(funcname, inputParameters, inputFlags, diagrams,
_couplings, flags, nonInterfering);
1363 template <
class List>
1369 Matrix matrix(buildMatrixT<Matrix>(inputParameters,
_formulas, operators, inputFlags, flags));
1370 if (
size(matrix) < 1) {
1371 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
1376 double unityDeviation;
1377 double largestWeight;
1378 inverseSanity(matrix, inverse, unityDeviation, largestWeight);
1384 oocxcoutW((
TObject *)
nullptr, Eval) <<
"Warning: The matrix inversion seems to be unstable. This can "
1385 "be a result to input samples that are not sufficiently "
1386 "different to provide any morphing power."
1388 }
else if (weightwarning) {
1389 oocxcoutW((
TObject *)
nullptr, Eval) <<
"Warning: Some weights are excessively large. This can be a "
1390 "result to input samples that are not sufficiently different to "
1391 "provide any morphing power."
1395 "encoded in your samples to cross-check:"
1397 for (
auto sampleit : inputParameters) {
1398 const std::string sample(sampleit.first);
1401 setParams(sampleit.second, operators,
true);
1407 oocxcoutW((
TObject *)
nullptr, Eval) << obj->GetName() <<
"=" << obj->getVal();
1426 const std::map<std::string, int> &storage,
const RooArgList &physics,
1430 std::cerr <<
"invalid bin width given!" << std::endl;
1434 std::cerr <<
"invalid observable given!" << std::endl;
1448 for (
auto sampleit : inputParameters) {
1450 TString prodname(makeValidName(sampleit.first));
1455 std::cerr <<
"unable to access physics object for " << prodname << std::endl;
1462 std::cerr <<
"unable to access weight object for " << prodname << std::endl;
1469 allowNegativeYields =
true;
1470 auto prod = std::make_unique<RooProduct>(prodname, prodname, prodElems);
1471 if (!allowNegativeYields) {
1472 auto maxname = std::string(prodname) +
"_max0";
1475 auto max = std::make_unique<RooFormulaVar>(maxname.c_str(),
"max(0," + prodname +
")", prodset);
1476 max->addOwnedComponents(std::move(prod));
1477 sumElements.
addOwned(std::move(max));
1479 sumElements.
addOwned(std::move(prod));
1481 scaleElements.
add(*(binWidth));
1486 _sumFunc = make_unique<RooRealSumFunc>((std::string(
name) +
"_morphfunc").c_str(),
name, sumElements, scaleElements);
1489 std::cerr <<
"unable to access observable" << std::endl;
1492 std::cerr <<
"unable to access bin width" << std::endl;
1494 if (operators.
empty())
1495 std::cerr <<
"no operators listed" << std::endl;
1496 _sumFunc->addServerList(operators);
1498 std::cerr <<
"unable to access weight objects" << std::endl;
1499 _sumFunc->addOwnedComponents(std::move(sumElements));
1500 _sumFunc->addServerList(sumElements);
1501 _sumFunc->addServerList(scaleElements);
1504 std::cout.precision(std::numeric_limits<double>::digits);
1521 if (obsName.empty()) {
1522 std::cerr <<
"Matrix inversion succeeded, but no observable was "
1523 "supplied. quitting..."
1531 setParams(func->
_flags, 1);
1535 setParams(func->
_flags, 1);
1558 setParams(func->
_flags, 1);
1562 setParams(func->
_flags, 1);
1592 return readMatrixFromFileT<TMatrixD>(fname);
1600 return readMatrixFromStreamT<TMatrixD>(stream);
1610 bool obsExists(
false);
1617 obs =
static_cast<RooRealVar *
>(
dynamic_cast<RooHistFunc *
>(inputExample)->getHistObsList().first());
1631 TH1 *hist =
static_cast<TH1 *
>(inputExample);
1634 obs = obsOwner.get();
1638 auto obsOwner = std::make_unique<RooRealVar>(obsname, obsname, 0, 1);
1639 obs = obsOwner.get();
1645 if (strcmp(obsname, obs->
GetName()) != 0) {
1646 coutW(ObjectHandling) <<
" name of existing observable " <<
_observables.at(0)->GetName()
1647 <<
" does not match expected name " << obsname << std::endl;
1652 auto binWidth = std::make_unique<RooRealVar>(sbw.
Data(), sbw.
Data(), 1.);
1654 binWidth->setVal(bw);
1655 binWidth->setConstant(
true);
1674 const size_t n(
size(cache->_inverse));
1675 for (
auto sampleit :
_config.paramCards) {
1676 const std::string sample(sampleit.first);
1679 if (!sampleformula) {
1680 coutE(ObjectHandling) <<
Form(
"unable to access formula for sample '%s'!", sample.c_str()) << std::endl;
1683 cxcoutP(ObjectHandling) <<
"updating formula for sample '" << sample <<
"'" << std::endl;
1684 for (
size_t formulaidx = 0; formulaidx <
n; ++formulaidx) {
1689 if (std::isnan(val)) {
1691 coutE(ObjectHandling) <<
"refusing to propagate NaN!" << std::endl;
1693 cxcoutP(ObjectHandling) <<
" " << formulaidx <<
":" << sampleformula->
getCoefficient(formulaidx) <<
" -> "
1694 << val << std::endl;
1714 readValues<double>(
_config.paramCards,
f,
_config.folderNames,
"param_card",
true);
1715 readValues<int>(
_config.flagValues,
f,
_config.folderNames,
"flags",
false);
1723 std::string obsName;
1726 if (
_config.observableName.empty()) {
1729 obsName =
_config.observableName;
1732 obsName =
_config.observableName;
1735 cxcoutP(InputArguments) <<
"initializing physics inputs from file " << file->
GetName() <<
" with object name(s) '"
1736 << obsName <<
"'" << std::endl;
1737 auto folderNames =
_config.folderNames;
1738 auto obj = loadFromFileResidentFolder<TObject>(file, folderNames.front(), obsName,
true);
1740 std::cerr <<
"unable to locate object '" << obsName <<
"' in folder '" << folderNames.front() <<
"'!"
1744 std::string classname = obj->ClassName();
1748 if (classname.find(
"TH1") != std::string::npos) {
1751 }
else if (classname.find(
"RooHistFunc") != std::string::npos ||
1752 classname.find(
"RooParamHistFunc") != std::string::npos ||
1753 classname.find(
"PiecewiseInterpolation") != std::string::npos) {
1755 }
else if (classname.find(
"TParameter<double>") != std::string::npos) {
1757 }
else if (classname.find(
"TParameter<float>") != std::string::npos) {
1759 }
else if (classname.find(
"TPair") != std::string::npos) {
1763 std::cerr <<
"cannot morph objects of class '" <<
mode->GetName() <<
"'!" << std::endl;
1772 for (
const auto ¶m :
_config.paramCards.at(samplename)) {
1774 std::cout << param.first <<
" = " << param.second;
1776 std::cout <<
" (const)";
1777 std::cout << std::endl;
1788 for (
auto folder :
_config.folderNames) {
1789 std::cout << folder << std::endl;
1811 _operators(
"operators",
"set of operators", this),
_observables(
"observables",
"morphing observables", this),
1827 if (!
_config.couplings.empty()) {
1829 std::vector<RooListProxy *> vertices;
1830 extractOperators(
_config.couplings, operators);
1831 vertices.push_back(
new RooListProxy(
"!couplings",
"set of couplings in the vertex",
this,
true,
false));
1834 vertices[0]->addOwned(
_config.couplings);
1837 vertices[0]->add(
_config.couplings);
1842 else if (!
_config.prodCouplings.empty() && !
_config.decCouplings.empty()) {
1843 std::vector<RooListProxy *> vertices;
1845 cxcoutP(InputArguments) <<
"prod/dec couplings provided" << std::endl;
1846 extractOperators(
_config.prodCouplings, operators);
1847 extractOperators(
_config.decCouplings, operators);
1849 new RooListProxy(
"!production",
"set of couplings in the production vertex",
this,
true,
false));
1850 vertices.push_back(
new RooListProxy(
"!decay",
"set of couplings in the decay vertex",
this,
true,
false));
1853 vertices[0]->addOwned(
_config.prodCouplings);
1854 vertices[1]->addOwned(
_config.decCouplings);
1856 cxcoutP(InputArguments) <<
"adding non-own operators" << std::endl;
1858 vertices[0]->add(
_config.prodCouplings);
1859 vertices[1]->add(
_config.decCouplings);
1871 std::stringstream
name;
1872 name <<
"noInterference";
1873 for (
auto c : nonInterfering) {
1877 for (
auto c : nonInterfering) {
1888 for (
size_t i = 0; i < nonInterfering.size(); ++i) {
1901 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
1908 auto nNP0 = std::make_unique<RooRealVar>(
"nNP0",
"nNP0", 1., 0, 1.);
1909 nNP0->setStringAttribute(
"NewPhysics",
"0");
1910 nNP0->setConstant(
true);
1911 _flags.addOwned(std::move(nNP0));
1912 auto nNP1 = std::make_unique<RooRealVar>(
"nNP1",
"nNP1", 1., 0, 1.);
1913 nNP1->setStringAttribute(
"NewPhysics",
"1");
1914 nNP1->setConstant(
true);
1915 _flags.addOwned(std::move(nNP1));
1916 auto nNP2 = std::make_unique<RooRealVar>(
"nNP2",
"nNP2", 1., 0, 1.);
1917 nNP2->setStringAttribute(
"NewPhysics",
"2");
1918 nNP2->setConstant(
true);
1919 _flags.addOwned(std::move(nNP2));
1920 auto nNP3 = std::make_unique<RooRealVar>(
"nNP3",
"nNP3", 1., 0, 1.);
1921 nNP3->setStringAttribute(
"NewPhysics",
"3");
1922 nNP3->setConstant(
true);
1923 _flags.addOwned(std::move(nNP3));
1924 auto nNP4 = std::make_unique<RooRealVar>(
"nNP4",
"nNP4", 1., 0, 1.);
1925 nNP4->setStringAttribute(
"NewPhysics",
"4");
1926 nNP4->setConstant(
true);
1927 _flags.addOwned(std::move(nNP4));
1941 for (
size_t j = 0; j < other.
_diagrams.size(); ++j) {
1942 std::vector<RooListProxy *> diagram;
1945 diagram.push_back(list);
1974 _binWidths(
"binWidths",
"set of bin width objects", this,
true, false)
1998 FeynmanDiagram diagram;
1999 std::vector<bool> prod;
2000 std::vector<bool> dec;
2001 for (
int i = 0; i < nboth; ++i) {
2002 prod.push_back(
true);
2003 dec.push_back(
true);
2005 for (
int i = 0; i < nprod; ++i) {
2006 prod.push_back(
true);
2007 dec.push_back(
false);
2009 for (
int i = 0; i < ndec; ++i) {
2010 prod.push_back(
false);
2011 dec.push_back(
true);
2013 diagram.push_back(prod);
2014 diagram.push_back(dec);
2015 MorphFuncPattern morphfuncpattern;
2016 ::collectPolynomials(morphfuncpattern, diagram);
2017 return morphfuncpattern.size();
2027 for (
auto vertex : vertices) {
2028 extractOperators(*vertex, operators);
2029 extractCouplings(*vertex, couplings);
2031 FeynmanDiagram diagram;
2032 ::fillFeynmanDiagram(diagram, vertices, couplings);
2033 MorphFuncPattern morphfuncpattern;
2034 ::collectPolynomials(morphfuncpattern, diagram);
2035 return morphfuncpattern.size();
2041std::map<std::string, std::string>
2043 const std::vector<std::vector<std::string>> &vertices_str)
2045 std::stack<RooArgList> ownedVertices;
2046 std::vector<RooArgList *> vertices;
2048 for (
const auto &vtx : vertices_str) {
2049 ownedVertices.emplace();
2050 auto &vertex = ownedVertices.top();
2051 for (
const auto &
c : vtx) {
2054 auto couplingOwner = std::make_unique<RooRealVar>(
c.c_str(),
c.c_str(), 1., 0., 10.);
2055 coupling = couplingOwner.get();
2056 couplings.
addOwned(std::move(couplingOwner));
2058 vertex.add(*coupling);
2060 vertices.push_back(&vertex);
2069std::map<std::string, std::string>
2071 const std::vector<RooArgList *> &vertices,
RooArgList &couplings)
2079std::map<std::string, std::string>
2081 const std::vector<RooArgList *> &vertices,
RooArgList &couplings,
2083 const std::vector<std::vector<std::string>> &nonInterfering)
2085 FormulaList formulas = ::createFormulas(
"", inputs, flagValues, {vertices}, couplings, flags, nonInterfering);
2087 extractOperators(couplings, operators);
2088 Matrix matrix(::buildMatrixT<Matrix>(inputs, formulas, operators, flagValues, flags));
2089 if (
size(matrix) < 1) {
2090 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
2094 auto retval = buildSampleWeightStrings(inputs, formulas, inverse);
2102 const std::vector<RooArgList *> &vertices,
RooArgList &couplings,
2105 const std::vector<std::vector<std::string>> &nonInterfering)
2107 FormulaList formulas = ::createFormulas(
"", inputs, flagValues, {vertices}, couplings, flags, nonInterfering);
2109 extractOperators(couplings, operators);
2110 Matrix matrix(::buildMatrixT<Matrix>(inputs, formulas, operators, flagValues, flags));
2111 if (
size(matrix) < 1) {
2112 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
2117 ::buildSampleWeights(retval, (
const char *)
nullptr , inputs, formulas, inverse);
2125 const std::vector<RooArgList *> &vertices,
RooArgList &couplings)
2140 coutE(Eval) <<
"unable to retrieve morphing function" << std::endl;
2143 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2151 TString sname(prod->GetName());
2172 auto wname = std::string(
"w_") +
name +
"_" + this->
GetName();
2173 return dynamic_cast<RooAbsReal *
>(cache->_weights.find(wname.c_str()));
2191 auto weightName = std::string(
"w_") + sample.first +
"_" + this->
GetName();
2192 auto weight =
static_cast<RooAbsReal *
>(cache->_weights.find(weightName.c_str()));
2207 double val = obj->getVal();
2208 if (obj->isConstant())
2210 double variation =
r.Gaus(1, z);
2211 obj->setVal(val * variation);
2226 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
2253 cache->_inverse =
m;
2256 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
2271 coutE(Caching) <<
"unable to create cache!" << std::endl;
2272 _cacheMgr.setObj(
nullptr,
nullptr, cache,
nullptr);
2290 coutE(Caching) <<
"unable to create cache!" << std::endl;
2291 _cacheMgr.setObj(
nullptr,
nullptr, cache,
nullptr);
2315 cxcoutP(Caching) <<
"creating cache from getCache function for " <<
this << std::endl;
2316 cxcoutP(Caching) <<
"current storage has size " <<
_sampleMap.size() << std::endl;
2319 _cacheMgr.setObj(
nullptr,
nullptr, cache,
nullptr);
2321 coutE(Caching) <<
"unable to create cache!" << std::endl;
2470 auto paramhist = loadFromFileResidentFolder<TH1>(file, foldername,
"param_card");
2471 setParams(paramhist.get(),
_operators,
false);
2481 const std::string
name(foldername);
2504 coutE(InputArguments) <<
"observable not available!" << std::endl;
2516 coutE(InputArguments) <<
"bin width not available!" << std::endl;
2535 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2538 const int nbins = observable->
getBins();
2542 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2543 for (
int i = 0; i < nbins; ++i) {
2551 RooAbsArg *phys = prod->components().find(
Form(
"phys_%s", prod->GetName()));
2558 double weight = formula->
getVal();
2560 unc2 += w2 * weight * weight;
2561 unc += sqrt(w2) * weight;
2562 val += dhist.
weight(i) * weight;
2565 hist->
SetBinError(i + 1, correlateErrors ? unc : sqrt(unc2));
2567 return hist.release();
2576 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2578 coutE(InputArguments) <<
"unable to retrieve morphing function" << std::endl;
2579 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2581 if (prod->getVal() != 0) {
2595 std::string pname(paramname);
2597 bool isUsed =
false;
2598 for (
const auto &sample :
_config.paramCards) {
2599 double thisval = sample.second.at(pname);
2600 if (thisval != val) {
2616 std::string
cname(couplname);
2623 bool isUsed =
false;
2624 for (
const auto &sample :
_config.paramCards) {
2626 double thisval = coupling->
getVal();
2627 if (thisval != val) {
2652 return cache->_formulas.size();
2660 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2662 std::cerr <<
"Error: unable to retrieve morphing function" << std::endl;
2665 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2670 name.Prepend(
"phys_");
2671 if (!args->find(
name.Data())) {
2674 double val = formula->getVal();
2676 std::cout << formula->GetName() <<
": " << val <<
" = " << formula->GetTitle() << std::endl;
2696 return &(cache->_couplings);
2709 double val = var->
getVal();
2710 couplings[
name] = val;
2737 auto func = std::make_unique<RooRealSumFunc>(*(cache->_sumFunc));
2740 return std::make_unique<RooWrapperPdf>(
Form(
"pdf_%s", func->GetName()),
Form(
"pdf of %s", func->GetTitle()), *func);
2749 return cache->_sumFunc.get();
2766 return this->
createPdf()->expectedEvents(nset);
2776 return this->
createPdf()->expectedEvents(set);
2785 return createPdf()->expectedEvents(&nset);
2798 auto weightName = std::string(
"w_") + sample.first +
"_" + this->
GetName();
2799 auto weight =
static_cast<RooAbsReal *
>(cache->_weights.find(weightName.c_str()));
2801 coutE(InputArguments) <<
"unable to find object " + weightName << std::endl;
2815 double w = weight->getVal();
2816 unc2 += newunc2 *
w *
w;
2855 for (
auto c : couplings) {
2856 std::cout <<
c.first <<
": " <<
c.second << std::endl;
2890 std::cerr <<
"unable to acquire in-built function!" << std::endl;
2923 const char *rangeName)
const
2967 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
2978 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
2991 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
2992 return cache->_condition;
2998std::unique_ptr<RooRatio>
3003 for (
auto it : nr) {
3006 for (
auto it : dr) {
3010 return make_unique<RooRatio>(
name, title, num, denom);
3018std::vector<std::string> asStringV(std::string
const &arg)
3020 std::vector<std::string> out;
3022 for (std::string &tok :
ROOT::Split(arg,
",{}",
true)) {
3023 if (tok[0] ==
'\'') {
3024 out.emplace_back(tok.substr(1, tok.size() - 2));
3026 throw std::runtime_error(
"Strings in factory expressions need to be in single quotes!");
3036 create(RooFactoryWSTool &,
const char *typeName,
const char *instName, std::vector<std::string> args)
override;
3039std::string LMIFace::create(
RooFactoryWSTool &ft,
const char * ,
const char *instanceName,
3040 std::vector<std::string> args)
3043 const std::array<std::string, 4> funcArgs{{
"fileName",
"observableName",
"couplings",
"folders"}};
3044 std::map<string, string> mappedInputs;
3046 for (
unsigned int i = 1; i < args.size(); i++) {
3047 if (args[i].find(
"$fileName(") != 0 && args[i].find(
"$observableName(") != 0 &&
3048 args[i].find(
"$couplings(") != 0 && args[i].find(
"$folders(") != 0 && args[i].find(
"$NewPhysics(") != 0) {
3049 throw std::string(
Form(
"%s::create() ERROR: unknown token %s encountered", instanceName, args[i].c_str()));
3053 for (
unsigned int i = 0; i < args.size(); i++) {
3054 if (args[i].find(
"$NewPhysics(") == 0) {
3056 for (
const auto &subarg : subargs) {
3057 std::vector<std::string> parts =
ROOT::Split(subarg,
"=");
3058 if (parts.size() == 2) {
3061 throw std::string(
Form(
"%s::create() ERROR: unknown token %s encountered, check input provided for %s",
3062 instanceName, subarg.c_str(), args[i].c_str()));
3067 if (subargs.size() == 1) {
3069 for (
auto const ¶m : funcArgs) {
3070 if (args[i].find(param) != string::npos)
3071 mappedInputs[param] = subargs[0];
3075 Form(
"Incorrect number of arguments in %s, have %d, expect 1", args[i].c_str(), (
Int_t)subargs.size()));
3080 RooLagrangianMorphFunc::Config config;
3081 config.
fileName = asStringV(mappedInputs[
"fileName"])[0];
3082 config.
observableName = asStringV(mappedInputs[
"observableName"])[0];
3083 config.
folderNames = asStringV(mappedInputs[
"folders"]);
3088 return instanceName;
3097 RooFactoryWSTool::IFace *iface =
new LMIFace;
true
Register systematic variations for multiple existing columns using auto-generated tags.
RooCollectionProxy< RooArgList > RooListProxy
ROOT::RRangeCast< T, true, Range_t > dynamic_range_cast(Range_t &&coll)
ROOT::RRangeCast< T, false, Range_t > static_range_cast(Range_t &&coll)
size_t size< TMatrixD >(const TMatrixD &mat)
void writeMatrixToStreamT(const MatrixT &matrix, std::ostream &stream)
write a matrix to a stream
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
static constexpr double morphUnityDeviation
Matrix makeSuperMatrix(const TMatrixD &in)
convert a TMatrixD into a Matrix
static constexpr double morphLargestWeight
void writeMatrixToFileT(const MatrixT &matrix, const char *fname)
write a matrix to a text file
double invertMatrix(const Matrix &matrix, Matrix &inverse)
TMatrixD makeRootMatrix(const Matrix &in)
convert a matrix into a TMatrixD
Matrix diagMatrix(size_t n)
create a new diagonal matrix of size n
void printMatrix(const TMatrixD &mat)
write a matrix
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 input
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void w
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char cname
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
TMatrixT< Double_t > TMatrixD
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
std::string & operator+=(std::string &left, const TString &right)
TTime operator*(const TTime &t1, const TTime &t2)
Common abstract base class for objects that represent a value and a "shape" in RooFit.
void Print(Option_t *options=nullptr) const override
Print the object to the defaultPrintStream().
bool isConstant() const
Check if the "Constant" attribute is set.
bool addOwnedComponents(const RooAbsCollection &comps)
Take ownership of the contents of 'comps'.
const RefCountList_t & servers() const
List of all servers of this object.
void setValueDirty()
Mark the element dirty. This forces a re-evaluation when a value is requested.
bool getAttribute(const Text_t *name) const
Check if a named attribute is set. By default, all attributes are unset.
void setAttribute(const Text_t *name, bool value=true)
Set (default) or clear a named boolean attribute of this object.
RooAbsArg()
Default constructor.
virtual double * array() const =0
virtual bool add(const RooAbsArg &var, bool silent=false)
Add the specified argument to list.
Storage_t::size_type size() const
virtual bool addOwned(RooAbsArg &var, bool silent=false)
Add an argument and transfer the ownership to the collection.
RooAbsArg * find(const char *name) const
Find object with given name in list.
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
Int_t numBins(const char *rangeName=nullptr) const override
virtual Int_t getBins(const char *name=nullptr) const
Get number of bins of currently defined range.
void setConstant(bool value=true)
virtual double getMax(const char *name=nullptr) const
Get maximum of currently defined range.
void setBin(Int_t ibin, const char *rangeName=nullptr) override
Set value to center of bin 'ibin' of binning 'rangeName' (or of default binning if no range is specif...
virtual double getMin(const char *name=nullptr) const
Get minimum of currently defined range.
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.
RooAbsReal()
coverity[UNINIT_CTOR] Default constructor
friend class RooRealSumFunc
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.
Implements a RooAbsBinning in terms of an array of boundary values, posing no constraints on the choi...
Container class to hold N-dimensional binned data.
double weight(std::size_t i) const
Return weight of i-th bin.
double weightSquared(std::size_t i) const
Return squared weight sum of i-th bin.
A real-valued function sampled from a multidimensional histogram.
RooDataHist & dataHist()
Return RooDataHist that is represented.
static RooLagrangianMorphFunc::CacheElem * createCache(const RooLagrangianMorphFunc *func)
create all the temporary objects required by the class
void buildMatrix(const RooLagrangianMorphFunc::ParamMap &inputParameters, const RooLagrangianMorphFunc::FlagMap &inputFlags, const List &flags)
build and invert the morphing matrix
static RooLagrangianMorphFunc::CacheElem * createCache(const RooLagrangianMorphFunc *func, const Matrix &inverse)
create all the temporary objects required by the class function variant with precomputed inverse matr...
std::unique_ptr< RooRealSumFunc > _sumFunc
RooArgList containedArgs(Action) override
retrieve the list of contained args
void operModeHook(RooAbsArg::OperMode) override
Interface for changes of operation mode.
void createComponents(const RooLagrangianMorphFunc::ParamMap &inputParameters, const RooLagrangianMorphFunc::FlagMap &inputFlags, const char *funcname, const std::vector< std::vector< RooListProxy * > > &diagramProxyList, const std::vector< std::vector< std::string > > &nonInterfering, const RooArgList &flags)
create the basic objects required for the morphing
void buildMorphingFunction(const char *name, const RooLagrangianMorphFunc::ParamMap &inputParameters, const std::map< std::string, int > &storage, const RooArgList &physics, bool allowNegativeYields, RooRealVar *observable, RooRealVar *binWidth)
build the final morphing function
bool isParameterConstant(const char *paramname) const
return true if the parameter with the given name is set constant, false otherwise
bool isBinnedDistribution(const RooArgSet &obs) const override
check if this PDF is a binned distribution in the given observable
int nPolynomials() const
return the number of samples in this morphing function
void setParameter(const char *name, double value)
set one parameter to a specific value
RooArgSet createWeights(const ParamMap &inputs, const std::vector< RooArgList * > &vertices, RooArgList &couplings, const FlagMap &inputFlags, const RooArgList &flags, const std::vector< std::vector< std::string > > &nonInterfering)
create only the weight formulas. static function for external usage.
ParamSet getMorphParameters() const
retrieve the parameter set
double evaluate() const override
call getVal on the internal function
void disableInterference(const std::vector< const char * > &nonInterfering)
disable interference between terms
RooProduct * getSumElement(const char *name) const
return the RooProduct that is the element of the RooRealSumPdfi corresponding to the given sample nam...
RooRealVar * getBinWidth() const
retrieve the histogram observable
void writeMatrixToFile(const TMatrixD &matrix, const char *fname)
write a matrix to a file
RooRealVar * getParameter(const char *name) const
retrieve the RooRealVar object incorporating the parameter with the given name
bool useCoefficients(const TMatrixD &inverse)
setup the morphing function with a predefined inverse matrix call this function before any other afte...
const RooArgSet * getParameterSet() const
get the set of parameters
TMatrixD readMatrixFromStream(std::istream &stream)
read a matrix from a stream
std::vector< std::vector< std::string > > _nonInterfering
std::vector< std::string > getSamples() const
return the vector of sample names, used to build the morph func
int countSamples(std::vector< RooArgList * > &vertices)
calculate the number of samples needed to morph a certain physics process
void setCacheAndTrackHints(RooArgSet &) override
Retrieve the matrix of coefficients.
ParamSet getCouplings() const
retrieve a set of couplings (-?-)
void printSampleWeights() const
print the current sample weights
std::map< const std::string, double > ParamSet
void writeMatrixToStream(const TMatrixD &matrix, std::ostream &stream)
write a matrix to a stream
std::map< const std::string, ParamSet > ParamMap
bool updateCoefficients()
Retrieve the new physics objects and update the weights in the morphing function.
RooRealVar * getObservable() const
retrieve the histogram observable
int countContributingFormulas() const
count the number of formulas that correspond to the current parameter set
std::list< double > * plotSamplingHint(RooAbsRealLValue &, double, double) const override
retrieve the sample Hint
RooRealVar * getFlag(const char *name) const
retrieve the RooRealVar object incorporating the flag with the given name
void randomizeParameters(double z)
randomize the parameters a bit useful to test and debug fitting
bool isCouplingUsed(const char *couplname)
check if there is any morphing power provided for the given coupling morphing power is provided as so...
void readParameters(TDirectory *f)
read the parameters from the input file
double getScale()
get energy scale of the EFT expansion
double getCondition() const
Retrieve the condition of the coefficient matrix.
TMatrixD getMatrix() const
Retrieve the matrix of coefficients.
void printWeights() const
print the current sample weights
void printCouplings() const
print a set of couplings
TMatrixD readMatrixFromFile(const char *fname)
read a matrix from a text file
~RooLagrangianMorphFunc() override
default destructor
void printParameters() const
print the parameters and their current values
void printPhysics() const
print the current physics values
static std::unique_ptr< RooRatio > makeRatio(const char *name, const char *title, RooArgList &nr, RooArgList &dr)
Return the RooRatio form of products and denominators of morphing functions.
void setFlag(const char *name, double value)
set one flag to a specific value
TH1 * createTH1(const std::string &name)
retrieve a histogram output of the current morphing settings
double expectedUncertainty() const
return the expected uncertainty for the current parameter set
int nParameters() const
return the number of parameters in this morphing function
bool hasParameter(const char *paramname) const
check if a parameter of the given name is contained in the list of known parameters
bool checkObservables(const RooArgSet *nset) const override
check if observable exists in the RooArgSet (-?-)
bool hasCache() const
return true if a cache object is present, false otherwise
void printFlags() const
print the flags and their current values
void setScale(double val)
set energy scale of the EFT expansion
TMatrixD getInvertedMatrix() const
Retrieve the matrix of coefficients after inversion.
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Retrieve the matrix of coefficients.
RooAbsArg::CacheMode canNodeBeCached() const override
Retrieve the matrix of coefficients.
void updateSampleWeights()
update sample weight (-?-)
void setParameters(const char *foldername)
set the morphing parameters to those supplied in the sample with the given name
RooObjCacheManager _cacheMgr
! The cache manager
bool isParameterUsed(const char *paramname) const
check if there is any morphing power provided for the given parameter morphing power is provided as s...
RooListProxy _observables
RooAbsPdf::ExtendMode extendMode() const
return extended mored capabilities
std::map< const std::string, FlagSet > FlagMap
bool forceAnalyticalInt(const RooAbsArg &arg) const override
Force analytical integration for the given observable.
void setParameterConstant(const char *paramname, bool constant) const
call setConstant with the boolean argument provided on the parameter with the given name
void disableInterferences(const std::vector< std::vector< const char * > > &nonInterfering)
disable interference between terms
void printSamples() const
print all the known samples to the console
double getParameterValue(const char *name) const
set one parameter to a specific value
void setup(bool ownParams=true)
setup this instance with the given set of operators and vertices if own=true, the class will own the ...
void printMetaArgs(std::ostream &os) const override
Retrieve the matrix of coefficients.
std::unique_ptr< RooWrapperPdf > createPdf() const
(currently similar to cloning the Pdf
RooAbsReal * getSampleWeight(const char *name)
retrieve the weight (prefactor) of a sample with the given name
std::map< std::string, std::string > createWeightStrings(const ParamMap &inputs, const std::vector< std::vector< std::string > > &vertices)
create only the weight formulas. static function for external usage.
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Retrieve the mat.
std::vector< std::vector< RooListProxy * > > _diagrams
double expectedEvents() const
return the number of expected events for the current parameter set
std::map< std::string, int > _sampleMap
RooLagrangianMorphFunc::CacheElem * getCache() const
retrieve the cache object
RooRealVar * setupObservable(const char *obsname, TClass *mode, TObject *inputExample)
setup observable, recycle existing observable if defined
const RooArgList * getCouplingSet() const
get the set of couplings
RooRealSumFunc * getFunc() const
get the func
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
retrieve the list of bin boundaries
void printEvaluation() const
print the contributing samples and their respective weights
bool writeCoefficients(const char *filename)
write the inverse matrix to a file
void collectInputs(TDirectory *f)
retrieve the physics inputs
void init()
initialise inputs required for the morphing function
RooLinearCombination is a class that helps perform linear combination of floating point numbers and p...
void setCoefficient(size_t idx, RooFit::SuperFloat c)
RooFit::SuperFloat getCoefficient(size_t idx)
A histogram function that assigns scale parameters to every bin.
const RooArgList & paramList() const
Represents the product of a given set of RooAbsReal objects.
std::list< double > * binBoundaries(RooAbsRealLValue &, double, double) const override
Retrieve bin boundaries if this distribution is binned in obs.
void printMetaArgs(std::ostream &os) const override
Customized printing of arguments of a RooRealSumFunc to more intuitively reflect the contents of the ...
Int_t getAnalyticalIntegralWN(RooArgSet &allVars, RooArgSet &numVars, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Variant of getAnalyticalIntegral that is also passed the normalization set that should be applied to ...
CacheMode canNodeBeCached() const override
double analyticalIntegralWN(Int_t code, const RooArgSet *normSet, const char *rangeName=nullptr) const override
Implements the actual analytical integral(s) advertised by getAnalyticalIntegral.
bool isBinnedDistribution(const RooArgSet &obs) const override
Tests if the distribution is binned. Unless overridden by derived classes, this always returns false.
bool checkObservables(const RooArgSet *nset) const override
Overloadable function in which derived classes can implement consistency checks of the variables.
void setCacheAndTrackHints(RooArgSet &) override
std::list< double > * plotSamplingHint(RooAbsRealLValue &, double, double) const override
Interface for returning an optional hint for initial sampling points when constructing a curve projec...
bool forceAnalyticalInt(const RooAbsArg &arg) const override
Variable that can be changed from the outside.
void setVal(double value) override
Set value of variable to 'value'.
void setError(double value)
void setMin(const char *name, double value, bool shared=true)
Set minimum of name range to given value.
void setBins(Int_t nBins, const char *name=nullptr, bool shared=true)
Create a uniform binning under name 'name' for this variable.
void setBinning(const RooAbsBinning &binning, const char *name=nullptr, bool shared=true)
Add given binning under name 'name' with this variable.
void setMax(const char *name, double value, bool shared=true)
Set maximum of name range to given value.
const RooAbsBinning & getBinning(const char *name=nullptr, bool verbose=true, bool createOnTheFly=false, bool shared=true) const override
Return binning definition with name.
RooAbsArg * arg(RooStringView name) const
Return RooAbsArg with given name. A null pointer is returned if none is found.
bool import(const RooAbsArg &arg, const RooCmdArg &arg1={}, const RooCmdArg &arg2={}, const RooCmdArg &arg3={}, const RooCmdArg &arg4={}, const RooCmdArg &arg5={}, const RooCmdArg &arg6={}, const RooCmdArg &arg7={}, const RooCmdArg &arg8={}, const RooCmdArg &arg9={})
Import a RooAbsArg object, e.g.
Class to manage histogram axis.
const char * GetBinLabel(Int_t bin) const
Return label for bin.
TClass instances represent classes, structs and namespaces in the ROOT type system.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Double_t GetCondition() const
Bool_t Invert(TMatrixD &inv)
For a matrix A(m,m), its inverse A_inv is defined as A * A_inv = A_inv * A = unit (m x m) Ainv is ret...
Describe directory structure in memory.
virtual TObject * Get(const char *namecycle)
A file, usually with extension .root, that stores data and code in the form of serialized objects in ...
virtual Bool_t IsOpen() const
Returns kTRUE in case file is open and kFALSE if file is not open.
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
<div class="legacybox"><h2>Legacy Code</h2> TFolder is a legacy interface: there will be no bug fixes...
TCollection * GetListOfFolders() const
virtual void SetOwner(Bool_t owner=kTRUE)
Set ownership.
TH1 is the base class of all histogram classes in ROOT.
virtual Int_t GetNbinsX() const
virtual void SetBinError(Int_t bin, Double_t error)
Set the bin Error Note that this resets the bin eror option to be of Normal Type and for the non-empt...
virtual Double_t Integral(Option_t *option="") const
Return integral of bin contents.
virtual void SetBinContent(Int_t bin, Double_t content)
Set bin content see convention for numbering bins in TH1::GetBin In case the bin number is greater th...
virtual Double_t GetBinLowEdge(Int_t bin) const
Return bin lower edge for 1D histogram.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
virtual void Scale(Double_t c1=1, Option_t *option="")
Multiply this histogram by a constant c1.
virtual TMatrixTBase< Element > & UnitMatrix()
Make a unit matrix (matrix need not be a square one).
TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1) override
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
Class used by TMap to store (key,value) pairs.
Named parameter, streamable and storable.
const AParamType & GetVal() const
Random number generator class based on M.
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
const char * Data() const
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
RooCmdArg Silence(bool flag=true)
void(off) SmallVectorTemplateBase< T
std::vector< std::string > Split(std::string_view str, std::string_view delims, bool skipEmpty=false)
Splits a string at each character in delims.
std::string observableName
std::vector< std::string > folderNames