ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/Plotting/Modules/EdgeLimit.C
(Generate patch)

Comparing UserCode/cbrown/Development/Plotting/Modules/EdgeLimit.C (file contents):
Revision 1.1 by buchmann, Tue Jun 12 06:12:29 2012 UTC vs.
Revision 1.5 by buchmann, Wed Jun 27 08:53:23 2012 UTC

# Line 1 | Line 1
1   #include <iostream>
2  
3 + #include <RooRealVar.h>
4 + #include <RooArgSet.h>
5 + #include <RooDataSet.h>
6 + #include <RooMCStudy.h>
7 + #include <RooCategory.h>
8 +
9 + #include <RooPlot.h>
10 + #include <RooSimultaneous.h>
11 + #include <RooAddPdf.h>
12 + #include <RooFitResult.h>
13 + #include <RooVoigtian.h>
14 + #include <RooMsgService.h>
15 +
16 + #include <RooStats/ModelConfig.h>
17 + #include "RooStats/ProfileLikelihoodCalculator.h"
18 + #include "RooStats/LikelihoodInterval.h"
19 + #include "RooStats/HypoTestResult.h"
20 + #include "RooStats/SimpleLikelihoodRatioTestStat.h"
21 + #include "RooStats/ProfileLikelihoodTestStat.h"
22 + #include "RooStats/HybridCalculatorOriginal.h"
23 + #include "RooStats/HypoTestInverterOriginal.h"
24 +
25 + //#include "ParametrizedEdge.C"
26 + #include "/shome/pablom/RooFit/Pdfs/RooSUSYTPdf.cxx"
27 + #include "/shome/pablom/RooFit/Pdfs/RooSUSYBkgPdf.cxx"
28 +
29 +
30   using namespace std;
31   using namespace PlottingSetup;
32  
33  
34 +
35 +
36   ShapeDroplet LimitsFromEdge(float low_fullCLs, float high_CLs, TTree *events, string addcut, string name, string mcjzb, string datajzb, vector<float> jzbbins, float jzbpeakerrormc, float jzbpeakerrordata) {
37    write_error(__FUNCTION__,"Not implemented edge limits yet (returning crap)");
38    ShapeDroplet beta;beta.observed=-12345;beta.SignalIntegral=1;return beta;
# Line 15 | Line 44 | void PrepareEdgeShapes(string mcjzb, str
44   }
45    
46  
47 + ///------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
48 +
49 +
50 + namespace EdgeFitter {
51 +  
52 +  void DoEdgeFit(string mcjzb, string datajzb, float DataPeakError, float MCPeakError, float jzb_cut, int icut, int is_data, TCut cut, TTree*);
53 +  void DoEdgeFit(string mcjzb, string datajzb, float DataPeakError, float MCPeakError, vector<float> jzb_cut, int is_data, TCut cut, TTree*);
54 +  void getMedianLimit(RooWorkspace *ws,vector<RooDataSet*> theToys,float &median,float &sigmaDown, float &sigmaUp, float &twoSigmaDown, float &twoSigmaUp);
55 +  void InitializeVariables(float _mllmin, float _mllmax, float _jzbmax, TCut _cut);
56 +  void PrepareDatasets(int);
57 +  void DoFit(int is_data, float jzb_cut);
58 +  string RandomStorageFile();
59 +  Yield Get_Z_estimate(float,int);
60 +  Yield Get_T_estimate(float,int);
61 +  float calcExclusion(RooWorkspace *ws, RooDataSet *data = NULL);
62 +  void prepareLimits(RooWorkspace *ws);
63 +  vector<RooDataSet*> generateToys(RooWorkspace *ws, int nToys);
64 +  void prepareLimits(RooWorkspace *ws, bool ComputeBands);
65 +  TGraph* prepareLM(float mass, float nEv);
66 +  
67 +  float jzbmax;
68 +  float mllmin;
69 +  float mllmax;
70 +  TCut cut;
71 +  
72 +  RooDataSet* AllData;
73 +  RooDataSet* eeSample;
74 +  RooDataSet* mmSample;
75 +  RooDataSet* emSample;
76 +  
77 +  bool MarcoDebug;
78 + }
79 +
80 + TGraph* EdgeFitter::prepareLM(float mass, float nEv) {
81 +  float massLM[1];
82 +  massLM[0]=mass;
83 +  float accEffLM[1];
84 +  accEffLM[0]=nEv/PlottingSetup::luminosity;
85 +  TGraph *lm = new TGraph(1, massLM, accEffLM);
86 +  lm->GetXaxis()->SetNoExponent(true);
87 +  lm->GetXaxis()->SetTitle("m_{cut} [GeV]");
88 +  lm->GetYaxis()->SetTitle("#sigma #times A [pb] 95% CL UL");
89 +  lm->GetXaxis()->SetLimits(0.,300.);
90 +  lm->GetYaxis()->SetRangeUser(0.,0.08);
91 +  lm->SetMarkerStyle(34);
92 +  lm->SetMarkerColor(kRed);
93 +  return lm;
94 + }
95 +
96 + vector<RooDataSet*> EdgeFitter::generateToys(RooWorkspace *ws, int nToys) {
97 +  ws->var("nSig")->setVal(0.);
98 +  ws->var("nSig")->setConstant(true);
99 +  RooFitResult* fit = ws->pdf("combModel")->fitTo(*ws->data("data_obs"),RooFit::Save());
100 +  vector<RooDataSet*> theToys;
101 +  
102 +  RooMCStudy mcEE(*ws->pdf("combModel"),RooArgSet(*ws->var("inv")),RooFit::Slice(*ws->cat("cat"),"EE"));
103 +  mcEE.generate(nToys,44,true);
104 +  RooMCStudy mcMM(*ws->pdf("combModel"),RooArgSet(*ws->var("inv")),RooFit::Slice(*ws->cat("cat"),"MM"));
105 +  mcMM.generate(nToys,44,true);
106 +  RooMCStudy mcOSOF(*ws->pdf("combModel"),RooArgSet(*ws->var("inv")),RooFit::Slice(*ws->cat("cat"),"OSOF"));
107 +  mcOSOF.generate(nToys,44,true);
108 +  
109 +  RooRealVar mll("mll","mll",mllmin,mllmax,"GeV/c^{2}");
110 +  RooRealVar id1("id1","id1",0,1,"GeV/c^{2}");
111 +  RooRealVar id2("id2","id2",0,1,"GeV/c^{2}");
112 +  RooRealVar jzb("jzb","jzb",-jzbmax,jzbmax,"GeV/c");
113 +  RooRealVar weight("weight","weight",0,1000,"");
114 +  RooArgSet observables(mll,jzb,id1,id2,weight);
115 +
116 +  for(int i=0;i<nToys;i++) {
117 +    RooDataSet* toyEE    = (RooDataSet*)mcEE.genData(i);
118 +    RooDataSet* toyMM    = (RooDataSet*)mcMM.genData(i);
119 +    RooDataSet* toyOSOF  = (RooDataSet*)mcOSOF.genData(i);
120 +    stringstream toyname;
121 +    toyname << "theToy_" << i;
122 +    write_warning(__FUNCTION__,"Problem while adding toys");
123 + //    RooDataSet *toyData = RooDataSet(toyname.str(),toyname.str(),observables,RooFit::Index(ws->cat("cat")),RooFit::Import("OSOF",*toyOSOF),RooFit::Import("EE",*toyEE),RooFit::Import("MM",*toyMM));
124 + //    theToys.push_back(toyData);
125 +  }
126 +  ws->var("nSig")->setVal(17.0);
127 +  ws->var("nSig")->setConstant(false);
128 +  return theToys;
129 + }
130 +
131 + void EdgeFitter::getMedianLimit(RooWorkspace *ws,vector<RooDataSet*> theToys,float &median,float &sigmaDown, float &sigmaUp, float &twoSigmaDown, float &twoSigmaUp) {
132 +  TH1F *gauLimit = new TH1F("gausLimit","gausLimit",60,0.,80./PlottingSetup::luminosity);
133 +  vector<float> theLimits;
134 +  for(int itoy=0;itoy<theToys.size();itoy++) {
135 +    float theLimit = calcExclusion(ws,theToys[itoy]);
136 +    if(theLimit > 0 ) gauLimit->Fill(theLimit);
137 +  }
138 +  const Int_t nQ = 4;
139 +  Double_t yQ[nQ] = {0.,0.,0.,0.};
140 +  Double_t xQ[nQ] = {0.022750132,0.1586552539,0.84134474609999998,0.977249868};
141 +  gauLimit->GetQuantiles(nQ,yQ,xQ);
142 +  median = gauLimit->GetMean();
143 + //  median = median1(gauLimit);
144 +  twoSigmaDown = abs(yQ[0]-median);
145 +  sigmaDown = abs(yQ[1]-median);
146 +  sigmaUp = abs(yQ[2]-median);
147 +  twoSigmaUp = abs(yQ[3]-median);
148 +  cout << median * PlottingSetup::luminosity << " " << sigmaUp * PlottingSetup::luminosity << endl;
149 + }
150 +
151 + void EdgeFitter::prepareLimits(RooWorkspace *ws, bool ComputeBands) {
152 +  if(ComputeBands) {
153 +    vector<RooDataSet*> theToys = EdgeFitter::generateToys(ws,50);
154 +    vector<float> medVals;
155 +    vector<float> medLimits;
156 +    vector<float> sigmaLimitsDown;
157 +    vector<float> sigmaLimitsUp;
158 +    vector<float> twoSigmaLimitsDown;
159 +    vector<float> twoSigmaLimitsUp;
160 +    for(int i=20;i<=320;i+=40) {
161 +      ws->var("nSig")->setVal(10.0);
162 +      medVals.push_back((float)i);
163 +      ws->var("m0")->setVal((float)i);
164 +      ws->var("m0")->setConstant(true);
165 +      float Smedian,SsigmaDown,SsigmaUp,StwoSigmaDown,StwoSigmaUp;
166 +      EdgeFitter::getMedianLimit(ws,theToys,Smedian,SsigmaDown,SsigmaUp,StwoSigmaDown,StwoSigmaUp);
167 +      medLimits.push_back(Smedian);
168 +      sigmaLimitsDown.push_back(SsigmaDown);
169 +      sigmaLimitsUp.push_back(SsigmaUp);
170 +      twoSigmaLimitsDown.push_back(StwoSigmaDown);
171 +      twoSigmaLimitsUp.push_back(StwoSigmaUp);
172 +    }
173 +    write_warning(__FUNCTION__,"Still need to store limits");
174 +  } else {
175 +    vector<float> theVals;
176 +    vector<float> theLimits;
177 +    for(int i=20;i<300;i+=5) {
178 +      ws->var("nSig")->setVal(0.0);
179 +      theVals.push_back((float)i);
180 +      ws->var("m0")->setVal((float)i);
181 +      ws->var("m0")->setConstant(true);
182 +      theLimits.push_back(calcExclusion(ws));
183 +    }
184 +    
185 +    for(int i=0;i<theLimits.size();i++) {
186 +      if((theLimits[i]<2.0/PlottingSetup::luminosity)||(theLimits[i]>40.0/PlottingSetup::luminosity)) {
187 +        cout << i << " : " << theVals[i] << endl;
188 +        theLimits[i] = (theLimits[i+2]+theLimits[i-2])/2.0;
189 +        write_warning(__FUNCTION__,"Need to store limits");
190 +      }
191 +    write_warning(__FUNCTION__,"Need to store limits");
192 +    }
193 + }
194 + }
195 +  
196 +
197 + float EdgeFitter::calcExclusion(RooWorkspace *ws, RooDataSet *data) {
198 +  RooRealVar mu("mu","nSig",0,10000,"");
199 +  RooArgSet poi = RooArgSet(mu);
200 +  RooArgSet *nullParams = (RooArgSet*)poi.snapshot();
201 +  nullParams->setRealValue("nSig",0);
202 +  RooStats::ModelConfig *model = new RooStats::ModelConfig();
203 +  model->SetWorkspace(*ws);
204 +  model->SetPdf("combModel");
205 +  model->SetParametersOfInterest(poi);
206 +  if(!data) data = (RooDataSet*)ws->data("data_obs");
207 +
208 +  RooStats::ProfileLikelihoodCalculator plc(*data, *model);
209 +  plc.SetNullParameters(*nullParams);
210 +  plc.SetTestSize(0.05);
211 +  RooStats::LikelihoodInterval* interval = plc.GetInterval();
212 +  RooStats::HypoTestResult *htr = plc.GetHypoTest();
213 +  double theLimit = interval->UpperLimit( mu );
214 +  cout << "Significance " << htr->Significance() << endl;
215 +  
216 +  ws->defineSet("obs","nB");
217 +  ws->defineSet("poi","nSig");
218 +  
219 +  RooStats::ModelConfig b_model = RooStats::ModelConfig("B_model", ws);
220 +  b_model.SetPdf(*ws->pdf("combModel"));
221 +  b_model.SetObservables(*ws->set("obs"));
222 +  b_model.SetParametersOfInterest(*ws->set("poi"));
223 +  ws->var("nSig")->setVal(0.0);  //# important!
224 +  b_model.SetSnapshot(*ws->set("poi"));
225 +  
226 +  RooStats::ModelConfig sb_model = RooStats::ModelConfig("S+B_model", ws);
227 +  sb_model.SetPdf(*ws->pdf("combModel"));
228 +  sb_model.SetObservables(*ws->set("obs"));
229 +  sb_model.SetParametersOfInterest(*ws->set("poi"));
230 +  ws->var("nSig")->setVal(64.0); //# important!
231 +  sb_model.SetSnapshot(*ws->set("poi"));
232 +  
233 +  RooStats::SimpleLikelihoodRatioTestStat slrts = RooStats::SimpleLikelihoodRatioTestStat(*b_model.GetPdf(),*sb_model.GetPdf());
234 +  slrts.SetNullParameters(*b_model.GetSnapshot());
235 +  slrts.SetAltParameters(*sb_model.GetSnapshot());
236 +  RooStats::ProfileLikelihoodTestStat profll = RooStats::ProfileLikelihoodTestStat(*b_model.GetPdf());
237 +  
238 +  RooStats::HybridCalculatorOriginal hc = RooStats::HybridCalculatorOriginal(*data, sb_model, b_model,0,0);
239 +  hc.SetTestStatistic(2);
240 +  hc.SetNumberOfToys(50);
241 +  
242 +  RooStats::HypoTestInverterOriginal hcInv =  RooStats::HypoTestInverterOriginal(hc,*ws->var("nSig"));
243 +  hcInv.SetTestSize(0.05);
244 +  hcInv.UseCLs(true);
245 +  hcInv.RunFixedScan(5,theLimit-0.5,theLimit+0.5);;
246 +  RooStats::HypoTestInverterResult* hcInt = hcInv.GetInterval();
247 +  float ulError = hcInt->UpperLimitEstimatedError();
248 +  theLimit = hcInt->UpperLimit();
249 +  cout << "Found upper limit : " << theLimit << "+/-" << ulError << endl;
250 +  
251 +  return theLimit/PlottingSetup::luminosity;
252 +  
253 + }
254 +
255 + TTree* SkimTree(int isample) {
256 +  TTree* newTree = allsamples.collection[isample].events->CloneTree(0);
257 +  float xsweight=1.0;
258 +  if(allsamples.collection[isample].is_data==false) xsweight=luminosity*allsamples.collection[isample].weight;
259 +  if(EdgeFitter::MarcoDebug) {
260 +    cout << "   Original tree contains " << allsamples.collection[isample].events->GetEntries() << endl;
261 +    cout << "   Going to reduce it with cut " << EdgeFitter::cut << endl;
262 +  }
263 +  TTreeFormula *select = new TTreeFormula("select", EdgeFitter::cut, allsamples.collection[isample].events);
264 +  float wgt=1.0;
265 +  allsamples.collection[isample].events->SetBranchAddress(cutWeight,&wgt);
266 +  for (Int_t entry = 0 ; entry < allsamples.collection[isample].events->GetEntries() ; entry++) {
267 +   allsamples.collection[isample].events->LoadTree(entry);
268 +   if (select->EvalInstance()) {
269 +     allsamples.collection[isample].events->GetEntry(entry);
270 +     wgt=wgt*xsweight;
271 +     newTree->Fill();
272 +   }
273 +  }
274 +  
275 +  if(EdgeFitter::MarcoDebug) cout << "     Reduced tree contains " << newTree->GetEntries() << " entries " << endl;
276 +  return newTree;
277 + }
278 +
279 + void EdgeFitter::InitializeVariables(float _mllmin, float _mllmax, float _jzbmax, TCut _cut) {
280 +  mllmin=_mllmin;
281 +  mllmax=_mllmax;
282 +  jzbmax=_jzbmax;
283 +  cut=_cut;
284 + }
285 +  
286 + void EdgeFitter::PrepareDatasets(int is_data) {
287 +  TTree *completetree;
288 +  write_warning(__FUNCTION__,"Need to make this function ready for scans as well (use signal from scan samples)");
289 +  bool hashit=0;
290 +  for(int isample=0;isample<allsamples.collection.size();isample++) {
291 +    if(!allsamples.collection[isample].is_active) continue;
292 +    if(is_data==1&&allsamples.collection[isample].is_data==false) continue;//kick all samples that aren't data if we're looking for data.
293 +    if(is_data==1&&allsamples.collection[isample].is_data==false) continue;//kick all samples that aren't data if we're looking for data.
294 +    if(is_data!=1&&allsamples.collection[isample].is_data==true) continue;//kick all data samples when looking for MC
295 +    if(is_data!=2&&allsamples.collection[isample].is_signal==true) continue;//remove signal sample if we don't want it.
296 +    if(EdgeFitter::MarcoDebug) cout << "Considering : " << allsamples.collection[isample].samplename << endl;
297 +    if(!hashit) {
298 +      hashit=true;
299 +      completetree = SkimTree(isample)->CloneTree();
300 +    } else {
301 +      completetree->CopyEntries(SkimTree(isample));
302 +    }
303 +    if(EdgeFitter::MarcoDebug) cout << "Complete tree now contains " << completetree->GetEntries() << " entries " << endl;
304 +  }
305 +  
306 +  RooRealVar mll("mll","mll",mllmin,mllmax,"GeV/c^{2}");
307 +  RooRealVar id1("id1","id1",0,1,"GeV/c^{2}");
308 +  RooRealVar id2("id2","id2",0,1,"GeV/c^{2}");
309 +  RooRealVar jzb("jzb","jzb",-jzbmax,jzbmax,"GeV/c");
310 +  RooRealVar weight("weight","weight",0,1000,"");
311 +  RooArgSet observables(mll,jzb,id1,id2,weight);
312 +  
313 +  string title="CMS Data";
314 +  if(is_data!=1) title="CMS SIMULATION";
315 +  RooDataSet LAllData("LAllData",title.c_str(),completetree,observables,"","weight");
316 +  completetree->Write();
317 + //  delete completetree;
318 +  
319 +  EdgeFitter::eeSample = (RooDataSet*)LAllData.reduce("id1==id2");
320 +  EdgeFitter::mmSample = (RooDataSet*)LAllData.reduce("id1==id2");
321 +  EdgeFitter::emSample = (RooDataSet*)LAllData.reduce("id1!=id2");
322 +  EdgeFitter::AllData  = (RooDataSet*)LAllData.reduce("id1!=id2||id1==id2");
323 +  
324 +  eeSample->SetName("eeSample");
325 +  mmSample->SetName("mmSample");
326 +  emSample->SetName("emSample");
327 +  AllData->SetName("AllData");
328 +  
329 +  if(EdgeFitter::MarcoDebug) {
330 +    cout << "Number of events in data sample = " << AllData->numEntries() << endl;
331 +    cout << "Number of events in ee sample = " << eeSample->numEntries() << endl;
332 +    cout << "Number of events in mm sample = " << mmSample->numEntries() << endl;
333 +    cout << "Number of events in em sample = " << emSample->numEntries() << endl;
334 +  }
335 + }
336 +
337 + string EdgeFitter::RandomStorageFile() {
338 +  TRandom3 *r = new TRandom3(0);
339 +  int rho = (int)r->Uniform(1,10000000);
340 +  stringstream RandomFile;
341 +  RandomFile << PlottingSetup::cbafbasedir << "/exchange/TempEdgeFile_" << rho << ".root";
342 +  delete r;
343 +  return RandomFile.str();
344 + }
345 +
346 + Yield EdgeFitter::Get_Z_estimate(float jzb_cut, int icut) {
347 +  if(MarcoDebug) write_error(__FUNCTION__,"Returning random Z yield");
348 +  Yield a(123,45,67); return a;
349 +  return PlottingSetup::allresults.predictions[icut].Zbkg;
350 + }
351 +
352 + Yield EdgeFitter::Get_T_estimate(float jzb_cut, int icut) {
353 +  if(MarcoDebug) write_error(__FUNCTION__,"Returning random TTbar yield");
354 +  Yield a(1234,56,78); return a;
355 +  return PlottingSetup::allresults.predictions[icut].Flavorsym;
356 + }
357 +
358 + void EdgeFitter::DoFit(int is_data, float jzb_cut) {
359 +  RooRealVar mll("mll","mll",mllmin,mllmax,"GeV/c^{2}");
360 +  RooCategory sample("sample","sample") ;
361 +  sample.defineType("ee");
362 +  //sample.defineType("mm");
363 +  sample.defineType("em");
364 +  //RooDataSet combData("combData","combined data",mll,Index(sample),Import("ee",*eeSample),Import("mm",*mmSample),Import("em",*emSample));
365 +  RooDataSet combData("combData","combined data",mll,RooFit::Index(sample),RooFit::Import("ee",*eeSample),RooFit::Import("em",*emSample));
366 +  
367 +
368 +
369 +  //First we make a fit to opposite flavor
370 +  RooRealVar fttbarem("fttbarem", "fttbarem", 100, 0, 10000);
371 +  RooRealVar par1ttbarem("par1ttbarem", "par1ttbarem", 1.6, 0.01, 4.0);
372 +  RooRealVar par2ttbarem("par2ttbarem", "par2ttbarem", 1.0);
373 +  RooRealVar par3ttbarem("par3ttbarem", "par3ttbarem", 0.028, 0.001, 1.0);
374 +  RooRealVar par4ttbarem("par4ttbarem", "par4ttbarem", 2.0);
375 +  RooSUSYBkgPdf ttbarem("ttbarem","ttbarem", mll , par1ttbarem, par2ttbarem, par3ttbarem, par4ttbarem);
376 +  RooAddPdf model_em("model_em","model_em", ttbarem, fttbarem);
377 +  RooSimultaneous simPdfOF("simPdfOF","simultaneous pdf", sample) ;
378 +  simPdfOF.addPdf(model_em,"em");
379 +  RooFitResult *resultOF = simPdfOF.fitTo(combData, RooFit::Save());
380 +  resultOF->Print();
381 +
382 +  RooRealVar* resultOFpar1_ = (RooRealVar*) resultOF->floatParsFinal().find("par1ttbarem");
383 +  float resultOFpar1 = resultOFpar1_->getVal();
384 +  //RooRealVar* resultOFpar2_ = (RooRealVar*) resultOF->floatParsFinal().find("par2ttbarem");
385 +  //float resultOFpar2 = resultOFpar2_->getVal();
386 +  //cout << "caca2.txt" << endl;
387 +
388 +  RooRealVar* resultOFpar3_ = (RooRealVar*) resultOF->floatParsFinal().find("par3ttbarem");
389 +  float resultOFpar3 = resultOFpar3_->getVal();
390 +
391 +  //RooRealVar* resultOFpar4_ = (RooRealVar*) resultOF->floatParsFinal().find("par4ttbarem");
392 +  //float resultOFpar4 = resultOFpar4_->getVal();
393 +  //cout << "caca4.txt" << endl;
394 +
395 +
396 +  // Now same flavor  
397 +  RooRealVar fzee("fzee", "fzee", 5, 0, 100000);
398 +  RooRealVar meanzee("meanzee", "meanzee", 91.1876, 89, 95);
399 +  //RooRealVar sigmazee("sigmazee", "sigmazee", 0.5);
400 +  RooRealVar sigmazee("sigmazee", "sigmazee", 5, 0, 100);
401 +  RooRealVar widthzee("widthzee", "widthzee", 2.94);
402 +  
403 +  RooRealVar fttbaree("fttbaree", "fttbaree", 100, 0, 100000);
404 +  RooRealVar par1ttbaree("par1ttbaree", "par1ttbaree", resultOFpar1, 0, 100);
405 +  RooRealVar par2ttbaree("par2ttbaree", "par2ttbaree", 1.0);
406 +  RooRealVar par3ttbaree("par3ttbaree", "par3ttbaree", resultOFpar3, 0, 100);
407 +  RooRealVar par4ttbaree("par4ttbaree", "par4ttbaree", 2.0);
408 +
409 +  RooRealVar fsignalee("fsignalee", "fsignalee", 10, 0, 400);
410 +  RooRealVar par1signalee("par1signalee", "par1signalee", 45, 20, 100);
411 +  RooRealVar par2signalee("par2signalee", "par2signalee", 2, 1, 10);
412 +  RooRealVar par3signalee("par3signalee", "par3signalee", 45, 0, 200);
413 +
414 +  RooVoigtian zee("zee", "zee", mll, meanzee, widthzee, sigmazee);
415 +
416 +  
417 +  RooSUSYBkgPdf ttbaree("ttbaree","ttbaree", mll , par1ttbaree, par2ttbaree, par3ttbaree, par4ttbaree);
418 +  //RooSUSYTPdf signalee("signalee","signalee", mll , par1signalee, par2signalee, par3signalee);
419 +  RooSUSYTPdf signalee("signalee","signalee", mll , par1signalee, sigmazee, par3signalee);
420 +
421 +  //RooAddPdf model_ee("model_ee","model_ee", RooArgList(zee, ttbaree, signalee), RooArgList(fzee, fttbaree, fsignalee));
422 +  RooAddPdf model_ee("model_ee","model_ee", RooArgList(zee, ttbaree, signalee), RooArgList(fzee, fttbaree, fsignalee));
423 +  RooAddPdf model_emu("model_emu","model_emu", RooArgList(ttbaree), RooArgList(fttbaree));
424 +
425 +  
426 +  RooSimultaneous simPdf("simPdf","simultaneous pdf",sample) ;
427 +  simPdf.addPdf(model_ee,"ee") ;
428 +  simPdf.addPdf(model_emu,"em") ;
429 +
430 +  RooFitResult *result = simPdf.fitTo(combData, RooFit::Save());
431 +  result->Print();
432 +  
433 +  RooPlot* frame1 = mll.frame(RooFit::Bins(25),RooFit::Title("EE sample")) ;
434 +  combData.plotOn(frame1,RooFit::Cut("sample==sample::ee")) ;
435 +  simPdf.plotOn(frame1,RooFit::Slice(sample,"ee"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ;
436 +  simPdf.plotOn(frame1,RooFit::Slice(sample,"ee"),RooFit::Components("ttbaree"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ;
437 +  simPdf.plotOn(frame1,RooFit::Slice(sample,"ee"),RooFit::Components("zee"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kRed));
438 +  simPdf.plotOn(frame1,RooFit::Slice(sample,"ee"),RooFit::Components("signalee"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kGreen));
439 +
440 +  RooPlot* frame2 = mll.frame(RooFit::Bins(25),RooFit::Title("MM sample")) ;
441 +  combData.plotOn(frame2,RooFit::Cut("sample==sample::mm")) ;
442 +  simPdf.plotOn(frame2,RooFit::Slice(sample,"mm"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ;
443 +  simPdf.plotOn(frame2,RooFit::Slice(sample,"mm"),RooFit::Components("ttbarmm"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ;
444 +  simPdf.plotOn(frame2,RooFit::Slice(sample,"mm"),RooFit::Components("zmm"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kRed));
445 +  simPdf.plotOn(frame2,RooFit::Slice(sample,"mm"),RooFit::Components("signalmm"), RooFit::ProjWData(sample, combData), RooFit::LineStyle(kDashed), RooFit::LineColor(kGreen));
446 +
447 +  
448 +  cout << "Result   : " << endl;
449 +  cout << "f signal : " << fsignalee.getVal() << " +/- " << fsignalee.getError() << endl;
450 +  cout << "f ttbar  : " << fttbaree.getVal() << " +/- " << fttbaree.getError() << endl;
451 +  cout << "f tt em  : " << fttbarem.getVal() << " +/- " << fttbarem.getError() << endl;
452 +  cout << "f z ee   : " << fzee.getVal() << " +/- " << fzee.getError() << endl;
453 +  
454 +  // The same plot for the cointrol sample slice
455 +  RooPlot* frame3 = mll.frame(RooFit::Bins(25),RooFit::Title("EM sample")) ;
456 +  combData.plotOn(frame3,RooFit::Cut("sample==sample::em")) ;
457 +  simPdfOF.plotOn(frame3,RooFit::Slice(sample,"em"),RooFit::ProjWData(sample,combData), RooFit::LineColor(kBlack)) ;
458 +  simPdfOF.plotOn(frame3,RooFit::Slice(sample,"em"),RooFit::Components("ttbarem"),RooFit::ProjWData(sample,combData),RooFit::LineStyle(kDashed)) ;
459 +  
460 +  stringstream prefix;
461 +  if(is_data==data) prefix << "data_";
462 +  if(is_data==mc) prefix << "mc_";
463 +  if(is_data==mcwithsignal) prefix << "mcwithS_";
464 +  
465 +  prefix << "JZB_" << jzb_cut;
466 +  
467 + /*  cout << "fsignalee : " << fsignalee << endl;
468 +  cout << "fttbaree : " << fttbaree << endl;
469 +  cout << "fzee : " << fzee << endl;*/
470 +  
471 +  
472 +  TCanvas* c = new TCanvas("rf501_simultaneouspdf","rf403_simultaneouspdf") ;
473 +  c->cd() ;
474 +  gPad->SetLeftMargin(0.15);
475 +  frame1->GetYaxis()->SetTitleOffset(1.4);
476 +  frame1->Draw();
477 +  if(is_data==data) DrawPrelim();
478 +  else DrawPrelim(PlottingSetup::luminosity,true);
479 +  CompleteSave(c,"Edge/"+prefix.str()+"eemm");
480 +  delete c;
481 +  
482 +  TCanvas* d = new TCanvas("rf501_simultaneouspdf","rf403_simultaneouspdf") ;
483 +  d->cd() ;
484 +  gPad->SetLeftMargin(0.15);
485 +  frame2->GetYaxis()->SetTitleOffset(1.4);
486 +  frame2->Draw();
487 +  if(is_data==data) DrawPrelim();
488 +  else DrawPrelim(PlottingSetup::luminosity,true);
489 +  CompleteSave(d,"Edge/"+prefix.str()+"mm");
490 +  delete d;
491 +  //c->cd(2) ; gPad->SetLeftMargin(0.15) ; frame2->GetYaxis()->SetTitleOffset(1.4) ; frame2->Draw();
492 +  
493 +  TCanvas* e = new TCanvas("rf501_simultaneouspdfem","rf403_simultaneouspdfem") ;
494 +  e->cd();
495 +  gPad->SetLeftMargin(0.15);
496 +  frame3->GetYaxis()->SetTitleOffset(1.4);
497 +  frame3->Draw();
498 +  if(is_data==data) DrawPrelim();
499 +  else DrawPrelim(PlottingSetup::luminosity,true);
500 +  CompleteSave(e,"Edge/"+prefix.str()+"emu");
501 +  delete e;
502 +  
503 + /*  TCanvas* f = new TCanvas("rf501_simultaneouspdfem","rf403_simultaneouspdfem") ;
504 +  f->cd();
505 +  gPad->SetLeftMargin(0.15);
506 +  frame4->GetYaxis()->SetTitleOffset(1.4);
507 +  frame4->Draw();
508 +  if(is_data==data) DrawPrelim();
509 +  else DrawPrelim(PlottingSetup::luminosity,true);
510 +  CompleteSave(f,"Edge/"+prefix.str()+"eemm");
511 +  delete f;*/
512 +  
513 + }
514 +
515 + void EdgeFitter::DoEdgeFit(string mcjzb, string datajzb, float DataPeakError, float MCPeakError, float jzb_cut, int icut, int is_data, TCut cut, TTree *signalevents=0) {
516 +  
517 +  TCut _cut(cut&&PlottingSetup::basiccut&&PlottingSetup::passtrig);
518 +  
519 +  TFile *f = new TFile("workingfile.root","RECREATE");
520 +
521 +  EdgeFitter::InitializeVariables(PlottingSetup::iMllLow,PlottingSetup::iMllHigh,PlottingSetup::jzbHigh,_cut);
522 +  
523 +  EdgeFitter::PrepareDatasets(is_data);
524 +  
525 +  RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
526 +  RooMsgService::instance().setGlobalKillBelow(RooFit::FATAL);
527 +  EdgeFitter::DoFit(is_data, jzb_cut);
528 +  RooMsgService::instance().setGlobalKillBelow(msglevel);
529 +
530 +
531 +  f->Close();
532 +
533 + }
534 +
535 + void DoEdgeFit(string mcjzb, string datajzb, float DataPeakError, float MCPeakError, vector<float> jzb_cut, int is_data, TCut cut, TTree *signalevents=0) {
536 +  for(int icut=0;icut<jzb_cut.size();icut++) {
537 +    stringstream addcut;
538 +    if(is_data==1) addcut << "(" << datajzb << ">" << jzb_cut[icut] << ")";
539 +    if(is_data!=1) addcut << "(" << mcjzb << ">" << jzb_cut[icut] << ")";
540 +    TCut jcut(addcut.str().c_str());
541 +    
542 +    
543 +    EdgeFitter::DoEdgeFit(mcjzb, datajzb, DataPeakError, MCPeakError, jzb_cut[icut], icut, is_data, jcut&&cut, signalevents);
544 +    
545 +  }
546 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines