ra4_stats  0341147a0dc35f80f4e12c6003afb76a38e2ed6e
merge_workspaces.py
Go to the documentation of this file.
1 #! /usr/bin/env python
2 
3 import argparse
4 import ROOT
5 
6 def GetLabel(i):
7  return str(2015+i)
8 
9 def ExtendSet(wspace_out, wspace_in, set_name, suffix, shared_vars):
10  iterator = wspace_in.set(set_name).createIterator()
11  var = iterator.Next()
12  while var:
13  extension = "" if var.GetName() in shared_vars else "_"+suffix
14  wspace_out.extendSet(set_name, var.GetName()+extension)
15  var = iterator.Next()
16 
17 def AddLikelihood(wspace_out, name, num_merged):
18  likelihood_list = name+"_"+(","+name+"_").join([GetLabel(i) for i in xrange(0, num_merged)])
19  wspace_out.factory("PROD::"+name+"("+likelihood_list+")")
20 
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)
29 
30 def MergeWorkspaces(files_in, wspace_name_in, file_out, wspace_name_out, shared_vars):
31  wspace_out = ROOT.RooWorkspace(wspace_name_out)
32 
33  var_sets = ["POI", "nuisances", "observables", "globalObservables"]
34  for var_set in var_sets:
35  wspace_out.defineSet(var_set, "")
36 
37  for ifile in xrange(0, len(files_in)):
38  label = GetLabel(ifile)
39  file_in = ROOT.TFile(files_in[ifile], "read")
40  wspace_in = file_in.Get(wspace_name_in)
41 
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)
47 
48  file_in.Close()
49 
50  AddLikelihood(wspace_out, "model_b", len(files_in))
51  AddLikelihood(wspace_out, "model_s", len(files_in))
52 
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())
56 
57  AddModel(wspace_out, "ModelConfig", "model_s")
58  AddModel(wspace_out, "ModelConfig_bonly", "model_b")
59 
60  wspace_out.writeToFile(file_out)
61 
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()
71 
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)