From 73256a5af359972bea3716ba560cdc5ec56f28a5 Mon Sep 17 00:00:00 2001 From: rkansal47 Date: Tue, 18 Jul 2023 21:09:49 -0500 Subject: [PATCH] add regex for floatNuisances --- src/Combine.cc | 81 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/src/Combine.cc b/src/Combine.cc index 9456e43808b..56d46be90e9 100644 --- a/src/Combine.cc +++ b/src/Combine.cc @@ -589,14 +589,91 @@ void Combine::run(TString hlfFile, const std::string &dataset, double &limit, do } if (floatNuisances_ != "") { - RooArgSet toFloat((floatNuisances_=="all")?*nuisances:(w->argSet(floatNuisances_.c_str()))); + // expand regexps + while (floatNuisances_.find("rgx{") != std::string::npos) { + size_t pos1 = floatNuisances_.find("rgx{"); + size_t pos2 = floatNuisances_.find("}",pos1); + std::string prestr = floatNuisances_.substr(0,pos1); + std::string poststr = floatNuisances_.substr(pos2+1,floatNuisances_.size()-pos2); + std::string reg_esp = floatNuisances_.substr(pos1+4,pos2-pos1-4); + + //std::cout<<"interpreting "< iter(nuisances->createIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + const std::string &target = a->GetName(); + std::smatch match; + if (std::regex_match(target, match, rgx)) { + matchingParams = matchingParams + target + ","; + } + } + + floatNuisances_ = prestr+matchingParams+poststr; + floatNuisances_ = boost::replace_all_copy(floatNuisances_, ",,", ","); + + } + + // expand regexps + while (floatNuisances_.find("var{") != std::string::npos) { + size_t pos1 = floatNuisances_.find("var{"); + size_t pos2 = floatNuisances_.find("}",pos1); + std::string prestr = floatNuisances_.substr(0,pos1); + std::string poststr = floatNuisances_.substr(pos2+1,floatNuisances_.size()-pos2); + std::string reg_esp = floatNuisances_.substr(pos1+4,pos2-pos1-4); + + // std::cout<<"interpreting "< iter(w->componentIterator()); + for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { + + if ( ! (a->IsA()->InheritsFrom(RooRealVar::Class()) || a->IsA()->InheritsFrom(RooCategory::Class()))) continue; + + const std::string &target = a->GetName(); + // std::cout<<"var "<argSet(floatNuisances_.c_str()))); + RooArgSet toFloat; + if (floatNuisances_=="all") { + toFloat.add(*nuisances); + } else { + std::vector nuisToFloat; + boost::split(nuisToFloat, floatNuisances_, boost::is_any_of(","), boost::token_compress_on); + for (int k=0; k<(int)nuisToFloat.size(); k++) { + if (nuisToFloat[k]=="") continue; + else if(nuisToFloat[k]=="all") { + toFloat.add(*nuisances); + continue; + } + else if (!w->fundArg(nuisToFloat[k].c_str())) { + std::cout<<"WARNING: cannot float nuisance parameter "<fundArg(nuisToFloat[k].c_str()); + toFloat.add(*arg); + } + } + if (verbose > 0) { std::cout << "Set floating the following parameters: "; toFloat.Print(""); Logger::instance().log(std::string(Form("Combine.cc: %d -- Set floating the following parameters: ",__LINE__)),Logger::kLogLevelInfo,__func__); std::unique_ptr iter(toFloat.createIterator()); for (RooAbsArg *a = (RooAbsArg*) iter->Next(); a != 0; a = (RooAbsArg*) iter->Next()) { Logger::instance().log(std::string(Form("Combine.cc: %d %s ",__LINE__,a->GetName())),Logger::kLogLevelInfo,__func__); - } + } } utils::setAllConstant(toFloat, false); }