46 using namespace RooFit;
47 using namespace RooStats;
50 void AddModel(RooWorkspace *);
51 void AddData(RooWorkspace *);
52 void DoSPlot(RooWorkspace *);
53 void MakePlots(RooWorkspace *);
59 RooWorkspace *wspace =
new RooWorkspace(
"myWS");
84 void AddModel(RooWorkspace *ws)
92 Double_t lowRange = 0., highRange = 200.;
95 RooRealVar invMass(
"invMass",
"M_{inv}", lowRange, highRange,
"GeV");
96 RooRealVar isolation(
"isolation",
"isolation", 0., 20.,
"GeV");
102 std::cout <<
"make z model" << std::endl;
104 RooRealVar mZ(
"mZ",
"Z Mass", 91.2, lowRange, highRange);
105 RooRealVar sigmaZ(
"sigmaZ",
"Width of Gaussian", 2, 0, 10,
"GeV");
106 RooGaussian mZModel(
"mZModel",
"Z+jets Model", invMass, mZ, sigmaZ);
115 RooConstVar zIsolDecayConst(
"zIsolDecayConst",
"z isolation decay constant", -1);
116 RooExponential zIsolationModel(
"zIsolationModel",
"z isolation model", isolation, zIsolDecayConst);
119 RooProdPdf zModel(
"zModel",
"2-d model for Z", RooArgSet(mZModel, zIsolationModel));
124 std::cout <<
"make qcd model" << std::endl;
130 RooRealVar qcdMassDecayConst(
"qcdMassDecayConst",
"Decay const for QCD mass spectrum", -0.01, -100, 100,
"1/GeV");
131 RooExponential qcdMassModel(
"qcdMassModel",
"qcd Mass Model", invMass, qcdMassDecayConst);
137 RooConstVar qcdIsolDecayConst(
"qcdIsolDecayConst",
"Et resolution constant", -.1);
138 RooExponential qcdIsolationModel(
"qcdIsolationModel",
"QCD isolation model", isolation, qcdIsolDecayConst);
141 RooProdPdf qcdModel(
"qcdModel",
"2-d model for QCD", RooArgSet(qcdMassModel, qcdIsolationModel));
148 RooRealVar zYield(
"zYield",
"fitted yield for Z", 50, 0., 1000);
149 RooRealVar qcdYield(
"qcdYield",
"fitted yield for QCD", 100, 0., 1000);
152 std::cout <<
"make full model" << std::endl;
153 RooAddPdf model(
"model",
"z+qcd background models", RooArgList(zModel, qcdModel), RooArgList(zYield, qcdYield));
156 model.graphVizTree(
"fullModel.dot");
158 std::cout <<
"import model" << std::endl;
164 void AddData(RooWorkspace *ws)
169 Int_t nEvents = 1000;
172 RooAbsPdf *model = ws->pdf(
"model");
173 RooRealVar *invMass = ws->var(
"invMass");
174 RooRealVar *isolation = ws->var(
"isolation");
177 std::cout <<
"make data set and import to workspace" << std::endl;
178 RooDataSet *data = model->generate(RooArgSet(*invMass, *isolation), nEvents);
181 ws->import(*data, Rename(
"data"));
185 void DoSPlot(RooWorkspace *ws)
187 std::cout <<
"Calculate sWeights" << std::endl;
190 RooAbsPdf *model = ws->pdf(
"model");
191 RooRealVar *zYield = ws->var(
"zYield");
192 RooRealVar *qcdYield = ws->var(
"qcdYield");
193 RooDataSet *data = (RooDataSet *)ws->data(
"data");
196 model->fitTo(*data, Extended());
210 RooMsgService::instance().setSilentMode(
true);
212 std::cout <<
"\n\n------------------------------------------\nThe dataset before creating sWeights:\n";
215 RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR);
219 RooStats::SPlot *sData =
new RooStats::SPlot(
"sData",
"An SPlot", *data, model, RooArgList(*zYield, *qcdYield));
221 std::cout <<
"\n\nThe dataset after creating sWeights:\n";
226 std::cout <<
"\n\n------------------------------------------\n\nCheck SWeights:" << std::endl;
228 std::cout << std::endl
229 <<
"Yield of Z is\t" << zYield->getVal() <<
". From sWeights it is "
230 << sData->GetYieldFromSWeight(
"zYield") << std::endl;
232 std::cout <<
"Yield of QCD is\t" << qcdYield->getVal() <<
". From sWeights it is "
233 << sData->GetYieldFromSWeight(
"qcdYield") << std::endl
236 for (Int_t i = 0; i < 10; i++) {
237 std::cout <<
"z Weight for event " << i << std::right << std::setw(12) << sData->GetSWeight(i,
"zYield") <<
" qcd Weight"
238 << std::setw(12) << sData->GetSWeight(i,
"qcdYield") <<
" Total Weight" << std::setw(12) << sData->GetSumOfEventSWeight(i)
242 std::cout << std::endl;
245 std::cout <<
"import new dataset with sWeights" << std::endl;
246 ws->import(*data, Rename(
"dataWithSWeights"));
248 RooMsgService::instance().setGlobalKillBelow(RooFit::INFO);
251 void MakePlots(RooWorkspace *ws)
256 std::cout <<
"make plots" << std::endl;
259 TCanvas *cdata =
new TCanvas(
"sPlot",
"sPlot demo", 400, 600);
263 RooAbsPdf *model = ws->pdf(
"model");
264 RooAbsPdf *zModel = ws->pdf(
"zModel");
265 RooAbsPdf *qcdModel = ws->pdf(
"qcdModel");
267 RooRealVar *isolation = ws->var(
"isolation");
268 RooRealVar *invMass = ws->var(
"invMass");
271 RooDataSet *data = (RooDataSet *)ws->data(
"dataWithSWeights");
280 RooPlot *frame = invMass->frame();
282 model->plotOn(frame, Name(
"FullModel"));
283 model->plotOn(frame, Components(*zModel), LineStyle(kDashed), LineColor(kRed), Name(
"ZModel"));
284 model->plotOn(frame, Components(*qcdModel), LineStyle(kDashed), LineColor(kGreen), Name(
"QCDModel"));
286 TLegend leg(0.11, 0.5, 0.5, 0.8);
287 leg.AddEntry(frame->findObject(
"FullModel"),
"Full model",
"L");
288 leg.AddEntry(frame->findObject(
"ZModel"),
"Z model",
"L");
289 leg.AddEntry(frame->findObject(
"QCDModel"),
"QCD model",
"L");
290 leg.SetBorderSize(0);
293 frame->SetTitle(
"Fit of model to discriminating variable");
309 RooDataSet *dataw_z =
new RooDataSet(data->GetName(), data->GetTitle(), data, *data->get(), 0,
"zYield_sw");
311 RooPlot *frame2 = isolation->frame();
313 dataw_z->plotOn(frame2, DataError(RooAbsData::SumW2));
315 frame2->SetTitle(
"Isolation distribution with s weights to project out Z");
323 RooDataSet *dataw_qcd =
new RooDataSet(data->GetName(), data->GetTitle(), data, *data->get(), 0,
"qcdYield_sw");
324 RooPlot *frame3 = isolation->frame();
325 dataw_qcd->plotOn(frame3, DataError(RooAbsData::SumW2));
327 frame3->SetTitle(
"Isolation distribution with s weights to project out QCD");