9 def ExtendSet(wspace_out, wspace_in, set_name, suffix, shared_vars):
10 iterator = wspace_in.set(set_name).createIterator()
13 extension =
"" if var.GetName()
in shared_vars
else "_"+suffix
14 wspace_out.extendSet(set_name, var.GetName()+extension)
18 likelihood_list = name+
"_"+(
","+name+
"_").join([
GetLabel(i)
for i
in xrange(0, num_merged)])
19 wspace_out.factory(
"PROD::"+name+
"("+likelihood_list+
")")
21 def AddModel(wspace_out, config_name, model_name):
22 model_config = ROOT.RooStats.ModelConfig(config_name, wspace_out)
23 model_config.SetPdf(wspace_out.pdf(model_name))
24 model_config.SetParametersOfInterest(wspace_out.set(
"POI"))
25 model_config.SetObservables(wspace_out.set(
"observables"))
26 model_config.SetNuisanceParameters(wspace_out.set(
"nuisances"))
27 model_config.SetGlobalObservables(wspace_out.set(
"globalObservables"))
28 getattr(wspace_out,
"import")(model_config)
30 def MergeWorkspaces(files_in, wspace_name_in, file_out, wspace_name_out, shared_vars):
31 wspace_out = ROOT.RooWorkspace(wspace_name_out)
33 var_sets = [
"POI",
"nuisances",
"observables",
"globalObservables"]
34 for var_set
in var_sets:
35 wspace_out.defineSet(var_set,
"")
37 for ifile
in xrange(0, len(files_in)):
39 file_in = ROOT.TFile(files_in[ifile],
"read")
40 wspace_in = file_in.Get(wspace_name_in)
42 getattr(wspace_out,
"import")(wspace_in.allPdfs(),
43 ROOT.RooFit.RenameAllVariablesExcept(label,
",".join(shared_vars)),
44 ROOT.RooFit.RenameAllNodes(label))
45 for var_set
in var_sets:
46 ExtendSet(wspace_out, wspace_in, var_set, label, shared_vars)
53 data_obs = ROOT.RooDataSet(
"data_obs",
"data_obs", wspace_out.set(
"observables"))
54 data_obs.add(wspace_out.set(
"observables"))
55 getattr(wspace_out,
"import")(data_obs, ROOT.RooCmdArg())
57 AddModel(wspace_out,
"ModelConfig",
"model_s")
58 AddModel(wspace_out,
"ModelConfig_bonly",
"model_b")
60 wspace_out.writeToFile(file_out)
62 if __name__ ==
"__main__":
63 parser = argparse.ArgumentParser(description=
"Merges multiple workspaces",
64 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
65 parser.add_argument(
"file_out", help=
"File in which to save merged workspace")
66 parser.add_argument(
"file_in", nargs=
"+", help=
"File(s) containing workspace(s) to be merged. Typically 1 each for 2015 and 2016.")
67 parser.add_argument(
"--wspace_out", default=
"w", help=
"Name of output workspace")
68 parser.add_argument(
"--wspace_in", default=
"w", help=
"Name of input workspaces")
69 parser.add_argument(
"-s",
"--shared", nargs=
"*", default=[
"r","dilep_closure"], help="Variables shared or correlated across input workspaces")
70 args = parser.parse_args()
72 MergeWorkspaces(args.file_in, args.wspace_in, args.file_out, args.wspace_out, args.shared)
def MergeWorkspaces(files_in, wspace_name_in, file_out, wspace_name_out, shared_vars)
def AddModel(wspace_out, config_name, model_name)
def ExtendSet(wspace_out, wspace_in, set_name, suffix, shared_vars)
def AddLikelihood(wspace_out, name, num_merged)