1 |
|
#include <iostream> |
2 |
|
|
3 |
+ |
|
4 |
+ |
|
5 |
|
#include <TVirtualIndex.h> |
6 |
|
|
7 |
|
#include <RooRealVar.h> |
11 |
|
#include <RooCategory.h> |
12 |
|
|
13 |
|
#include <RooPlot.h> |
14 |
+ |
#include <RooGaussian.h> |
15 |
+ |
#include <RooConstVar.h> |
16 |
|
#include <RooSimultaneous.h> |
17 |
|
#include <RooAddPdf.h> |
18 |
|
#include <RooFitResult.h> |
82 |
|
bool MarcoDebug=true; |
83 |
|
|
84 |
|
float FixedMEdge=-1; |
85 |
< |
float FixedMEdgeChi2=-1; |
85 |
> |
float FixedMEdgeChi2_H1=-1; |
86 |
> |
float FixedMEdgeChi2_H0=-1; |
87 |
|
|
88 |
|
bool RejectPointIfNoConvergence=false; |
89 |
|
|
90 |
|
string Mode="UndefinedMode"; |
91 |
|
|
92 |
+ |
bool AllowTriangle=true; |
93 |
+ |
} |
94 |
+ |
|
95 |
+ |
TLatex* WriteAppleStudel() { |
96 |
+ |
string sel="Apple Strudel Preliminary"; |
97 |
+ |
TLatex *sele = new TLatex(0.97,0.135,sel.c_str()); |
98 |
+ |
sele->SetNDC(true); |
99 |
+ |
sele->SetTextColor(TColor::GetColor("#848484")); |
100 |
+ |
sele->SetTextFont(42); |
101 |
+ |
sele->SetTextAlign(32); |
102 |
+ |
sele->SetTextSize(0.03); |
103 |
+ |
sele->SetTextAngle(270); |
104 |
+ |
return sele; |
105 |
|
} |
106 |
|
|
107 |
|
TGraph* EdgeFitter::prepareLM(float mass, float nEv) { |
173 |
|
sigmaDown = abs(yQ[1]-median); |
174 |
|
sigmaUp = abs(yQ[2]-median); |
175 |
|
twoSigmaUp = abs(yQ[3]-median); |
176 |
< |
cout << median * PlottingSetup::luminosity << " " << sigmaUp * PlottingSetup::luminosity << endl; |
176 |
> |
dout << median * PlottingSetup::luminosity << " " << sigmaUp * PlottingSetup::luminosity << endl; |
177 |
|
} |
178 |
|
|
179 |
|
void EdgeFitter::prepareLimits(RooWorkspace *ws, bool ComputeBands) { |
213 |
|
|
214 |
|
for(int i=0;i<(int)theLimits.size();i++) { |
215 |
|
if((theLimits[i]<2.0/PlottingSetup::luminosity)||(theLimits[i]>40.0/PlottingSetup::luminosity)) { |
216 |
< |
cout << i << " : " << theVals[i] << endl; |
216 |
> |
dout << i << " : " << theVals[i] << endl; |
217 |
|
theLimits[i] = (theLimits[i+2]+theLimits[i-2])/2.0; |
218 |
|
write_warning(__FUNCTION__,"Need to store limits"); |
219 |
|
} |
277 |
|
RooStats::HypoTestInverterResult* hcInt = hcInv.GetInterval(); |
278 |
|
float ulError = hcInt->UpperLimitEstimatedError(); |
279 |
|
theLimit = hcInt->UpperLimit(); |
280 |
< |
cout << "Found upper limit : " << theLimit << "+/-" << ulError << endl; |
280 |
> |
dout << "Found upper limit : " << theLimit << "+/-" << ulError << endl; |
281 |
|
|
282 |
|
return theLimit/PlottingSetup::luminosity; |
283 |
|
|
284 |
|
} |
285 |
|
|
286 |
|
TTree* SkimTree(int isample) { |
287 |
< |
string TreeName = allsamples.collection[isample].filename; |
287 |
> |
string TreeName = removefunnystring(allsamples.collection[isample].filename); |
288 |
> |
cout << "About to skim " << TreeName << " for sample id " << isample << endl; |
289 |
|
TTree* newTree = new TTree("NanoTree",TreeName.c_str()); |
290 |
|
|
291 |
|
float mll,edgeWeight; |
295 |
|
newTree->Branch("mll",&mll,"mll/F"); |
296 |
|
newTree->Branch("id1",&id1,"id1/I"); |
297 |
|
newTree->Branch("id2",&id2,"id2/I"); |
298 |
+ |
newTree->Branch("isample",&isample,"isample/I"); |
299 |
|
|
300 |
|
float xsweight=1.0; |
301 |
|
if(allsamples.collection[isample].is_data==false) xsweight=luminosity*allsamples.collection[isample].weight; |
302 |
|
if(EdgeFitter::MarcoDebug) { |
303 |
< |
cout << " Original tree contains " << allsamples.collection[isample].events->GetEntries() << endl; |
304 |
< |
cout << " Going to reduce it with cut " << EdgeFitter::cut << endl; |
303 |
> |
dout << " Going to reduce it with cut " << EdgeFitter::cut << endl; |
304 |
> |
dout << " Original tree contains " << allsamples.collection[isample].events->GetEntries() << endl; |
305 |
|
} |
306 |
|
|
307 |
|
float tmll; |
327 |
|
} |
328 |
|
} |
329 |
|
|
330 |
< |
if(EdgeFitter::MarcoDebug) cout << " Reduced tree contains " << newTree->GetEntries() << " entries " << endl; |
330 |
> |
if(EdgeFitter::MarcoDebug) dout << " Reduced tree contains " << newTree->GetEntries() << " entries " << endl; |
331 |
|
return newTree; |
332 |
|
} |
333 |
|
|
339 |
|
} |
340 |
|
|
341 |
|
TTree* MergeTrees(vector<TTree*> trees) { |
322 |
– |
cout << "Quick overview of tree addresses : " << endl; |
323 |
– |
for(int i=0;i<(int)trees.size();i++) { |
324 |
– |
cout << "Tree " << i << " : " << trees[i] << endl; |
325 |
– |
} |
326 |
– |
cout << "Address of first tree : " << trees[0] << endl; |
342 |
|
TTree * newtree = (TTree*)trees[0]->CloneTree(0); |
343 |
+ |
newtree->SetTitle("FullTree"); |
344 |
+ |
newtree->SetName("FullTree"); |
345 |
|
trees[0]->GetListOfClones()->Remove(newtree); |
346 |
|
trees[0]->ResetBranchAddresses(); |
347 |
|
newtree->ResetBranchAddresses(); |
377 |
|
if(is_data==1&&allsamples.collection[isample].is_data==false) continue;//kick all samples that aren't data if we're looking for data. |
378 |
|
if(is_data!=1&&allsamples.collection[isample].is_data==true) continue;//kick all data samples when looking for MC |
379 |
|
if(is_data!=2&&allsamples.collection[isample].is_signal==true) continue;//remove signal sample if we don't want it. |
380 |
< |
if(EdgeFitter::MarcoDebug) cout << "Considering : " << allsamples.collection[isample].samplename << endl; |
380 |
> |
if(EdgeFitter::MarcoDebug) dout << "Considering : " << allsamples.collection[isample].samplename << endl; |
381 |
|
SkimmedTree[isample] = SkimTree(isample); |
382 |
|
tempout->cd(); |
383 |
|
SkimmedTree[isample]->Write(); |
386 |
|
|
387 |
|
TTree *completetree = MergeTrees(SkimmedTrees); |
388 |
|
|
389 |
< |
if(EdgeFitter::MarcoDebug) cout << "Complete tree now contains " << completetree->GetEntries() << " entries " << endl; |
389 |
> |
if(EdgeFitter::MarcoDebug) dout << "Complete tree now contains " << completetree->GetEntries() << " entries " << endl; |
390 |
|
|
391 |
|
RooRealVar mll("mll","m_{ll}",mllmin,mllmax,"GeV/c^{2}"); |
392 |
|
RooRealVar id1("id1","id1",0,1,"GeV/c^{2}"); |
400 |
|
tempout->cd(); |
401 |
|
completetree->Write(); |
402 |
|
tempout->Close(); |
386 |
– |
|
403 |
|
|
404 |
|
EdgeFitter::SFSample = (RooDataSet*)LAllData.reduce("id1==id2"); |
405 |
|
EdgeFitter::OFSample = (RooDataSet*)LAllData.reduce("id1!=id2"); |
410 |
|
AllData->SetName("AllData"); |
411 |
|
|
412 |
|
if(EdgeFitter::MarcoDebug) { |
413 |
< |
cout << "Number of events in data sample = " << AllData->sumEntries() << endl; |
414 |
< |
cout << "Number of events in eemm sample = " << SFSample->sumEntries() << endl; |
415 |
< |
cout << "Number of events in em sample = " << OFSample->sumEntries() << endl; |
413 |
> |
dout << "Number of (weighted) events in full sample = " << AllData->sumEntries() << " (raw events : " << AllData->numEntries() << ")" << endl; |
414 |
> |
dout << "Number of (weighted) events in eemm sample = " << SFSample->sumEntries() << " (raw events : " << SFSample->numEntries() << ")" << endl; |
415 |
> |
dout << "Number of (weighted) events in em sample = " << OFSample->sumEntries() << " (raw events : " << OFSample->numEntries() << ")" << endl; |
416 |
|
} |
417 |
|
|
418 |
|
} |
419 |
|
|
420 |
|
void EdgeFitter::DrawDatasetContent(int is_data) { |
421 |
+ |
TCanvas* cSFdata = new TCanvas("cSFdata","cSFdata") ; |
422 |
+ |
|
423 |
|
RooRealVar mll("mll","m_{ll}",mllmin,mllmax,"GeV/c^{2}"); |
424 |
|
RooPlot* frame1 = mll.frame(RooFit::Bins(int((mllmax-mllmin)/5.0)),RooFit::Title("SF sample")) ; |
425 |
|
frame1->GetXaxis()->CenterTitle(1); |
431 |
|
frame2->GetYaxis()->CenterTitle(1); |
432 |
|
OFSample->plotOn(frame2,RooFit::Name("OFdata")) ; |
433 |
|
|
434 |
< |
TCanvas* cSFdata = new TCanvas("cSFdata","cSFdata") ; |
434 |
> |
// THStack sf_ref = allsamples.DrawStack("sf_ref","mll",int((mllmax-mllmin)/5.0),mllmin,mllmax, "m_{ll} [GeV]", "events", cut&&TCut("id1==id2"),is_data, luminosity); |
435 |
> |
// THStack of_ref = allsamples.DrawStack("of_ref","mll",int((mllmax-mllmin)/5.0),mllmin,mllmax, "m_{ll} [GeV]", "events", cut&&TCut("id1!=id2"),is_data, luminosity); |
436 |
> |
|
437 |
> |
TH1F *sf_ref = allsamples.Draw("sf_ref","mll",int((mllmax-mllmin)/5.0),mllmin,mllmax, "m_{ll} [GeV]", "events", cut&&TCut("id1==id2"),is_data, luminosity); |
438 |
> |
TH1F *of_ref = allsamples.Draw("of_ref","mll",int((mllmax-mllmin)/5.0),mllmin,mllmax, "m_{ll} [GeV]", "events", cut&&TCut("id1!=id2"),is_data, luminosity); |
439 |
> |
|
440 |
> |
TH1F *sf_fit = (TH1F*)SFSample->createHistogram("sf_fit",mll,RooFit::Binning(int((mllmax-mllmin)/5)),RooFit::SumW2Error(true)); |
441 |
> |
TH1F *of_fit = (TH1F*)OFSample->createHistogram("of_fit",mll,RooFit::Binning(int((mllmax-mllmin)/5)),RooFit::SumW2Error(true)); |
442 |
> |
|
443 |
> |
TLegend *leg = allsamples.allbglegend(); |
444 |
> |
leg->AddEntry(sf_fit,"RooDataSet content","p"); |
445 |
> |
leg->SetX1(0.58); |
446 |
> |
|
447 |
|
cSFdata->cd() ; |
448 |
|
gPad->SetLeftMargin(0.15); |
449 |
|
frame1->GetYaxis()->SetTitleOffset(1.4); |
450 |
|
frame1->Draw(); |
451 |
+ |
sf_ref->Draw("histo,same"); |
452 |
+ |
sf_fit->Draw("e1,same"); |
453 |
+ |
leg->Draw("same"); |
454 |
|
if(is_data==data) DrawPrelim(); |
455 |
|
else DrawPrelim(PlottingSetup::luminosity,true); |
456 |
|
CompleteSave(cSFdata,"Edge/SF_NoFit"); |
458 |
|
TCanvas* cOFdata = new TCanvas("cOFdata","cOFdata") ; |
459 |
|
cOFdata->cd() ; |
460 |
|
gPad->SetLeftMargin(0.15); |
461 |
+ |
frame2->SetMaximum(frame1->GetMaximum()); |
462 |
|
frame2->GetYaxis()->SetTitleOffset(1.4); |
463 |
|
frame2->Draw(); |
464 |
+ |
of_ref->Draw("histo,same"); |
465 |
+ |
of_fit->Draw("e1,same"); |
466 |
+ |
leg->Draw("same"); |
467 |
|
if(is_data==data) DrawPrelim(); |
468 |
|
else DrawPrelim(PlottingSetup::luminosity,true); |
469 |
|
CompleteSave(cOFdata,"Edge/OF_NoFit"); |
470 |
+ |
|
471 |
+ |
delete sf_fit; |
472 |
+ |
delete of_fit; |
473 |
+ |
|
474 |
+ |
delete sf_ref; |
475 |
+ |
delete of_ref; |
476 |
+ |
|
477 |
|
} |
478 |
|
|
479 |
|
string WriteWithError(float central, float error, int digits) { |
513 |
|
} |
514 |
|
|
515 |
|
void EdgeFitter::DoFit(int is_data, float jzb_cut) { |
516 |
+ |
|
517 |
+ |
stringstream prefix; |
518 |
+ |
if(is_data==data) prefix << "data_"; |
519 |
+ |
if(is_data==mc) prefix << "mc_"; |
520 |
+ |
if(is_data==mcwithsignal) prefix << "mcwithS_"; |
521 |
+ |
|
522 |
+ |
prefix << EdgeFitter::Mode << "_" << jzb_cut; |
523 |
+ |
|
524 |
+ |
if(EdgeFitter::AllowTriangle) prefix << "__H1"; |
525 |
+ |
else prefix << "__H0"; |
526 |
+ |
|
527 |
|
RooRealVar mll("mll","m_{ll}",mllmin,mllmax,"GeV/c^{2}"); |
528 |
|
RooRealVar edgeWeight("edgeWeight","edgeWeight",0,1000,""); |
529 |
|
RooCategory sample("sample","sample") ; |
536 |
|
|
537 |
|
|
538 |
|
//First we make a fit to opposite flavor |
539 |
< |
RooRealVar fttbarOF("fttbarOF", "fttbarOF", 100, 0, 10000); |
539 |
> |
RooRealVar fttbarOF("fttbarOF", "fttbarOF", 100, 0, 1.5*combData.sumEntries()); |
540 |
|
RooRealVar par1ttbarOF("par1ttbarOF", "par1ttbarOF", 1.6, 0.01, 4.0); |
541 |
|
RooRealVar par2ttbarOF("par2ttbarOF", "par2ttbarOF", 1.0); |
542 |
|
RooRealVar par3ttbarOF("par3ttbarOF", "par3ttbarOF", 0.028, 0.001, 1.0); |
546 |
|
RooSimultaneous simPdfOF("simPdfOF","simultaneous pdf", sample) ; |
547 |
|
simPdfOF.addPdf(model_OF,"OF"); |
548 |
|
RooFitResult *resultOF = simPdfOF.fitTo(combData, RooFit::Save(),RooFit::Extended(),RooFit::Minos(true)); |
549 |
< |
//resultOF->Print(); |
549 |
> |
dout << "============================= < OF results > =============================" << endl; |
550 |
> |
resultOF->Print(); |
551 |
> |
dout << "============================= < /OF results > =============================" << endl; |
552 |
> |
|
553 |
> |
|
554 |
> |
RooPlot* frameO = mll.frame(RooFit::Bins(int((mllmax-mllmin)/5.0)),RooFit::Title("OF sample")); |
555 |
> |
frameO->GetXaxis()->CenterTitle(1); |
556 |
> |
frameO->GetYaxis()->CenterTitle(1); |
557 |
> |
combData.plotOn(frameO,RooFit::Name("OFdata"),RooFit::Cut("sample==sample::OF")) ; |
558 |
> |
simPdfOF.plotOn(frameO,RooFit::Slice(sample,"OF"),RooFit::Name("FullFit"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ; |
559 |
> |
simPdfOF.plotOn(frameO,RooFit::Slice(sample,"OF"),RooFit::Name("TTbarOFonly"),RooFit::Components("ttbarOF"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ; |
560 |
|
|
561 |
+ |
TCanvas* pof = new TCanvas("pof","pof") ; |
562 |
+ |
pof->cd() ; |
563 |
+ |
gPad->SetLeftMargin(0.15); |
564 |
+ |
frameO->GetYaxis()->SetTitleOffset(1.4); |
565 |
+ |
frameO->Draw(); |
566 |
+ |
if(is_data==data) DrawPrelim(); |
567 |
+ |
else DrawPrelim(PlottingSetup::luminosity,true); |
568 |
+ |
if(EdgeFitter::FixedMEdge>=0) CompleteSave(pof,"Edge/OF__OFFitonly_"+prefix.str()+"__MEdgeFix_"+any2string(EdgeFitter::FixedMEdge),false,false); |
569 |
+ |
else CompleteSave(pof,"Edge/OF__OFFitonly_"+prefix.str(),false,false); |
570 |
+ |
delete pof; |
571 |
+ |
|
572 |
|
if(resultOF->covQual()!=3) { |
573 |
|
write_error(__FUNCTION__,"OF fit did not converge!!! Cannot continue!"); |
574 |
< |
cout << "covQual is " << resultOF->covQual() << endl; |
575 |
< |
EdgeFitter::FixedMEdgeChi2=-1; |
574 |
> |
dout << "covQual is " << resultOF->covQual() << endl; |
575 |
> |
if(EdgeFitter::AllowTriangle) EdgeFitter::FixedMEdgeChi2_H1=-1; |
576 |
> |
else EdgeFitter::FixedMEdgeChi2_H0=-1; |
577 |
|
if(EdgeFitter::RejectPointIfNoConvergence) return; |
578 |
|
} else { |
579 |
|
write_info(__FUNCTION__,"OF fit converged"); |
580 |
|
} |
504 |
– |
|
505 |
– |
RooRealVar* resultOFpar1_ = (RooRealVar*) resultOF->floatParsFinal().find("par1ttbarOF"); |
506 |
– |
float resultOFpar1 = resultOFpar1_->getVal(); |
507 |
– |
//RooRealVar* resultOFpar2_ = (RooRealVar*) resultOF->floatParsFinal().find("par2ttbarOF"); |
508 |
– |
//float resultOFpar2 = resultOFpar2_->getVal(); |
509 |
– |
//cout << "caca2.txt" << endl; |
510 |
– |
|
511 |
– |
RooRealVar* resultOFpar3_ = (RooRealVar*) resultOF->floatParsFinal().find("par3ttbarOF"); |
512 |
– |
float resultOFpar3 = resultOFpar3_->getVal(); |
513 |
– |
|
514 |
– |
//RooRealVar* resultOFpar4_ = (RooRealVar*) resultOF->floatParsFinal().find("par4ttbarOF"); |
515 |
– |
//float resultOFpar4 = resultOFpar4_->getVal(); |
516 |
– |
//cout << "caca4.txt" << endl; |
581 |
|
|
582 |
|
float StartingMedge=70; |
583 |
|
if(EdgeFitter::FixedMEdge>0) StartingMedge=EdgeFitter::FixedMEdge; |
584 |
|
|
585 |
|
|
586 |
+ |
RooDataSet *ZDataSet = (RooDataSet*)EdgeFitter::AllData->reduce("id1==id2 && abs(mll-91.2)<20"); |
587 |
+ |
|
588 |
+ |
float maxZ = ZDataSet->sumEntries(); |
589 |
+ |
dout << "maxZ was set to " << maxZ << endl; |
590 |
+ |
delete ZDataSet; |
591 |
+ |
|
592 |
+ |
|
593 |
|
// Now same flavor |
594 |
< |
RooRealVar fzSF("fzSF", "fzSF", 5, 0, 100000); |
594 |
> |
RooRealVar fzSF("fzSF", "fzSF", 39, 39, maxZ); |
595 |
|
RooRealVar meanzSF("meanzSF", "meanzSF", 91.1876, 89, 95); |
596 |
|
//RooRealVar sigmazSF("sigmazSF", "sigmazSF", 0.5); |
597 |
|
RooRealVar sigmazSF("sigmazSF", "sigmazSF", 5, 0.5, 5); |
598 |
|
RooRealVar widthzSF("widthzSF", "widthzSF", 2.94); |
599 |
+ |
widthzSF.setConstant(1); |
600 |
+ |
|
601 |
+ |
/*RooRealVar fttbarSFx("fttbarSFx","fttbarSFx",0.2,1.8); |
602 |
+ |
RooRealVar mRsfof("mRsfof","mRsfof",1.02); |
603 |
+ |
RooRealVar wRsfof("wRsfof","wRsfof",0.07); |
604 |
|
|
605 |
< |
RooRealVar fttbarSF("fttbarSF", "fttbarSF", 100, 0, 100000); |
606 |
< |
RooRealVar par1ttbarSF("par1ttbarSF", "par1ttbarSF", 1.02*resultOFpar1, 0, 100); |
607 |
< |
RooRealVar par2ttbarSF("par2ttbarSF", "par2ttbarSF", 1.0); |
608 |
< |
RooRealVar par3ttbarSF("par3ttbarSF", "par3ttbarSF", resultOFpar3, 0, 100); |
609 |
< |
RooRealVar par4ttbarSF("par4ttbarSF", "par4ttbarSF", 2.0); |
605 |
> |
RooGaussian RSFOF("RSFOF","RSFOF",fttbarSFx,mRsfof,wRsfof); |
606 |
> |
RooProdPdf fttbarSF("fttbarSF","fttbarOF*RSFOF",RooArgList(RSFOF,fttbarOF));*/ |
607 |
> |
RooRealVar fttbarSF("fttbarSF", "fttbarSF", fttbarOF.getVal(), 0.2*fttbarOF.getVal(), 1.5*fttbarOF.getVal()); |
608 |
> |
|
609 |
> |
RooRealVar par1ttbarSF("par1ttbarSF", "par1ttbarSF", 1.02*par1ttbarOF.getVal(), (1.02-0.07)*par1ttbarOF.getVal(), (1.02+0.07)*par1ttbarOF.getVal()); |
610 |
|
|
611 |
< |
RooRealVar fsignalSF("fsignalSF", "fsignalSF", 10, 0, 300); |
611 |
> |
RooRealVar fsignalSF("fsignalSF", "fsignalSF", 0, 0, 300); |
612 |
|
RooRealVar par1signalSF("par1signalSF", "par1signalSF", 45, 20, 100); |
613 |
|
RooRealVar par2signalSF("par2signalSF", "par2signalSF", 2, 1, 10); |
614 |
|
RooRealVar par3signalSF("par3signalSF", "par3signalSF", StartingMedge, 0, 300); |
617 |
|
|
618 |
|
if(EdgeFitter::FixedMEdge>0) par3signalSF.setConstant(); |
619 |
|
|
620 |
< |
/* par1ttbarOF.setConstant(1); |
545 |
< |
par2ttbarOF.setConstant(1); |
546 |
< |
par3ttbarOF.setConstant(1); |
547 |
< |
par4ttbarOF.setConstant(1); |
548 |
< |
fttbarOF.setConstant(1);*/ |
549 |
< |
|
550 |
< |
RooSUSYBkgPdf ttbarSF("ttbarSF","ttbarSF", mll , par1ttbarSF, par2ttbarSF, par3ttbarSF, par4ttbarSF); |
551 |
< |
//RooSUSYTPdf signalSF("signalSF","signalSF", mll , par1signalSF, par2signalSF, par3signalSF); |
620 |
> |
RooSUSYBkgPdf ttbarSF("ttbarSF","ttbarSF", mll , par1ttbarSF, par2ttbarOF, par3ttbarOF, par4ttbarOF); |
621 |
|
RooSUSYTPdf signalSF("signalSF","signalSF", mll , par1signalSF, sigmazSF, par3signalSF); |
553 |
– |
|
554 |
– |
/* par1ttbarSF.setConstant(true); |
555 |
– |
par2ttbarSF.setConstant(true); |
556 |
– |
par3ttbarSF.setConstant(true); |
557 |
– |
par4ttbarSF.setConstant(true);*/ |
558 |
– |
|
622 |
|
|
560 |
– |
//RooAddPdf model_SF("model_SF","model_SF", RooArgList(zSF, ttbarSF, signalSF), RooArgList(fzSF, fttbarSF, fsignalSF)); |
623 |
|
RooAddPdf model_SF("model_SF","model_SF", RooArgList(zSF, ttbarSF, signalSF), RooArgList(fzSF, fttbarSF, fsignalSF)); |
624 |
< |
// RooAddPdf model_OF("model_OF","model_OF", RooArgList(ttbarSF), RooArgList(fttbarSF)); |
625 |
< |
|
624 |
> |
|
625 |
> |
|
626 |
> |
if(!EdgeFitter::AllowTriangle) { |
627 |
> |
fsignalSF.setVal(0.0); // kill off the signal if we don't want the triangle |
628 |
> |
fsignalSF.setConstant(1); |
629 |
> |
par1signalSF.setConstant(1); |
630 |
> |
par2signalSF.setConstant(1); |
631 |
> |
par3signalSF.setConstant(1); |
632 |
> |
} |
633 |
|
|
634 |
|
RooSimultaneous simPdf("simPdf","simultaneous pdf",sample) ; |
635 |
|
simPdf.addPdf(model_SF,"SF") ; |
636 |
|
simPdf.addPdf(model_OF,"OF") ; |
637 |
|
|
638 |
+ |
|
639 |
|
RooFitResult *result = simPdf.fitTo(combData, RooFit::Save(), RooFit::Extended(),RooFit::Minos(true)); |
640 |
|
|
641 |
|
if(result->covQual()!=3) { |
642 |
|
write_error(__FUNCTION__,"Full fit did not converge!!! Cannot continue!"); |
643 |
< |
cout << "covQual is " << result->covQual() << endl; |
644 |
< |
EdgeFitter::FixedMEdgeChi2=-1; |
643 |
> |
dout << "covQual is " << result->covQual() << endl; |
644 |
> |
if(EdgeFitter::AllowTriangle) EdgeFitter::FixedMEdgeChi2_H1=-1; |
645 |
> |
else EdgeFitter::FixedMEdgeChi2_H0=-1; |
646 |
|
if(EdgeFitter::RejectPointIfNoConvergence) return; |
647 |
|
} else { |
648 |
|
write_info(__FUNCTION__,"Full fit converged"); |
649 |
|
} |
650 |
|
|
651 |
< |
// result->Print(); |
651 |
> |
dout << "============================= < Full results > =============================" << endl; |
652 |
> |
result->Print(); |
653 |
> |
dout << "============================= < /Full results > =============================" << endl; |
654 |
> |
|
655 |
|
|
656 |
|
RooPlot* frame1 = mll.frame(RooFit::Bins(int((mllmax-mllmin)/5.0)),RooFit::Title("EE sample")) ; |
657 |
|
frame1->GetXaxis()->CenterTitle(1); |
660 |
|
simPdf.plotOn(frame1,RooFit::Slice(sample,"SF"),RooFit::Name("FullFit"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ; |
661 |
|
simPdf.plotOn(frame1,RooFit::Slice(sample,"SF"),RooFit::Name("TTbarSFonly"),RooFit::Components("ttbarSF"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ; |
662 |
|
simPdf.plotOn(frame1,RooFit::Slice(sample,"SF"),RooFit::Name("DYSFonly"),RooFit::Components("zSF"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kRed)); |
663 |
< |
simPdf.plotOn(frame1,RooFit::Slice(sample,"SF"),RooFit::Name("SignalSFonly"),RooFit::Components("signalSF"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kGreen)); |
590 |
< |
|
591 |
< |
EdgeFitter::FixedMEdgeChi2 = frame1->chiSquare("FullFit", "SFdata", 3); |
592 |
< |
|
663 |
> |
if(EdgeFitter::AllowTriangle) simPdf.plotOn(frame1,RooFit::Slice(sample,"SF"),RooFit::Name("SignalSFonly"),RooFit::Components("signalSF"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kGreen)); |
664 |
|
|
665 |
< |
cout << "Result : " << endl; |
666 |
< |
cout << "f signal : " << fsignalSF.getVal() << " +/- " << fsignalSF.getError() << endl; |
667 |
< |
cout << "f ttbar : " << fttbarSF.getVal() << " +/- " << fttbarSF.getError() << endl; |
668 |
< |
cout << "f tt OF : " << fttbarOF.getVal() << " +/- " << fttbarOF.getError() << endl; |
669 |
< |
cout << "f z SF : " << fzSF.getVal() << " +/- " << fzSF.getError() << endl; |
670 |
< |
cout << "#Chi^{2}/NDF : " << EdgeFitter::FixedMEdgeChi2 << endl; |
665 |
> |
if(EdgeFitter::AllowTriangle) EdgeFitter::FixedMEdgeChi2_H1=frame1->chiSquare("FullFit", "SFdata", 3); |
666 |
> |
else EdgeFitter::FixedMEdgeChi2_H0=frame1->chiSquare("FullFit", "SFdata", 3); |
667 |
> |
|
668 |
> |
dout << "Result : " << endl; |
669 |
> |
if(EdgeFitter::AllowTriangle) dout << "f signal : " << fsignalSF.getVal() << " +/- " << fsignalSF.getError() << endl; |
670 |
> |
// dout << "f ttbar : " << fttbarSF.getVal() << " +/- " << fttbarSF.getError() << endl; |
671 |
> |
dout << "f ttbar : " << fttbarSF.getVal() << " +/- NO ERROR CUZ ITS A PDF "<< endl; |
672 |
> |
dout << "f tt OF : " << fttbarOF.getVal() << " +/- " << fttbarOF.getError() << endl; |
673 |
> |
dout << "f z SF : " << fzSF.getVal() << " +/- " << fzSF.getError() << endl; |
674 |
> |
if(EdgeFitter::AllowTriangle) dout << "#Chi^{2}/NDF : " << EdgeFitter::FixedMEdgeChi2_H1 << endl; |
675 |
> |
else dout << "#Chi^{2}/NDF : " << EdgeFitter::FixedMEdgeChi2_H0 << endl; |
676 |
|
|
677 |
|
// The same plot for the cointrol sample slice |
678 |
|
RooPlot* frame3 = mll.frame(RooFit::Bins(int((mllmax-mllmin)/5.0)),RooFit::Title("OF sample")) ; |
680 |
|
frame3->GetYaxis()->CenterTitle(1); |
681 |
|
frame3->SetMaximum(frame1->GetMaximum()); |
682 |
|
combData.plotOn(frame3,RooFit::Cut("sample==sample::OF")) ; |
683 |
< |
simPdfOF.plotOn(frame3,RooFit::Slice(sample,"OF"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ; |
684 |
< |
simPdfOF.plotOn(frame3,RooFit::Slice(sample,"OF"),RooFit::Components("ttbarOF"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ; |
609 |
< |
|
610 |
< |
|
611 |
< |
stringstream prefix; |
612 |
< |
if(is_data==data) prefix << "data_"; |
613 |
< |
if(is_data==mc) prefix << "mc_"; |
614 |
< |
if(is_data==mcwithsignal) prefix << "mcwithS_"; |
615 |
< |
|
616 |
< |
prefix << EdgeFitter::Mode << "_" << jzb_cut; |
617 |
< |
|
683 |
> |
simPdf.plotOn(frame3,RooFit::Slice(sample,"OF"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ; |
684 |
> |
simPdf.plotOn(frame3,RooFit::Slice(sample,"OF"),RooFit::Components("ttbarOF"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ; |
685 |
|
|
686 |
|
|
687 |
|
TCanvas* c = new TCanvas("rf501_simultaneouspdf","rf403_simultaneouspdf") ; |
695 |
|
infotext << "#splitline{Fit results (" << EdgeFitter::Mode << ">" << jzb_cut << "): }{#splitline{"; |
696 |
|
infotext << "N(Data) = " << EdgeFitter::SFSample->sumEntries() << "}{#splitline{"; |
697 |
|
infotext << "N(Z+Jets) = " << WriteWithError(fzSF.getVal(),fzSF.getError(),3) << "}{#splitline{"; |
698 |
< |
infotext << "N(t#bar{t}) = " << WriteWithError(fttbarSF.getVal(),fttbarSF.getError(),3) << "}{#splitline{"; |
699 |
< |
infotext << "N(signal) = " << WriteWithError(fsignalSF.getVal(),fsignalSF.getError(),3) << "}{"; |
700 |
< |
infotext << "m_{edge} = " << WriteWithError(par3signalSF.getVal(),par3signalSF.getError(),3) << "}}}}}"; |
698 |
> |
//infotext << "N(t#bar{t}) = " << WriteWithError(fttbarSF.getVal(),fttbarSF.getError(),3) << "}{#splitline{"; |
699 |
> |
infotext << "N(t#bar{t}) = " << WriteWithError(fttbarSF.getVal(),0,3) << "}{#splitline{"; |
700 |
> |
write_warning(any2string(__LINE__),"Don't have the error yet, need to complete this"); |
701 |
> |
if(EdgeFitter::AllowTriangle) { |
702 |
> |
infotext << "N(signal) = " << WriteWithError(fsignalSF.getVal(),fsignalSF.getError(),3) << "}{"; |
703 |
> |
infotext << "m_{edge} = " << WriteWithError(par3signalSF.getVal(),par3signalSF.getError(),3) << "}}}}}"; |
704 |
> |
} else infotext << "}{}}}}}"; |
705 |
|
|
706 |
|
TLatex *infobox = new TLatex(0.57,0.75,infotext.str().c_str()); |
707 |
|
infobox->SetNDC(); |
770 |
|
RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL); |
771 |
|
|
772 |
|
|
702 |
– |
bool ScanMassRange=false; |
773 |
|
|
774 |
+ |
EdgeFitter::AllowTriangle=false; |
775 |
+ |
EdgeFitter::DoFit(is_data, jzb_cut); |
776 |
+ |
|
777 |
+ |
write_info(__FUNCTION__,"TAKING SHORTCUT");return; |
778 |
+ |
|
779 |
+ |
EdgeFitter::AllowTriangle=true; |
780 |
+ |
|
781 |
+ |
bool ScanMassRange=false; |
782 |
+ |
float ScanSteps=5.0;//GeV |
783 |
|
|
784 |
|
|
785 |
|
if(ScanMassRange) { |
786 |
|
TFile *fscan = new TFile("fscan.root","UPDATE"); |
787 |
|
TGraph *gr = new TGraph(); |
788 |
+ |
TGraph *Rgr = new TGraph(); |
789 |
|
stringstream GrName; |
790 |
|
GrName << "ScanGraphFor_" << EdgeFitter::Mode << "_" << jzb_cut; |
791 |
+ |
stringstream RGrName; |
792 |
+ |
RGrName << "ScanRatioGraphFor_" << EdgeFitter::Mode << "_" << jzb_cut; |
793 |
|
gr->SetName(GrName.str().c_str()); |
794 |
+ |
Rgr->SetName(RGrName.str().c_str()); |
795 |
|
|
796 |
|
int i=0; |
797 |
< |
for(float tempMedge=10;tempMedge<=300;tempMedge+=5.0) { |
797 |
> |
for(float tempMedge=10;tempMedge<=300;tempMedge+=ScanSteps) { |
798 |
|
write_info(__FUNCTION__,"Now testing Medge="+any2string(tempMedge)+" for "+EdgeFitter::Mode+">"+any2string(jzb_cut)); |
799 |
|
EdgeFitter::FixedMEdge=tempMedge; |
800 |
|
EdgeFitter::DoFit(is_data, jzb_cut); |
801 |
< |
if(EdgeFitter::FixedMEdgeChi2<0) continue; |
802 |
< |
gr->SetPoint(i,tempMedge,EdgeFitter::FixedMEdgeChi2); |
801 |
> |
if(EdgeFitter::FixedMEdgeChi2_H1<0) continue; |
802 |
> |
gr->SetPoint(i,tempMedge,EdgeFitter::FixedMEdgeChi2_H1); |
803 |
> |
Rgr->SetPoint(i,tempMedge,EdgeFitter::FixedMEdgeChi2_H1/EdgeFitter::FixedMEdgeChi2_H0); |
804 |
|
i++; |
805 |
|
} |
806 |
|
|
819 |
|
if(is_data) DrawPrelim(); |
820 |
|
else DrawMCPrelim(); |
821 |
|
CompleteSave(ScanCan,ScanCanSave.str()); |
822 |
+ |
|
823 |
+ |
Rgr->GetXaxis()->SetTitle("m_{edge}"); |
824 |
+ |
Rgr->GetXaxis()->CenterTitle(); |
825 |
+ |
Rgr->GetYaxis()->SetTitle("#Chi^{2} / NDF"); |
826 |
+ |
Rgr->GetYaxis()->CenterTitle(); |
827 |
+ |
Rgr->GetYaxis()->SetTitleOffset(0.95); |
828 |
+ |
Rgr->GetXaxis()->SetTitleOffset(0.9); |
829 |
+ |
Rgr->SetLineColor(kBlue); |
830 |
+ |
Rgr->SetTitle(""); |
831 |
+ |
Rgr->Draw("AL"); |
832 |
+ |
ScanCanSave.str(""); |
833 |
+ |
ScanCanSave << "Edge/MEdgeScan_Ratio_"+EdgeFitter::Mode+"_" << jzb_cut; |
834 |
+ |
if(is_data) DrawPrelim(); |
835 |
+ |
else DrawMCPrelim(); |
836 |
+ |
CompleteSave(ScanCan,ScanCanSave.str()); |
837 |
|
fscan->cd(); |
838 |
|
gr->Write(); |
839 |
|
delete ScanCan; |
840 |
|
fscan->Close(); |
841 |
|
} else { |
842 |
|
EdgeFitter::DoFit(is_data, jzb_cut); |
843 |
+ |
dout << "Chi^2 (H0) = " << EdgeFitter::FixedMEdgeChi2_H0 << endl; |
844 |
+ |
dout << "Chi^2 (H1) = " << EdgeFitter::FixedMEdgeChi2_H1 << endl; |
845 |
|
} |
846 |
|
|
746 |
– |
|
747 |
– |
|
847 |
|
|
749 |
– |
EdgeFitter::DoFit(is_data, jzb_cut); |
848 |
|
RooMsgService::instance().setGlobalKillBelow(msglevel); |
849 |
|
|
752 |
– |
|
850 |
|
f->Close(); |
851 |
|
|
852 |
|
} |