76using std::cerr, std::string, std::make_unique, std::vector;
87#define NaN std::numeric_limits<double>::quiet_NaN()
96template <
typename Test,
template <
typename...>
class Ref>
100template <
template <
typename...>
class Ref,
typename... Args>
111template <
class MatrixT>
112inline size_t size(
const MatrixT &matrix);
122template <
class MatrixT>
125 if (!stream.good()) {
128 for (
size_t i = 0; i <
size(matrix); ++i) {
129 for (
size_t j = 0; j <
size(matrix); ++j) {
131 stream << std::setprecision(RooFit::SuperFloatPrecision::digits10) << matrix(i, j) <<
"\t";
133 stream << matrix(i, j) <<
"\t";
143template <
class MatrixT>
146 std::ofstream of(fname);
148 cerr <<
"unable to read file '" << fname <<
"'!" << std::endl;
157#pragma GCC diagnostic push
158#pragma GCC diagnostic ignored "-Wshadow"
159#pragma GCC diagnostic ignored "-Wunused-local-typedefs"
160#include <boost/numeric/ublas/io.hpp>
161#include <boost/numeric/ublas/lu.hpp>
162#include <boost/numeric/ublas/matrix.hpp>
163#include <boost/numeric/ublas/matrix_expression.hpp>
164#include <boost/numeric/ublas/symmetric.hpp>
165#include <boost/numeric/ublas/triangular.hpp>
166#include <boost/operators.hpp>
168#pragma GCC diagnostic pop
170typedef boost::numeric::ublas::matrix<RooFit::SuperFloat>
Matrix;
177 for (
size_t i = 0; i < mat.size1(); ++i) {
178 for (
size_t j = 0; j < mat.size2(); ++j) {
179 std::cout << std::setprecision(RooFit::SuperFloatPrecision::digits10) << mat(i, j) <<
" ,\t";
181 std::cout << std::endl;
189inline size_t size<Matrix>(
const Matrix &matrix)
191 return matrix.size1();
199 return boost::numeric::ublas::identity_matrix<RooFit::SuperFloat>(
n);
209 for (
size_t i = 0; i <
n; ++i) {
210 for (
size_t j = 0; j <
n; ++j) {
211 mat(i, j) =
double(in(i, j));
224 for (
size_t i = 0; i <
n; ++i) {
225 for (
size_t j = 0; j <
n; ++j) {
226 mat(i, j) =
double(in(i, j));
238 return prod(
m, otherM);
246 boost::numeric::ublas::permutation_matrix<size_t> pm(
size(matrix));
250 int res = lu_factorize(lu, pm);
252 std::stringstream ss;
254 cxcoutP(Eval) << ss.str << std::endl;
257 lu_substitute(lu, pm, inverse);
258 }
catch (boost::numeric::ublas::internal_logic &error) {
312 bool status = lu.
Invert(inverse);
315 std::cerr <<
" matrix is not invertible!" << std::endl;
318 const size_t n =
size(inverse);
320 for (
size_t i = 0; i <
n; ++i) {
321 for (
size_t j = 0; j <
n; ++j) {
322 if (std::abs(inverse(i, j)) < 1
e-9)
341typedef std::vector<std::vector<bool>> FeynmanDiagram;
342typedef std::vector<std::vector<int>> MorphFuncPattern;
343typedef std::map<int, std::unique_ptr<RooAbsReal>> FormulaList;
351 retval.ReplaceAll(
"/",
"_");
352 retval.ReplaceAll(
"^",
"");
353 retval.ReplaceAll(
"*",
"X");
354 retval.ReplaceAll(
"[",
"");
355 retval.ReplaceAll(
"]",
"");
363std::string concatNames(
const List &
c,
const char *sep)
365 std::stringstream ss;
370 ss << itr->GetName();
380template <
class A,
class B>
381inline void assignElement(A &
a,
const B &
b)
383 a =
static_cast<A
>(
b);
388template <
class MatrixT>
389inline MatrixT readMatrixFromStreamT(std::istream &stream)
391 std::vector<std::vector<RooFit::SuperFloat>> matrix;
392 std::vector<RooFit::SuperFloat>
line;
393 while (!stream.eof()) {
394 if (stream.peek() ==
'\n') {
402 while (stream.peek() ==
' ' || stream.peek() ==
'\t') {
405 if (stream.peek() ==
'\n') {
406 matrix.push_back(
line);
410 MatrixT retval(matrix.size(), matrix.size());
411 for (
size_t i = 0; i < matrix.size(); ++i) {
412 if (matrix[i].
size() != matrix.size()) {
413 std::cerr <<
"matrix read from stream doesn't seem to be square!" << std::endl;
415 for (
size_t j = 0; j < matrix[i].size(); ++j) {
416 assignElement(retval(i, j), matrix[i][j]);
425template <
class MatrixT>
426inline MatrixT readMatrixFromFileT(
const char *fname)
428 std::ifstream in(fname);
430 std::cerr <<
"unable to read file '" << fname <<
"'!" << std::endl;
432 MatrixT mat = readMatrixFromStreamT<MatrixT>(in);
441void readValues(std::map<const std::string, T> &myMap,
TH1 *h_pc)
445 for (
int ibx = 1; ibx <= h_pc->
GetNbinsX(); ++ibx) {
450 if (!s_coup.empty()) {
451 myMap[s_coup] =
T(coup_val);
460void setOwnerRecursive(
TFolder *theFolder)
465 for (
auto *subdir : *subdirs) {
466 auto thisfolder =
dynamic_cast<TFolder *
>(subdir);
469 setOwnerRecursive(thisfolder);
482std::unique_ptr<TFolder> readOwningFolderFromFile(
TDirectory *inFile,
const std::string &folderName)
484 std::unique_ptr<TFolder> theFolder(inFile->
Get<
TFolder>(folderName.c_str()));
486 std::cerr <<
"Error: unable to access data from folder '" << folderName <<
"' from file '" << inFile->
GetName()
487 <<
"'!" << std::endl;
490 setOwnerRecursive(theFolder.get());
503template <
class AObjType>
504std::unique_ptr<AObjType> loadFromFileResidentFolder(
TDirectory *inFile,
const std::string &folderName,
505 const std::string &objName,
bool notFoundError =
true)
507 auto folder = readOwningFolderFromFile(inFile, folderName);
511 AObjType *loadedObject =
dynamic_cast<AObjType *
>(folder->FindObject(objName.c_str()));
514 std::stringstream errstr;
515 errstr <<
"Error: unable to retrieve object '" << objName <<
"' from folder '" << folderName
516 <<
"'. contents are:";
517 TIter next(folder->GetListOfFolders()->begin());
519 while ((
f =
static_cast<TFolder *
>(next()))) {
522 std::cerr << errstr.str() << std::endl;
528 return std::unique_ptr<AObjType>{
static_cast<AObjType *
>(loadedObject->Clone())};
535void readValues(std::map<const std::string, T> &myMap,
TDirectory *file,
const std::string &
name,
536 const std::string &key =
"param_card",
bool notFoundError =
true)
538 auto h_pc = loadFromFileResidentFolder<TH1F>(file,
name, key, notFoundError);
539 readValues(myMap, h_pc.get());
548void readValues(std::map<
const std::string, std::map<const std::string, T>> &inputParameters,
TDirectory *
f,
549 const std::vector<std::string> &names,
const std::string &key =
"param_card",
bool notFoundError =
true)
551 inputParameters.clear();
554 for (
size_t i = 0; i < names.size(); i++) {
555 const std::string
name(names[i]);
557 readValues(inputParameters[
name],
f,
name, key, notFoundError);
572 if (!file || !file->
IsOpen()) {
575 std::cerr <<
"could not open file '" <<
filename <<
"'!" << std::endl;
597inline void extractServers(
const RooAbsArg &coupling,
T2 &operators)
600 for (
const auto server : coupling.servers()) {
601 extractServers(*server, operators);
605 operators.add(coupling);
612template <class T1, class T2, typename std::enable_if<!is_specialization<T1, std::vector>::value,
T1>
::type * =
nullptr>
613inline void extractOperators(
const T1 &couplings,
T2 &operators)
617 for (
auto itr : couplings) {
618 extractServers(*itr, operators);
625template <class T1, class T2, typename std::enable_if<is_specialization<T1, std::vector>::value,
T1>
::type * =
nullptr>
626inline void extractOperators(
const T1 &
vec,
T2 &operators)
628 for (
const auto &
v :
vec) {
629 extractOperators(
v, operators);
636template <
class T1,
class T2>
637inline void extractCouplings(
const T1 &inCouplings,
T2 &outCouplings)
639 for (
auto itr : inCouplings) {
640 if (!outCouplings.find(itr->GetName())) {
643 outCouplings.add(*itr);
652inline bool setParam(
RooRealVar *
p,
double val,
bool force)
655 if (val >
p->getMax()) {
659 std::cerr <<
": parameter " <<
p->
GetName() <<
" out of bounds: " << val <<
" > " <<
p->getMax() << std::endl;
662 }
else if (val < p->getMin()) {
666 std::cerr <<
": parameter " <<
p->
GetName() <<
" out of bounds: " << val <<
" < " <<
p->getMin() << std::endl;
679template <
class T1,
class T2>
680inline bool setParams(
const T2 &args,
T1 val)
682 for (
auto itr : args) {
686 setParam(param, val,
true);
695template <
class T1,
class T2>
697setParams(
const std::map<const std::string, T1> &point,
const T2 &args,
bool force =
false,
T1 defaultVal = 0)
700 for (
auto itr : args) {
704 ok = setParam(param, defaultVal, force) && ok;
707 for (
auto paramit : point) {
709 const std::string param(paramit.first);
715 ok = setParam(
p, paramit.second, force) && ok;
725inline bool setParams(
TH1 *hist,
const T &args,
bool force =
false)
729 for (
auto itr : args) {
733 ok = setParam(param, 0., force) && ok;
738 for (
int i = 1; i <= ax->
GetNbins(); ++i) {
756 for (
auto itr : parameters) {
773 bool binningOK =
false;
774 for (
auto sampleit : inputParameters) {
775 const std::string sample(sampleit.first);
776 auto hist = loadFromFileResidentFolder<TH1>(file, sample, varname,
true);
784 auto it = list_hf.find(sample);
785 if (it != list_hf.end()) {
797 std::vector<double> bins;
798 for (
int i = 1; i <
n + 1; ++i) {
806 TString histname = makeValidName(
"dh_" + sample +
"_" +
name);
807 TString funcname = makeValidName(
"phys_" + sample +
"_" +
name);
811 auto dh = std::make_unique<RooDataHist>(histname.
Data(), histname.
Data(), vars, hist.get());
813 auto hf = std::make_unique<RooHistFunc>(funcname.
Data(), funcname.
Data(), var, std::move(dh));
814 int idx = physics.
size();
815 list_hf[sample] = idx;
826void collectRooAbsReal(
const char * ,
TDirectory *file, std::map<std::string, int> &list_hf,
827 RooArgList &physics,
const std::string &varname,
830 for (
auto sampleit : inputParameters) {
831 const std::string sample(sampleit.first);
832 auto obj = loadFromFileResidentFolder<RooAbsReal>(file, sample, varname,
true);
835 auto it = list_hf.find(sample);
836 if (it == list_hf.end()) {
837 int idx = physics.
size();
838 list_hf[sample] = idx;
849void collectCrosssections(
const char *
name,
TDirectory *file, std::map<std::string, int> &list_xs,
RooArgList &physics,
852 for (
auto sampleit : inputParameters) {
853 const std::string sample(sampleit.first);
854 auto obj = loadFromFileResidentFolder<TObject>(file, sample, varname,
false);
861 TPair *pair =
dynamic_cast<TPair *
>(obj.get());
867 std::stringstream errstr;
868 errstr <<
"Error: unable to retrieve cross section '" << varname <<
"' from folder '" << sample;
872 auto it = list_xs.find(sample);
874 if (it != list_xs.end()) {
878 std::string objname =
"phys_" + std::string(
name) +
"_" + sample;
879 auto xsOwner = std::make_unique<RooRealVar>(objname.c_str(), objname.c_str(), xsection->
GetVal());
882 int idx = physics.
size();
883 list_xs[sample] = idx;
884 physics.
addOwned(std::move(xsOwner));
885 assert(physics.
at(idx) == xs);
897void collectCrosssectionsTPair(
const char *
name,
TDirectory *file, std::map<std::string, int> &list_xs,
898 RooArgList &physics,
const std::string &varname,
const std::string &basefolder,
901 auto pair = loadFromFileResidentFolder<TPair>(file, basefolder, varname,
false);
905 collectCrosssections<double>(
name, file, list_xs, physics, varname, inputParameters);
907 collectCrosssections<float>(
name, file, list_xs, physics, varname, inputParameters);
909 std::cerr <<
"cannot morph objects of class 'TPair' if parameter is not "
923void collectPolynomialsHelper(
const FeynmanDiagram &diagram, MorphFuncPattern &morphfunc, std::vector<int> &term,
924 int vertexid,
bool first)
927 for (
size_t i = 0; i < diagram[vertexid - 1].size(); ++i) {
928 if (!diagram[vertexid - 1][i])
930 std::vector<int> newterm(term);
933 ::collectPolynomialsHelper(diagram, morphfunc, newterm, vertexid,
false);
935 ::collectPolynomialsHelper(diagram, morphfunc, newterm, vertexid - 1,
true);
940 for (
size_t i = 0; i < morphfunc.size(); ++i) {
941 bool thisfound =
true;
942 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
943 if (morphfunc[i][j] != term[j]) {
954 morphfunc.push_back(term);
962void collectPolynomials(MorphFuncPattern &morphfunc,
const FeynmanDiagram &diagram)
964 int nvtx(diagram.size());
965 std::vector<int> term(diagram[0].
size(), 0);
967 ::collectPolynomialsHelper(diagram, morphfunc, term, nvtx,
true);
974inline void fillFeynmanDiagram(FeynmanDiagram &diagram,
const std::vector<List *> &vertices,
RooArgList &couplings)
976 const int ncouplings = couplings.
size();
978 for (
auto const &vertex : vertices) {
979 std::vector<bool> vertexCouplings(ncouplings,
false);
982 for (
auto citr : couplings) {
986 std::cerr <<
"encountered invalid list of couplings in vertex!" << std::endl;
989 if (vertex->find(coupling->
GetName())) {
990 vertexCouplings[idx] =
true;
993 diagram.push_back(vertexCouplings);
1000template <
class MatrixT,
class T1,
class T2>
1004 const size_t dim = inputParameters.size();
1005 MatrixT matrix(dim, dim);
1007 for (
auto sampleit : inputParameters) {
1008 const std::string sample(sampleit.first);
1010 if (!setParams<double>(sampleit.second, args,
true, 0)) {
1011 std::cout <<
"unable to set parameters for sample " << sample <<
"!" << std::endl;
1013 auto flagit = flagValues.find(sample);
1014 if (flagit != flagValues.end() && !setParams<int>(flagit->second, flags,
true, 1)) {
1015 std::cout <<
"unable to set parameters for sample " << sample <<
"!" << std::endl;
1019 for (
auto const &formula : formulas) {
1020 if (!formula.second) {
1021 std::cerr <<
"Error: invalid formula encountered!" << std::endl;
1023 matrix(row, col) = formula.second->getVal();
1036 if (inputParameters.size() != formulas.size()) {
1037 std::stringstream ss;
1038 ss <<
"matrix is not square, consistency check failed: " << inputParameters.size() <<
" samples, "
1039 << formulas.size() <<
" expressions:" << std::endl;
1040 ss <<
"formulas: " << std::endl;
1041 for (
auto const &formula : formulas) {
1042 ss << formula.second->GetTitle() << std::endl;
1044 ss <<
"samples: " << std::endl;
1045 for (
auto sample : inputParameters) {
1046 ss << sample.first << std::endl;
1048 std::cerr << ss.str() << std::endl;
1055inline void inverseSanity(
const Matrix &matrix,
const Matrix &inverse,
double &unityDeviation,
double &largestWeight)
1057 Matrix unity(inverse * matrix);
1059 unityDeviation = 0.;
1061 const size_t dim =
size(unity);
1062 for (
size_t i = 0; i < dim; ++i) {
1063 for (
size_t j = 0; j < dim; ++j) {
1064 if (inverse(i, j) > largestWeight) {
1065 largestWeight = (
double)inverse(i, j);
1067 if (std::abs(unity(i, j) -
static_cast<int>(i == j)) > unityDeviation) {
1068 unityDeviation = std::abs((
double)unity(i, j)) -
static_cast<int>(i == j);
1076template <
class List>
1079 for (
auto sampleit : inputParameters) {
1080 const std::string sample(sampleit.first);
1081 RooAbsArg *arg = args.find(sample.c_str());
1083 std::cerr <<
"detected name conflict: cannot use sample '" << sample
1084 <<
"' - a parameter with the same name of type '" << arg->
ClassName() <<
"' is present in set '"
1085 << args.GetName() <<
"'!" << std::endl;
1097 const std::vector<std::vector<std::string>> &nonInterfering)
1106 const int ncouplings = couplings.
size();
1107 std::vector<bool> couplingsZero(ncouplings,
true);
1108 std::map<TString, bool> flagsZero;
1111 extractOperators(couplings, operators);
1112 size_t nOps = operators.
size();
1114 for (
auto sampleit : inputParameters) {
1115 const std::string sample(sampleit.first);
1116 if (!setParams(sampleit.second, operators,
true)) {
1117 std::cerr <<
"unable to set parameters for sample '" << sample <<
"'!" << std::endl;
1120 if (nOps != (operators.
size())) {
1121 std::cerr <<
"internal error, number of operators inconsistent!" << std::endl;
1127 for (
auto itr1 : couplings) {
1129 if (obj0->
getVal() != 0) {
1130 couplingsZero[idx] =
false;
1136 for (
auto itr2 : flags) {
1137 auto obj1 =
dynamic_cast<RooAbsReal *
>(itr2);
1140 for (
auto sampleit : inputFlags) {
1141 const auto &flag = sampleit.second.find(obj1->GetName());
1142 if (flag != sampleit.second.end()) {
1143 if (flag->second == 0.) {
1150 if (nZero > 0 && nNonZero == 0) {
1151 flagsZero[obj1->GetName()] =
true;
1153 flagsZero[obj1->GetName()] =
false;
1157 FormulaList formulas;
1158 for (
size_t i = 0; i < morphfunc.size(); ++i) {
1160 bool isZero =
false;
1163 for (
const auto &
group : nonInterfering) {
1164 int nInterferingOperators = 0;
1165 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
1166 if (morphfunc[i][j] % 2 == 0)
1170 nInterferingOperators++;
1173 if (nInterferingOperators > 1) {
1175 reason =
"blacklisted interference term!";
1181 for (
size_t j = 0; j < morphfunc[i].size(); ++j) {
1182 const int exponent = morphfunc[i][j];
1186 for (
int k = 0; k < exponent; ++k) {
1195 reason =
"coupling " +
cname +
" was listed as leading-order-only";
1198 if (!isZero && couplingsZero[j]) {
1200 reason =
"coupling " +
cname +
" is zero!";
1205 bool removedByFlag =
false;
1207 for (
auto itr : flags) {
1211 TString sval(obj->getStringAttribute(
"NewPhysics"));
1212 int val = atoi(sval);
1214 if (flagsZero.find(obj->GetName()) != flagsZero.end() && flagsZero.at(obj->GetName())) {
1215 removedByFlag =
true;
1216 reason =
"flag " + std::string(obj->GetName()) +
" is zero";
1223 if (!isZero && !removedByFlag) {
1225 const auto name = std::string(mfname) +
"_pol" + std::to_string(i);
1226 formulas[i] = std::make_unique<RooProduct>(
name.c_str(), ::concatNames(ss,
" * ").c_str(), ss);
1237 const std::vector<std::vector<RooArgList *>> &diagrams,
RooArgList &couplings,
1238 const RooArgList &flags,
const std::vector<std::vector<std::string>> &nonInterfering)
1240 MorphFuncPattern morphfuncpattern;
1242 for (
const auto &vertices : diagrams) {
1244 ::fillFeynmanDiagram(
d, vertices, couplings);
1245 ::collectPolynomials(morphfuncpattern,
d);
1247 FormulaList retval = buildFormulas(
name, inputs, inputFlags, morphfuncpattern, couplings, flags, nonInterfering);
1248 if (retval.empty()) {
1249 std::stringstream errorMsgStream;
1251 <<
"no formulas are non-zero, check if any if your couplings is floating and missing from your param_cards!"
1253 const auto errorMsg = errorMsgStream.str();
1254 throw std::runtime_error(errorMsg);
1256 checkMatrix(inputs, retval);
1265 FormulaList &formulas,
const Matrix &inverse)
1269 for (
auto sampleit : inputParameters) {
1270 const std::string sample(sampleit.first);
1271 std::stringstream title;
1272 TString name_full(makeValidName(sample));
1274 name_full.Append(
"_");
1275 name_full.Append(fname);
1276 name_full.Prepend(
"w_");
1281 auto sampleformula = std::make_unique<RooLinearCombination>(name_full.Data());
1282 for (
auto const &formulait : formulas) {
1284 sampleformula->add(val, formulait.second.get());
1287 weights.addOwned(std::move(sampleformula));
1292inline std::map<std::string, std::string>
1297 std::map<std::string, std::string> weights;
1298 for (
auto sampleit : inputParameters) {
1299 const std::string sample(sampleit.first);
1300 std::stringstream str;
1303 for (
auto const &formulait : formulas) {
1304 double val(inverse(formulaidx, sampleidx));
1306 if (formulaidx > 0 && val > 0)
1308 str << val <<
"*(" << formulait.second->GetTitle() <<
")";
1312 weights[sample] = str.str();
1347 args.
add(*(it.second));
1357 const std::vector<std::vector<RooListProxy *>> &diagramProxyList,
1358 const std::vector<std::vector<std::string>> &nonInterfering,
const RooArgList &flags)
1361 std::vector<std::vector<RooArgList *>> diagrams;
1362 for (
const auto &diagram : diagramProxyList) {
1363 diagrams.emplace_back();
1366 diagrams.back().emplace_back(vertex);
1370 _formulas = ::createFormulas(funcname, inputParameters, inputFlags, diagrams,
_couplings, flags, nonInterfering);
1375 template <
class List>
1381 Matrix matrix(buildMatrixT<Matrix>(inputParameters,
_formulas, operators, inputFlags, flags));
1382 if (
size(matrix) < 1) {
1383 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
1388 double unityDeviation;
1389 double largestWeight;
1390 inverseSanity(matrix, inverse, unityDeviation, largestWeight);
1396 oocxcoutW((
TObject *)
nullptr, Eval) <<
"Warning: The matrix inversion seems to be unstable. This can "
1397 "be a result to input samples that are not sufficiently "
1398 "different to provide any morphing power."
1400 }
else if (weightwarning) {
1401 oocxcoutW((
TObject *)
nullptr, Eval) <<
"Warning: Some weights are excessively large. This can be a "
1402 "result to input samples that are not sufficiently different to "
1403 "provide any morphing power."
1407 "encoded in your samples to cross-check:"
1409 for (
auto sampleit : inputParameters) {
1410 const std::string sample(sampleit.first);
1413 setParams(sampleit.second, operators,
true);
1440 const std::map<std::string, int> &storage,
const RooArgList &physics,
1444 std::cerr <<
"invalid bin width given!" << std::endl;
1448 std::cerr <<
"invalid observable given!" << std::endl;
1462 for (
auto sampleit : inputParameters) {
1464 TString prodname(makeValidName(sampleit.first));
1469 std::cerr <<
"unable to access physics object for " << prodname << std::endl;
1476 std::cerr <<
"unable to access weight object for " << prodname << std::endl;
1483 allowNegativeYields =
true;
1484 auto prod = std::make_unique<RooProduct>(prodname, prodname, prodElems);
1485 if (!allowNegativeYields) {
1486 auto maxname = std::string(prodname) +
"_max0";
1489 auto max = std::make_unique<RooFormulaVar>(maxname.c_str(),
"max(0," + prodname +
")", prodset);
1490 max->addOwnedComponents(std::move(prod));
1491 sumElements.
addOwned(std::move(max));
1493 sumElements.
addOwned(std::move(prod));
1495 scaleElements.
add(*(binWidth));
1500 _sumFunc = make_unique<RooRealSumFunc>((std::string(
name) +
"_morphfunc").c_str(),
name, sumElements, scaleElements);
1503 std::cerr <<
"unable to access observable" << std::endl;
1506 std::cerr <<
"unable to access bin width" << std::endl;
1508 if (operators.
empty())
1509 std::cerr <<
"no operators listed" << std::endl;
1510 _sumFunc->addServerList(operators);
1512 std::cerr <<
"unable to access weight objects" << std::endl;
1513 _sumFunc->addOwnedComponents(std::move(sumElements));
1514 _sumFunc->addServerList(sumElements);
1515 _sumFunc->addServerList(scaleElements);
1518 std::cout.precision(std::numeric_limits<double>::digits);
1535 if (obsName.empty()) {
1536 std::cerr <<
"Matrix inversion succeeded, but no observable was "
1537 "supplied. quitting..."
1545 setParams(func->
_flags, 1);
1549 setParams(func->
_flags, 1);
1572 setParams(func->
_flags, 1);
1576 setParams(func->
_flags, 1);
1606 return readMatrixFromFileT<TMatrixD>(fname);
1614 return readMatrixFromStreamT<TMatrixD>(stream);
1624 bool obsExists(
false);
1631 obs =
static_cast<RooRealVar *
>(
dynamic_cast<RooHistFunc *
>(inputExample)->getHistObsList().first());
1645 TH1 *hist =
static_cast<TH1 *
>(inputExample);
1648 obs = obsOwner.get();
1652 auto obsOwner = std::make_unique<RooRealVar>(obsname, obsname, 0, 1);
1653 obs = obsOwner.get();
1659 if (strcmp(obsname, obs->
GetName()) != 0) {
1661 <<
" does not match expected name " << obsname << std::endl;
1666 auto binWidth = std::make_unique<RooRealVar>(sbw.
Data(), sbw.
Data(), 1.);
1668 binWidth->setVal(bw);
1669 binWidth->setConstant(
true);
1688 const size_t n(
size(cache->_inverse));
1690 const std::string sample(sampleit.first);
1693 if (!sampleformula) {
1694 coutE(ObjectHandling) <<
Form(
"unable to access formula for sample '%s'!", sample.c_str()) << std::endl;
1697 cxcoutP(ObjectHandling) <<
"updating formula for sample '" << sample <<
"'" << std::endl;
1698 for (
size_t formulaidx = 0; formulaidx <
n; ++formulaidx) {
1703 if (std::isnan(val)) {
1705 coutE(ObjectHandling) <<
"refusing to propagate NaN!" << std::endl;
1707 cxcoutP(ObjectHandling) <<
" " << formulaidx <<
":" << sampleformula->
getCoefficient(formulaidx) <<
" -> "
1708 << val << std::endl;
1737 std::string obsName;
1749 cxcoutP(InputArguments) <<
"initializing physics inputs from file " << file->
GetName() <<
" with object name(s) '"
1750 << obsName <<
"'" << std::endl;
1752 auto obj = loadFromFileResidentFolder<TObject>(file, folderNames.front(), obsName,
true);
1754 std::cerr <<
"unable to locate object '" << obsName <<
"' in folder '" << folderNames.front() <<
"'!"
1758 std::string classname = obj->ClassName();
1762 if (classname.find(
"TH1") != std::string::npos) {
1765 }
else if (classname.find(
"RooHistFunc") != std::string::npos ||
1766 classname.find(
"RooParamHistFunc") != std::string::npos ||
1767 classname.find(
"PiecewiseInterpolation") != std::string::npos) {
1769 }
else if (classname.find(
"TParameter<double>") != std::string::npos) {
1771 }
else if (classname.find(
"TParameter<float>") != std::string::npos) {
1773 }
else if (classname.find(
"TPair") != std::string::npos) {
1777 std::cerr <<
"cannot morph objects of class '" <<
mode->GetName() <<
"'!" << std::endl;
1788 std::cout << param.first <<
" = " << param.second;
1790 std::cout <<
" (const)";
1791 std::cout << std::endl;
1803 std::cout << folder << std::endl;
1825 _operators(
"operators",
"set of operators", this),
_observables(
"observables",
"morphing observables", this),
1843 std::vector<RooListProxy *> vertices;
1845 vertices.push_back(
new RooListProxy(
"!couplings",
"set of couplings in the vertex",
this,
true,
false));
1857 std::vector<RooListProxy *> vertices;
1859 cxcoutP(InputArguments) <<
"prod/dec couplings provided" << std::endl;
1863 new RooListProxy(
"!production",
"set of couplings in the production vertex",
this,
true,
false));
1864 vertices.push_back(
new RooListProxy(
"!decay",
"set of couplings in the decay vertex",
this,
true,
false));
1870 cxcoutP(InputArguments) <<
"adding non-own operators" << std::endl;
1885 std::stringstream
name;
1886 name <<
"noInterference";
1887 for (
auto c : nonInterfering) {
1891 for (
auto c : nonInterfering) {
1902 for (
size_t i = 0; i < nonInterfering.size(); ++i) {
1915 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
1922 auto nNP0 = std::make_unique<RooRealVar>(
"nNP0",
"nNP0", 1., 0, 1.);
1923 nNP0->setStringAttribute(
"NewPhysics",
"0");
1924 nNP0->setConstant(
true);
1926 auto nNP1 = std::make_unique<RooRealVar>(
"nNP1",
"nNP1", 1., 0, 1.);
1927 nNP1->setStringAttribute(
"NewPhysics",
"1");
1928 nNP1->setConstant(
true);
1930 auto nNP2 = std::make_unique<RooRealVar>(
"nNP2",
"nNP2", 1., 0, 1.);
1931 nNP2->setStringAttribute(
"NewPhysics",
"2");
1932 nNP2->setConstant(
true);
1934 auto nNP3 = std::make_unique<RooRealVar>(
"nNP3",
"nNP3", 1., 0, 1.);
1935 nNP3->setStringAttribute(
"NewPhysics",
"3");
1936 nNP3->setConstant(
true);
1938 auto nNP4 = std::make_unique<RooRealVar>(
"nNP4",
"nNP4", 1., 0, 1.);
1939 nNP4->setStringAttribute(
"NewPhysics",
"4");
1940 nNP4->setConstant(
true);
1948 :
RooAbsReal(other,
name), _cacheMgr(other._cacheMgr, this), _scale(other._scale), _sampleMap(other._sampleMap),
1949 _physics(other._physics.GetName(), this, other._physics),
1950 _operators(other._operators.GetName(), this, other._operators),
1951 _observables(other._observables.GetName(), this, other._observables),
1952 _binWidths(other._binWidths.GetName(), this, other._binWidths), _flags{other._flags.GetName(), this, other._flags},
1953 _config(other._config)
1955 for (
size_t j = 0; j < other.
_diagrams.size(); ++j) {
1956 std::vector<RooListProxy *> diagram;
1957 for (
size_t i = 0; i < other.
_diagrams[j].size(); ++i) {
1959 diagram.push_back(list);
1986 : _cacheMgr(this, 10, true, true), _operators(
"operators",
"set of operators", this, true, false),
1987 _observables(
"observable",
"morphing observable", this, true, false),
1988 _binWidths(
"binWidths",
"set of bin width objects", this, true, false)
2012 FeynmanDiagram diagram;
2013 std::vector<bool> prod;
2014 std::vector<bool> dec;
2015 for (
int i = 0; i < nboth; ++i) {
2016 prod.push_back(
true);
2017 dec.push_back(
true);
2019 for (
int i = 0; i < nprod; ++i) {
2020 prod.push_back(
true);
2021 dec.push_back(
false);
2023 for (
int i = 0; i < ndec; ++i) {
2024 prod.push_back(
false);
2025 dec.push_back(
true);
2027 diagram.push_back(prod);
2028 diagram.push_back(dec);
2029 MorphFuncPattern morphfuncpattern;
2030 ::collectPolynomials(morphfuncpattern, diagram);
2031 return morphfuncpattern.size();
2041 for (
auto vertex : vertices) {
2042 extractOperators(*vertex, operators);
2043 extractCouplings(*vertex, couplings);
2045 FeynmanDiagram diagram;
2046 ::fillFeynmanDiagram(diagram, vertices, couplings);
2047 MorphFuncPattern morphfuncpattern;
2048 ::collectPolynomials(morphfuncpattern, diagram);
2049 return morphfuncpattern.size();
2055std::map<std::string, std::string>
2057 const std::vector<std::vector<std::string>> &vertices_str)
2059 std::stack<RooArgList> ownedVertices;
2060 std::vector<RooArgList *> vertices;
2062 for (
const auto &vtx : vertices_str) {
2063 ownedVertices.emplace();
2064 auto &vertex = ownedVertices.top();
2065 for (
const auto &
c : vtx) {
2068 auto couplingOwner = std::make_unique<RooRealVar>(
c.c_str(),
c.c_str(), 1., 0., 10.);
2069 coupling = couplingOwner.get();
2070 couplings.
addOwned(std::move(couplingOwner));
2072 vertex.add(*coupling);
2074 vertices.push_back(&vertex);
2083std::map<std::string, std::string>
2085 const std::vector<RooArgList *> &vertices,
RooArgList &couplings)
2093std::map<std::string, std::string>
2095 const std::vector<RooArgList *> &vertices,
RooArgList &couplings,
2097 const std::vector<std::vector<std::string>> &nonInterfering)
2099 FormulaList formulas = ::createFormulas(
"", inputs, flagValues, {vertices}, couplings, flags, nonInterfering);
2101 extractOperators(couplings, operators);
2102 Matrix matrix(::buildMatrixT<Matrix>(inputs, formulas, operators, flagValues, flags));
2103 if (
size(matrix) < 1) {
2104 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
2108 auto retval = buildSampleWeightStrings(inputs, formulas, inverse);
2116 const std::vector<RooArgList *> &vertices,
RooArgList &couplings,
2119 const std::vector<std::vector<std::string>> &nonInterfering)
2121 FormulaList formulas = ::createFormulas(
"", inputs, flagValues, {vertices}, couplings, flags, nonInterfering);
2123 extractOperators(couplings, operators);
2124 Matrix matrix(::buildMatrixT<Matrix>(inputs, formulas, operators, flagValues, flags));
2125 if (
size(matrix) < 1) {
2126 std::cerr <<
"input matrix is empty, please provide suitable input samples!" << std::endl;
2131 ::buildSampleWeights(retval, (
const char *)
nullptr , inputs, formulas, inverse);
2139 const std::vector<RooArgList *> &vertices,
RooArgList &couplings)
2154 coutE(Eval) <<
"unable to retrieve morphing function" << std::endl;
2157 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2162 for (
auto itr : *args) {
2187 auto wname = std::string(
"w_") +
name +
"_" + this->
GetName();
2188 return dynamic_cast<RooAbsReal *
>(cache->_weights.find(wname.c_str()));
2206 auto weightName = std::string(
"w_") + sample.first +
"_" + this->
GetName();
2207 auto weight =
static_cast<RooAbsReal *
>(cache->_weights.find(weightName.c_str()));
2224 double val = obj->
getVal();
2227 double variation =
r.Gaus(1, z);
2228 obj->
setVal(val * variation);
2243 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
2270 cache->_inverse =
m;
2273 coutE(InputArguments) <<
"unable to open file '" <<
filename <<
"'!" << std::endl;
2288 coutE(Caching) <<
"unable to create cache!" << std::endl;
2307 coutE(Caching) <<
"unable to create cache!" << std::endl;
2332 cxcoutP(Caching) <<
"creating cache from getCache function for " <<
this << std::endl;
2333 cxcoutP(Caching) <<
"current storage has size " <<
_sampleMap.size() << std::endl;
2338 coutE(Caching) <<
"unable to create cache!" << std::endl;
2363 if (value < param->getMin())
2487 auto paramhist = loadFromFileResidentFolder<TH1>(file, foldername,
"param_card");
2488 setParams(paramhist.get(),
_operators,
false);
2498 const std::string
name(foldername);
2508 for (
auto itr : *list) {
2522 coutE(InputArguments) <<
"observable not available!" << std::endl;
2534 coutE(InputArguments) <<
"bin width not available!" << std::endl;
2553 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2556 const int nbins = observable->
getBins();
2560 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2561 for (
int i = 0; i < nbins; ++i) {
2566 for (
auto itr : *args) {
2578 double weight = formula->
getVal();
2581 val += dhist.
weight() * weight;
2584 hist->
SetBinError(i + 1, correlateErrors ? unc : sqrt(unc2));
2586 return hist.release();
2595 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2597 coutE(InputArguments) <<
"unable to retrieve morphing function" << std::endl;
2598 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2599 for (
auto itr : *args) {
2601 if (prod->
getVal() != 0) {
2615 std::string pname(paramname);
2617 bool isUsed =
false;
2619 double thisval = sample.second.at(pname);
2620 if (thisval != val) {
2636 std::string
cname(couplname);
2643 bool isUsed =
false;
2646 double thisval = coupling->
getVal();
2647 if (thisval != val) {
2672 return cache->_formulas.size();
2680 auto mf = std::make_unique<RooRealSumFunc>(*(this->
getFunc()));
2682 std::cerr <<
"Error: unable to retrieve morphing function" << std::endl;
2685 std::unique_ptr<RooArgSet> args{mf->getComponents()};
2686 for (
auto *formula : dynamic_range_cast<RooAbsReal*>(*args)) {
2690 name.Prepend(
"phys_");
2691 if (!args->find(
name.Data())) {
2694 double val = formula->getVal();
2696 std::cout << formula->GetName() <<
": " << val <<
" = " << formula->GetTitle() << std::endl;
2716 return &(cache->_couplings);
2730 double val = var->
getVal();
2731 couplings[
name] = val;
2758 auto func = std::make_unique<RooRealSumFunc>(*(cache->_sumFunc));
2761 return std::make_unique<RooWrapperPdf>(
Form(
"pdf_%s", func->GetName()),
Form(
"pdf of %s", func->GetTitle()), *func);
2770 return cache->_sumFunc.get();
2787 return this->
createPdf()->expectedEvents(nset);
2797 return this->
createPdf()->expectedEvents(set);
2806 return createPdf()->expectedEvents(&nset);
2819 auto weightName = std::string(
"w_") + sample.first +
"_" + this->
GetName();
2820 auto weight =
static_cast<RooAbsReal *
>(cache->_weights.find(weightName.c_str()));
2822 coutE(InputArguments) <<
"unable to find object " + weightName << std::endl;
2837 double w = weight->getVal();
2838 unc2 += newunc2 *
w *
w;
2865 for (
auto flag :
_flags) {
2879 for (
auto c : couplings) {
2880 std::cout <<
c.first <<
": " <<
c.second << std::endl;
2914 std::cerr <<
"unable to acquire in-built function!" << std::endl;
2947 const char *rangeName)
const
2991 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
3002 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
3015 coutE(Caching) <<
"unable to retrieve cache!" << std::endl;
3016 return cache->_condition;
3022std::unique_ptr<RooRatio>
3027 for (
auto it : nr) {
3030 for (
auto it : dr) {
3034 return make_unique<RooRatio>(
name, title, num, denom);
3042std::vector<std::string> asStringV(std::string
const &arg)
3044 std::vector<std::string> out;
3046 for (std::string &tok :
ROOT::Split(arg,
",{}", true)) {
3047 if (tok[0] ==
'\'') {
3048 out.emplace_back(tok.substr(1, tok.size() - 2));
3050 throw std::runtime_error(
"Strings in factory expressions need to be in single quotes!");
3060 create(
RooFactoryWSTool &,
const char *typeName,
const char *instName, std::vector<std::string> args)
override;
3063std::string LMIFace::create(
RooFactoryWSTool &ft,
const char * ,
const char *instanceName,
3064 std::vector<std::string> args)
3067 const std::array<std::string, 4> funcArgs{{
"fileName",
"observableName",
"couplings",
"folders"}};
3068 std::map<string, string> mappedInputs;
3070 for (
unsigned int i = 1; i < args.size(); i++) {
3071 if (args[i].find(
"$fileName(") != 0 && args[i].find(
"$observableName(") != 0 &&
3072 args[i].find(
"$couplings(") != 0 && args[i].find(
"$folders(") != 0 && args[i].find(
"$NewPhysics(") != 0) {
3073 throw std::string(
Form(
"%s::create() ERROR: unknown token %s encountered", instanceName, args[i].c_str()));
3077 for (
unsigned int i = 0; i < args.size(); i++) {
3078 if (args[i].find(
"$NewPhysics(") == 0) {
3080 for (
const auto &subarg : subargs) {
3081 std::vector<std::string> parts =
ROOT::Split(subarg,
"=");
3082 if (parts.size() == 2) {
3085 throw std::string(
Form(
"%s::create() ERROR: unknown token %s encountered, check input provided for %s",
3086 instanceName, subarg.c_str(), args[i].c_str()));
3091 if (subargs.size() == 1) {
3093 for (
auto const ¶m : funcArgs) {
3094 if (args[i].find(param) != string::npos)
3095 mappedInputs[param] = subargs[0];
3099 Form(
"Incorrect number of arguments in %s, have %d, expect 1", args[i].c_str(), (
Int_t)subargs.size()));
3105 config.
fileName = asStringV(mappedInputs[
"fileName"])[0];
3106 config.
observableName = asStringV(mappedInputs[
"observableName"])[0];
3107 config.
folderNames = asStringV(mappedInputs[
"folders"]);
3112 return instanceName;
RooCollectionProxy< RooArgList > RooListProxy
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
winID h TVirtualViewer3D TVirtualGLPainter p
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 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'.
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.
virtual double * array() const =0
Abstract base class for objects to be stored in RooAbsCache cache manager objects.
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.
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...
Int_t setObj(const RooArgSet *nset, T *obj, const TNamed *isetRangeName=nullptr)
Setter function without integration set.
T * getObj(const RooArgSet *nset, Int_t *sterileIndex=nullptr, const TNamed *isetRangeName=nullptr)
Getter function without integration set.
bool addOwned(RooAbsArg &var, bool silent=false) override
Overloaded RooCollection_t::addOwned() method insert object into owning set and registers object as s...
bool add(const RooAbsArg &var, bool valueServer, bool shapeServer, bool silent)
Overloaded RooCollection_t::add() method insert object into set and registers object as server to own...
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.
const RooArgSet * get() const override
Get bin centre of current 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
Class RooLagrangianMorphing is a implementation of the method of Effective Lagrangian Morphing,...
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.
double _scale
The cache manager.
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
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.
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)
Set minimum of name range to given value.
const RooAbsBinning & getBinning(const char *name=nullptr, bool verbose=true, bool createOnTheFly=false) const override
Return binning definition with name.
void setBinning(const RooAbsBinning &binning, const char *name=nullptr)
Add given binning under name 'name' with this variable.
void setBins(Int_t nBins, const char *name=nullptr)
Create a uniform binning under name 'name' for this variable.
void setMax(const char *name, double value)
Set maximum of name range to given value.
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)
Return pointer to object identified by namecycle.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
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.
void Close(Option_t *option="") override
Close 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 * GetName() const
Returns name of object.
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
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
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
std::vector< std::vector< const char * > > nonInterfering