15 """ Create a simple model and run statistical tests
17 This script can be used to make simple statistical using histfactory.
18 It takes values for signal, background,
and data
as input,
and
19 can optionally take uncertainties on signal
or background.
20 The model
is created
and saved to an output ROOT file,
and
21 the model can be fit
if requested.
28 desc =
" ".join(main.__doc__.split())
31 parser = optparse.OptionParser( description = desc, version = vers, usage =
"%prog [options]" )
33 parser.add_option(
"-s",
"--signal", dest =
"signal",
34 action =
"store", type =
"float", default=
None,
35 help =
"Expected Signal" )
37 parser.add_option(
"-b",
"--background", dest =
"background",
38 action =
"store", type =
"float", default=
None,
39 help =
"Expected Background" )
41 parser.add_option(
"-d",
"--data", dest =
"data",
42 action =
"store", type =
"float", default=
None,
43 help =
"Measured data" )
45 parser.add_option(
"--signal-uncertainty", dest =
"signal_uncertainty",
46 action =
"store", type =
"float", default=
None,
47 help =
"Uncertainty on the signal rate, as a fraction. --signal-uncertainty=.05 means a 5% uncertainty." )
49 parser.add_option(
"--background-uncertainty", dest =
"background_uncertainty",
50 action =
"store", type =
"float", default=
None,
51 help =
"Uncertainty on the background rate, as a fraction, not a percentage. --background-uncertainty=.05 means a 5% uncertainty." )
53 parser.add_option(
"--output-prefix", dest =
"output_prefix",
54 action =
"store", type =
"string", default=
"Measurement",
55 help =
"Prefix for output files when using export. Can include directories (ie 'MyDirectory/MyPrefix')" )
57 parser.add_option(
"-e",
"--export", dest =
"export",
58 action =
"store_true", default=
False,
59 help =
"Make output plots, graphs, and save the workspace." )
62 ( options, unknown ) = parser.parse_args()
66 FORMAT =
'Py:%(name)-25s %(levelname)-8s %(message)s'
68 logging.basicConfig( format = FORMAT )
70 logger = logging.getLogger(
"makeQuickMeasurement" )
72 logger.setLevel( logging.INFO )
76 logger.warning(
"Options(s) not recognised: [" +
",".join( unknown ) +
"]" )
79 if options.signal ==
None:
80 logger.error(
"You have to define a value for expacted signal (use --signal)" )
83 if options.background ==
None:
84 logger.error(
"You have to define a value for expacted background (use --background)" )
87 if options.data ==
None:
88 logger.error(
"You have to define a value for measured data (use --data)" )
96 MakeSimpleMeasurement( signal_val=options.signal, background_val=options.background, data_val=options.data,
97 signal_uncertainty=options.signal_uncertainty, background_uncertainty=options.background_uncertainty,
98 Export=options.export, output_prefix=options.output_prefix)
102def MakeSimpleMeasurement( signal_val, background_val, data_val, signal_uncertainty=None, background_uncertainty=None,
103 Export=False, output_prefix="Measurement"):
104 """ Make a simple measurement using HistFactory
106 Take in simple values
for signal, background data,
107 and potentially uncertainty on signal
and background
114 print "It seems that pyROOT isn't properly configured"
120 meas = ROOT.RooStats.HistFactory.Measurement(
"meas",
"meas")
121 meas.SetOutputFilePrefix( output_prefix )
122 meas.SetPOI(
"SigXsecOverSM" )
130 meas.SetLumiRelErr( 0.10 )
131 meas.AddConstantParam(
"Lumi")
136 meas.SetExportOnly(
False )
141 chan = ROOT.RooStats.HistFactory.Channel(
"channel" )
142 chan.SetData( data_val )
145 signal = ROOT.RooStats.HistFactory.Sample(
"signal" )
146 signal.SetNormalizeByTheory(
False )
147 signal.SetValue( signal_val )
153 upper_bound = 3*math.ceil( (data_val - background_val) / signal_val )
154 upper_bound = max(upper_bound, 3)
155 signal.AddNormFactor(
"SigXsecOverSM", 1, 0, upper_bound )
158 if signal_uncertainty !=
None:
159 uncertainty_up = 1.0 + signal_uncertainty
160 uncertainty_down = 1.0 - signal_uncertainty
161 signal.AddOverallSys(
"signal_uncertainty", uncertainty_down, uncertainty_up )
164 chan.AddSample( signal )
167 background = ROOT.RooStats.HistFactory.Sample(
"background" )
168 background.SetNormalizeByTheory(
False )
169 background.SetValue( background_val )
172 if background_uncertainty !=
None:
173 uncertainty_up = 1.0 + background_uncertainty
174 uncertainty_down = 1.0 - background_uncertainty
175 background.AddOverallSys(
"background_uncertainty", uncertainty_down, uncertainty_up )
178 chan.AddSample( background )
182 meas.AddChannel( chan )
186 workspace = ROOT.RooStats.HistFactory.MakeModelAndMeasurementFast( meas )
190 factory = ROOT.RooStats.HistFactory.HistoToWorkspaceFactoryFast()
191 workspace = factory.MakeCombinedModel( meas )
193 ROOT.RooStats.HistFactory.FitModel( workspace )
199if __name__ ==
"__main__":
def MakeSimpleMeasurement(signal_val, background_val, data_val, signal_uncertainty=None, background_uncertainty=None, Export=False, output_prefix="Measurement")