1 #if !defined(__CINT__) || defined(__MAKECINT__)
16 #include "TPaletteAxis.h"
20 #include "/home/shahoian/ALICE/mymacros/SaveCanvas.h"
24 const char kHStatName[]="hStat";
27 double kdPhiBgTailMin = 0.1; // lower limit of dphi tail to use for bg normalization
28 double kdPhiBgTailMax = 0.3; // upper limit of dphi tail to use for bg normalization
30 double kWDistBgTailMin = 5.; // lower limit of wgh.distance tail to use for bg normalization
31 double kWDistBgTailMax = 25.; // upper limit of wgh.distance tail to use for bg normalization
33 double kdPhiSgCut = 0.06; // cut in dphi-bent used to extract the signal, extracted from stat histo
34 double kWDistSgCut = 1.5; // cut in w.distance used to extract the signal, extracted from stat histo
36 enum { kNormShapeDist, // normalize bg tails usig weighted distance shape
37 kNormShapeDPhi, // normalize bg tails usig dPhi-bend shape
40 enum { kSclWghMean, // normalize bg tails to data using weighted mean of bin-by-bin ratios
41 kSclIntegral, // normalize bg tails to data using integral
44 // histograms to be used for bg nomalization for each of NormShapes used
45 const char* kNormShapeH[kNormShapes] = {
46 "EtaDist", // Weighted distance vs Eta
47 "EtaDPhiS" // Dphi-bent vs distance
50 const char* figDir = "fig161110";
51 TString useBgType = "Inj";
52 Int_t useShapeType = kNormShapeDist; // which distribution to use for bg normalization
53 Bool_t useMCLB = 0;//kFALSE; // use Comb MC Labels as a template for Bg.
54 Int_t useScaleType = kSclIntegral;//kSclWghMean; // which type of tails normalization to use
55 Double_t useEtaCut = 1.; // cut on eta
56 Double_t useZvMin = -5.; // cut on Z vertex
57 Double_t useZvMax = 5.; // cut on Z vertex
58 Int_t useBinGrEta = -1; // for bg fits group eta bins
59 Int_t useBinGrZv = -1; // for bg fits group Zv bins
61 enum {kBitNormPerEvent=BIT(14)};
62 // bins for saved parameters in the hStat histo
64 kEvTot, // events read
65 kEvProcData, // events with data mult.object (ESD or reco)
66 kEvProcInj, // events Injected
67 kEvProcRot, // events Rotated
68 kEvProcMix, // events Mixed
71 kDTht, // dtheta window
72 kNStd, // N.standard deviations to keep
73 kPhiShift, // bending shift
74 kThtS2, // is dtheta scaled by 1/sin^2
75 kPhiOvl, // overlap params
76 kZEtaOvl, // overlap params
77 kNoOvl, // flag that overlap are suppressed
79 kPhiRot, // rotation phi
80 kInjScl, // injection scaling
82 kZVMin, // min ZVertex to process
83 kZVMax, // max ZVertex to process
84 kTrcMin, // min mult to process
85 kTrcMax, // max mult to process
87 kOneUnit=49, // just 1 to track mergings
88 kNWorkers=50, // n workers
93 enum {kSigCorr,kMCPrim,kRawDtCut,kSignalEst,kSignalEstMC,kBgEst,k1MBeta,k1MBetaMC,kAlpha,kAlphaMC,kBgMC,kBgRescFc,kDataDist,kBgDist,kBgMCDist, kNHistos, kMCShift=20};
95 void CorrectSpectra(const char* flNameData, const char* flNameMC,const char* unique="");
96 void PrepareHistos(TList* lst, Bool_t isMC, TObjArray* outArray);
97 void ProcessHistos(TObjArray* outArray);
98 TH1* NormalizeBg(TH1* dataH, TH1* bgH, double &scl, double &scle);
99 TObject* FindObject(const char* nameH, const TList* lst, Bool_t normPerEvent=kTRUE);
100 TList* LoadList(const char* flName, const char* addPref, const char* nameL="clist");
101 void GetRatE(double x,double xe, double y,double ye, double &rat, double &rate);
102 Int_t CheckStat(const TList* lst,const char* dtType);
103 void Integrate(TH1* hist, double xmn,double xmx, double &val, double& err);
104 void CropHisto(TH1* histo, int b00, int b01, int b10=-1, int b11=-1);
105 void CropHisto(TH1* histo, double b00, double b01, double b10=-1, double b11=-1);
106 void GetRealMinMax(TH1* h, double &vmn, double &vmx);
107 const char* HName(const char* prefix,const char* htype);
109 void ProjDZE(THnSparseF* hrawd, THnSparseF* hgenb, THnSparseF* hmcComb, TObjArray* res, int bstep0=-1,int bstep1=-1);
114 void PlotAlphaBeta();
117 TList *listDt=0, *listMC=0;
121 TString uniqueName="";
123 void CorrectSpectra(const char* flNameData, const char* flNameMC, const char* uniqueNm)
126 uniqueName = uniqueNm;
127 listDt = LoadList(flNameData,"dt_");
128 listMC = LoadList(flNameMC,"mc_");
131 PrepareHistos(listMC, kTRUE, &resArr);
132 PrepareHistos(listDt, kFALSE, &resArr);
134 ProcessHistos(&resArr);
136 sprintf(outStr,"CutEta%.1f_Zv%.1f_%.1f_bg%s_Shape_%s_mcLB%d_cutSig%.1f_cutBg%.1f",useEtaCut,useZvMin,useZvMax,useBgType.Data(),
137 useShapeType==kNormShapeDist ? "wdst":"dphi",
139 useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
140 useShapeType==kNormShapeDist ? kWDistBgTailMin:kdPhiBgTailMin);
141 sprintf(outTitle,"%s, |#eta|<%.1f, %.1f<Z_{V}<%.1f, Bg.:%s, UseMCLB=%d, CutVar:%s, |sig|<%.2f, %.2f<|bg.nrm|<%.2f",
143 useEtaCut,useZvMin,useZvMax,useBgType.Data(),
145 useShapeType==kNormShapeDist ? "#Delta":"#Delta#varphi-#delta_{#varphi}",
146 useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
147 useShapeType==kNormShapeDist ? kWDistBgTailMin : kdPhiBgTailMin,
148 useShapeType==kNormShapeDist ? kWDistBgTailMax : kdPhiBgTailMax
153 //_____________________________________________________________________
154 void PrepareHistos(TList* lst, Bool_t isMC, TObjArray* outArray)
158 int shift = isMC ? kMCShift : 0;
161 if (useShapeType==kNormShapeDist) xxZvEta = "DistZvEta";
162 else xxZvEta = "DistZvDPhiS";
164 printf("PrepareBg : (%4s) of type %s from %s with shape %d\n",isMC?" MC ":"Data",useBgType.Data(),lst->GetName(),useShapeType);
165 if (!CheckStat(lst,useBgType.Data())) {printf("Bg of type %s is absent in list %s\n",useBgType.Data(),lst->GetName()); return;}
167 THnSparseF* hD = (THnSparseF*) FindObject(HName("Data",xxZvEta),lst);
168 THnSparseF* hB = (THnSparseF*) FindObject(HName(useBgType.Data(),xxZvEta),lst);
170 // special feature: use MC Labels bg as a shape instead of generated bg
171 if (useMCLB/* && !isMC*/) {
172 TString nm = hB->GetName(); nm += "_MCLB";
173 TString tit = hB->GetTitle(); tit += "_MCLB";
174 THnSparseF* hBMCLB = (THnSparseF*) FindObject(HName("Comb",xxZvEta),listMC)->Clone(nm.Data());
175 hBMCLB->SetTitle(tit.Data());
178 THnSparseF* hBmc = 0;
179 if (isMC) hBmc = (THnSparseF*) FindObject(HName("Comb",xxZvEta),lst);
181 ProjDZE(hD,hB,hBmc, outArray, useBinGrEta, useBinGrZv);
185 // prepare MC primary signal histo
186 TH2F* mcPrim = (TH2F*)FindObject( "zvEtaPrimMC", lst );
187 mcPrim = (TH2F*) mcPrim->Clone("mcTrueSignal");
188 CropHisto(mcPrim,-useEtaCut,useEtaCut,useZvMin,useZvMax);
189 outArray->AddAtAndExpand(mcPrim, kMCPrim + shift);
193 //_____________________________________________________________________
194 void ProcessHistos(TObjArray* outArray)
197 // build alpha matrix
198 TH2* halp = (TH2*)outArray->At(kMCShift + kMCPrim);
199 halp = (TH2*) halp->Clone("Alpha");
200 halp->SetTitle("#alpha");
201 halp->Divide( (TH2*)outArray->At(kMCShift + k1MBeta) );
202 halp->Divide( (TH2*)outArray->At(kMCShift + kRawDtCut) );
203 halp->SetMinimum(1.5);
204 halp->SetMaximum(4.);
205 outArray->AddAtAndExpand(halp, kAlpha);
207 // build alpha matrix with MC labels bg
208 TH2* halpMC = (TH2*)outArray->At(kMCShift + kMCPrim);
209 halpMC = (TH2*) halpMC->Clone("AlphaMC");
210 halpMC->SetTitle("#alpha MC labels");
211 halpMC->Divide( (TH2*)outArray->At(kMCShift + k1MBetaMC) );
212 halpMC->Divide( (TH2*)outArray->At(kMCShift + kRawDtCut) );
213 halpMC->SetMinimum(1.5);
214 halpMC->SetMaximum(4.);
215 outArray->AddAtAndExpand(halpMC, kAlphaMC);
217 // build corrected signal
218 TH2* hsigCorr = (TH2*)outArray->At(kSignalEst);
219 hsigCorr = (TH2*) hsigCorr->Clone("SignalEstCorr");
220 hsigCorr->SetTitle("Corrected Signal");
221 hsigCorr->Multiply( halp );
222 outArray->AddAtAndExpand(hsigCorr, kSigCorr);
244 TObjArray *res = &resArr;
247 double plEta = useEtaCut*1.1;
248 gStyle->SetOptFit(0);
249 gStyle->SetOptStat(0);
250 gStyle->SetOptTitle(0);
251 double mn = 1e6,mx = -1e6;
252 canvFin = new TCanvas("canvFin", "canvFin",0,50,700,550);
253 canvFin->SetLeftMargin(0.15);
254 // canvFin->ToggleEventStatus();
257 TH1* hsigCorr = ((TH2F*)res->At(kSigCorr))->ProjectionX("DataCorrSignal");
258 SetHStyle(hsigCorr,kRed,20,1.0);
259 hsigCorr->GetXaxis()->SetRangeUser(-plEta+kEps,plEta-kEps);
260 hsigCorr->Scale(1./hsigCorr->GetBinWidth(1));
262 mx = TMath::Max(mx, hsigCorr->GetMaximum());
263 mn = TMath::Min(mn, hsigCorr->GetMinimum());
264 TF1* pl0 = new TF1("pl0","pol0");
265 pl0->SetParameter(0,hsigCorr->GetMinimum());
266 hsigCorr->Fit(pl0,"q0","",-0.5,.5);
267 double fval = pl0->GetParameter(0);
268 double ferr = pl0->GetParError(0);
270 sprintf(ftres,"dN/d#eta_{|#eta|<0.5} = %d #pm %d",int(fval),int(ferr));
271 printf("dN/d#eta_{|#eta|<0.5} = %.2f %.2f\n",fval,ferr);
272 TLatex *txfit = new TLatex(-0.2,hsigCorr->GetMinimum()*0.9, ftres);
273 txfit->SetTextSize(0.04);
277 TH1* hraw = ((TH2F*)res->At(kRawDtCut))->ProjectionX("DataRaw");
278 SetHStyle(hraw,kRed,21,1.0);
279 hraw->GetXaxis()->SetRangeUser(-plEta,plEta);
280 hraw->Scale(1./hraw->GetBinWidth(1));
282 mn = TMath::Min(mn, hraw->GetMinimum());
283 mx = TMath::Max(mx, hraw->GetMaximum());
286 TH1* hraws = ((TH2F*)res->At(kSignalEst))->ProjectionX("DataRawSub");
287 SetHStyle(hraws,kRed,23,1.0);
288 hraws->GetXaxis()->SetRangeUser(-plEta,plEta);
289 hraws->Scale(1./hraw->GetBinWidth(1));
291 mn = TMath::Min(mn, hraw->GetMinimum());
292 mx = TMath::Max(mx, hraw->GetMaximum());
295 TH1* hbg = ((TH2F*)res->At(kBgEst))->ProjectionX("BgEst");
296 SetHStyle(hbg,kMagenta,22,1.0);
297 hbg->GetXaxis()->SetRangeUser(-plEta,plEta);
298 hbg->Scale(1./hbg->GetBinWidth(1));
300 mn = TMath::Min(mn, hbg->GetMinimum());
301 mx = TMath::Max(mx, hbg->GetMaximum());
303 // mc part ----------------------------
305 TH1* hrawMC = ((TH2F*)res->At(kRawDtCut+kMCShift))->ProjectionX("DataRawMC");
306 SetHStyle(hrawMC,kBlue,24,1.0);
307 hrawMC->GetXaxis()->SetRangeUser(-plEta,plEta);
308 hrawMC->Scale(1./hrawMC->GetBinWidth(1));
309 hrawMC->Draw("same");
310 mn = TMath::Min(mn, hrawMC->GetMinimum());
311 mx = TMath::Max(mx, hrawMC->GetMaximum());
314 TH1* hrawsMC = ((TH2F*)res->At(kSignalEst+kMCShift))->ProjectionX("DataRawSubMC");
315 SetHStyle(hrawsMC,kBlue,26,1.0);
316 hrawsMC->GetXaxis()->SetRangeUser(-plEta,plEta);
317 hrawsMC->Scale(1./hrawMC->GetBinWidth(1));
318 hrawsMC->Draw("same");
319 mn = TMath::Min(mn, hrawMC->GetMinimum());
320 mx = TMath::Max(mx, hrawMC->GetMaximum());
322 // raw data bgMClabels sub
323 TH1* hrawsMCLB = ((TH2F*)res->At(kSignalEstMC+kMCShift))->ProjectionX("DataRawSubMCLB");
324 SetHStyle(hrawsMCLB,kGreen+2,30,1.0);
325 hrawsMCLB->GetXaxis()->SetRangeUser(-plEta,plEta);
326 hrawsMCLB->Scale(1./hrawsMCLB->GetBinWidth(1));
327 hrawsMCLB->Draw("same");
328 mn = TMath::Min(mn, hrawsMCLB->GetMinimum());
329 mx = TMath::Max(mx, hrawsMCLB->GetMaximum());
332 TH1* hbgMCEst = ((TH2F*)res->At(kBgEst+kMCShift))->ProjectionX("BgEstMC");
333 SetHStyle(hbgMCEst,kBlue,26,1.0);
334 hbgMCEst->GetXaxis()->SetRangeUser(-plEta,plEta);
335 hbgMCEst->Scale(1./hbgMCEst->GetBinWidth(1));
336 hbgMCEst->Draw("same");
337 mn = TMath::Min(mn, hbgMCEst->GetMinimum());
338 mx = TMath::Max(mx, hbgMCEst->GetMaximum());
341 TH1* hbgMC = ((TH2F*)res->At(kBgMC+kMCShift))->ProjectionX("BgMC");
342 SetHStyle(hbgMC,kGreen+2,25,1.0);
343 hbgMC->GetXaxis()->SetRangeUser(-plEta,plEta);
344 hbgMC->Scale(1./hbgMC->GetBinWidth(1));
346 mn = TMath::Min(mn, hbgMC->GetMinimum());
347 mx = TMath::Max(mx, hbgMC->GetMaximum());
350 hsigCorr->SetMinimum(mn);
351 hsigCorr->SetMaximum(mx + 0.4*(mx-mn));
354 TLegend *legDnDeta = new TLegend(0.15,0.75, 0.45,0.95);
355 legDnDeta->SetFillColor(kWhite);
356 legDnDeta->SetHeader("Data");
357 legDnDeta->AddEntry(hsigCorr,"Corrected","pl");
358 legDnDeta->AddEntry(hraw, "Reconstructed","pl");
359 sprintf(buff,"Reconstructed - Bckg.%s.",useBgType.Data());
360 legDnDeta->AddEntry(hraws, buff,"pl");
361 sprintf(buff,"Background %s.",useBgType.Data());
362 legDnDeta->AddEntry(hbg, buff,"pl");
365 TLegend *legDnDetaMC = new TLegend(0.60,0.72, 0.95,0.95);
366 legDnDetaMC->SetFillColor(kWhite);
367 legDnDetaMC->SetHeader("MC");
368 legDnDetaMC->AddEntry(hrawMC, "Reconstructed","pl");
369 sprintf(buff,"Reconstructed - Bckg.%s.",useBgType.Data());
370 legDnDetaMC->AddEntry(hrawsMC, buff,"pl");
371 sprintf(buff,"Reconstructed - Bckg.%s.","MC.Labels");
372 legDnDetaMC->AddEntry(hrawsMCLB, buff,"pl");
373 sprintf(buff,"Background %s.",useBgType.Data());
374 legDnDetaMC->AddEntry(hbgMCEst, buff,"pl");
375 sprintf(buff,"Background %s.","MC Labels");
376 legDnDetaMC->AddEntry(hbgMC, buff,"pl");
383 AddLabel(outTitle,0.1,0.97, kBlack,0.025);
384 sprintf(buff,"%s/%sdNdEta_%s",figDir,uniqueName.Data(),outStr);
385 SaveCanvas(canvFin,buff,"cg");
392 gStyle->SetOptFit(0);
393 gStyle->SetOptStat(0);
394 gStyle->SetOptTitle(0);
395 TObjArray* res = &resArr;
396 //------------------------------------------------------
397 canvBet = new TCanvas("canvBet","canvBet",10,10,1000,400);
398 canvBet->Divide(3,1,0.01,0.06);
400 TH1* dtBet = (TH1*)res->At(k1MBeta);
401 TH1* mcBet = (TH1*)res->At(k1MBeta+kMCShift);
402 TH1* mcBetLB = (TH1*)res->At(k1MBetaMC+kMCShift);
403 double mn,mx,mnt,mxt;
404 GetRealMinMax(dtBet,mn,mx);
405 GetRealMinMax(mcBet,mnt,mxt);
406 if (mnt<mn) mn = mnt;
407 if (mxt>mx) mx = mxt;
408 GetRealMinMax(mcBetLB,mnt,mxt);
409 if (mnt<mn) mn = mnt;
410 if (mxt>mx) mx = mxt;
412 dtBet->SetMinimum(mn - 0.05*(mx-mn));
413 dtBet->SetMaximum(mx + 0.05*(mx-mn));
414 mcBet->SetMinimum(mn - 0.05*(mx-mn));
415 mcBet->SetMaximum(mx + 0.05*(mx-mn));
416 mcBetLB->SetMinimum(mn - 0.05*(mx-mn));
417 mcBetLB->SetMaximum(mx + 0.05*(mx-mn));
420 gPad->SetRightMargin(0.15);
422 AddLabel("#beta Data",0.2,0.95,kBlack,0.05);
424 dtBet->GetYaxis()->SetTitleOffset(1.4);
425 TPaletteAxis *p = (TPaletteAxis*)dtBet->FindObject("palette");
426 if (p) p->SetX1NDC(0.85);
428 gPad->SetRightMargin(0.15);
430 AddLabel("#beta MC (bckg.estimated)",0.2,0.95,kBlack,0.05);
432 mcBet->GetYaxis()->SetTitleOffset(1.4);
433 p = (TPaletteAxis*)mcBet->FindObject("palette");
434 if (p) p->SetX1NDC(0.85);
436 gPad->SetRightMargin(0.15);
437 mcBetLB->Draw("colz");
438 AddLabel("#beta MC (bckg.from MC labels)",0.2,0.95,kBlack,0.05);
440 mcBetLB->GetYaxis()->SetTitleOffset(1.4);
441 p = (TPaletteAxis*)mcBetLB->FindObject("palette");
442 if (p) p->SetX1NDC(0.85);
445 AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
447 sprintf(buff,"%s/%sBeta_%s",figDir,uniqueName.Data(),outStr);
448 SaveCanvas(canvBet,buff,"cg");
450 //------------------------------------------------------
451 canvAlp = new TCanvas("canvAlp","canvAlp",10,10,900,400);
452 canvAlp->Divide(2,1,0.01,0.06);
454 TH1* dtAlp = (TH1*)res->At(kAlpha);
455 TH1* mcAlp = (TH1*)res->At(kAlphaMC);
456 GetRealMinMax(dtAlp,mn,mx);
457 GetRealMinMax(mcAlp,mnt,mxt);
458 if (mnt<mn) mn = mnt;
459 if (mxt>mx) mx = mxt;
460 dtAlp->SetMinimum(mn - 0.05*(mx-mn));
461 dtAlp->SetMaximum(mx + 0.05*(mx-mn));
462 mcAlp->SetMinimum(mn - 0.05*(mx-mn));
463 mcAlp->SetMaximum(mx + 0.05*(mx-mn));
466 gPad->SetRightMargin(0.15);
468 AddLabel("#alpha (bckg.estimated)",0.2,0.95,kBlack,0.05);
470 dtAlp->GetYaxis()->SetTitleOffset(1.4);
471 TPaletteAxis *pa = (TPaletteAxis*)dtBet->FindObject("palette");
472 if (pa) pa->SetX1NDC(0.85);
474 gPad->SetRightMargin(0.15);
476 AddLabel("#alpha (bckg.from MC labels)",0.2,0.95,kBlack,0.05);
478 mcAlp->GetYaxis()->SetTitleOffset(1.4);
479 pa = (TPaletteAxis*)mcBet->FindObject("palette");
480 if (pa) pa->SetX1NDC(0.85);
483 AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
485 sprintf(buff,"%s/%sAlpha_%s",figDir,uniqueName.Data(),outStr);
486 SaveCanvas(canvAlp,buff,"cg");
493 gStyle->SetOptFit(0);
494 gStyle->SetOptStat(0);
495 gStyle->SetOptTitle(0);
496 //------------------------------------------------------
497 TH2F* hSpecPrim = (TH2F*)FindObject( "pdgPrim", listMC,kFALSE);
498 TH2F* hSpecSec = (TH2F*)FindObject( "pdgSec", listMC,kFALSE);
499 TH2F* hSpecPrimP = (TH2F*)FindObject( "pdgPrimPar", listMC,kFALSE);
500 TH2F* hSpecSecP = (TH2F*)FindObject( "pdgSecPar", listMC,kFALSE);
501 int nbd = hSpecPrim->GetXaxis()->GetNbins();
503 TH1* hSpecPrimAll = hSpecPrim->ProjectionX("specPrimAll",1,nbd+1,"e");
504 hSpecPrimAll->Scale(100./hSpecPrimAll->Integral());
505 hSpecPrimAll->GetYaxis()->SetTitle("Fraction,%");
506 hSpecPrimAll->GetXaxis()->SetLabelSize(0.06);
507 hSpecPrimAll->GetXaxis()->LabelsOption("v");
509 TH1* hSpecSecAll = hSpecSec->ProjectionX("specSecAll",1,nbd+1,"e");
510 hSpecSecAll->Scale(100./hSpecSecAll->Integral());
511 hSpecSecAll->GetYaxis()->SetTitle("Fraction,%");
512 hSpecSecAll->GetXaxis()->SetLabelSize(0.05);
514 TH1* hSpecPrimPAll = hSpecPrimP->ProjectionX("specPrimPAll",1,nbd+1,"e");
515 hSpecPrimPAll->Scale(100./hSpecPrimPAll->Integral());
516 hSpecPrimPAll->GetYaxis()->SetTitle("Fraction,%");
517 hSpecPrimPAll->GetXaxis()->SetLabelSize(0.06);
518 hSpecPrimPAll->GetXaxis()->LabelsOption("v");
521 TH1* hSpecSecPAll = hSpecSecP->ProjectionX("specSecPAll",1,nbd+1,"e");
522 hSpecSecPAll->Scale(100./hSpecSecPAll->Integral());
523 hSpecSecPAll->GetYaxis()->SetTitle("Fraction,%");
524 hSpecSecPAll->GetXaxis()->SetLabelSize(0.05);
526 int binCut = hSpecPrim->GetXaxis()->FindBin(kWDistSgCut-kEps);
527 TH1* hSpecPrimSel = hSpecPrim->ProjectionX("specPrimSel",1,binCut,"e");
528 hSpecPrimSel->Scale(100./hSpecPrimSel->Integral());
529 hSpecPrimSel->GetYaxis()->SetTitle("Fraction,%");
530 hSpecPrimSel->GetXaxis()->SetLabelSize(0.05);
532 TH1* hSpecSecSel = hSpecSec->ProjectionX("specSecSel",1,binCut,"e");
533 hSpecSecSel->Scale(100./hSpecSecSel->Integral());
534 hSpecSecSel->GetYaxis()->SetTitle("Fraction,%");
535 hSpecSecSel->GetXaxis()->SetLabelSize(0.05);
537 TH1* hSpecPrimPSel = hSpecPrimP->ProjectionX("specPrimPSel",1,binCut,"e");
538 hSpecPrimPSel->Scale(100./hSpecPrimPSel->Integral());
539 hSpecPrimPSel->GetYaxis()->SetTitle("Fraction,%");
540 hSpecPrimPSel->GetXaxis()->SetLabelSize(0.05);
542 TH1* hSpecSecPSel = hSpecSecP->ProjectionX("specSecPSel",1,binCut,"e");
543 hSpecSecPSel->Scale(100./hSpecSecPSel->Integral());
544 hSpecSecPSel->GetYaxis()->SetTitle("Fraction,%");
545 hSpecSecPSel->GetXaxis()->SetLabelSize(0.05);
548 canvSpec = new TCanvas("canvSpec","canvSpec",10,10,1100,800);
549 canvSpec->Divide(1,2,0.01,0.01);
551 hSpecPrimAll->Draw();
552 SetHStyle(hSpecPrimAll,kBlue,25,1.1);
553 hSpecPrimSel->Draw("same");
554 SetHStyle(hSpecPrimSel,kRed,20,1);
556 hSpecSecAll->Draw("same");
557 SetHStyle(hSpecSecAll,kGreen,32,1.1);
558 hSpecSecSel->Draw("same");
559 SetHStyle(hSpecSecSel,kBlack,22,1);
561 TLegend *legPart = new TLegend(0.8,0.72, 0.999,0.999);
562 legPart->SetFillColor(kWhite);
563 legPart->SetHeader("Tracklet PDG");
565 legPart->AddEntry(hSpecPrimAll, "Prim., before #Delta cut","pl");
566 legPart->AddEntry(hSpecPrimSel, "Prim., after #Delta cut","pl");
567 legPart->AddEntry(hSpecSecAll, "Sec., before #Delta cut","pl");
568 legPart->AddEntry(hSpecSecSel, "Sec., after #Delta cut","pl");
576 hSpecPrimPAll->Draw();
577 SetHStyle(hSpecPrimPAll,kBlue,25,1.1);
578 hSpecPrimPSel->Draw("same");
579 SetHStyle(hSpecPrimPSel,kRed,20,1);
581 hSpecSecPAll->Draw("same");
582 SetHStyle(hSpecSecPAll,kGreen,32,1.1);
583 hSpecSecPSel->Draw("same");
584 SetHStyle(hSpecSecPSel,kBlack,22,1);
586 TLegend *legPartP = new TLegend(0.8,0.72, 0.999,0.999);
587 legPartP->SetFillColor(kWhite);
588 legPartP->SetHeader("Tracklet Parents PDG");
590 legPartP->AddEntry(hSpecPrimPAll, "Prim., before #Delta cut","pl");
591 legPartP->AddEntry(hSpecPrimPSel, "Prim., after #Delta cut","pl");
592 legPartP->AddEntry(hSpecSecPAll, "Sec., before #Delta cut","pl");
593 legPartP->AddEntry(hSpecSecPSel, "Sec., after #Delta cut","pl");
601 AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
604 sprintf(buff,"%s/%sSpecies_%s",figDir,uniqueName.Data(),outStr);
605 SaveCanvas(canvSpec,buff,"cg");
610 TObjArray* res = &resArr;
612 canvDst = new TCanvas("canvDst","canvDst",10,10,700,500);
613 TH1* mcdst = (TH1*)res->At(kDataDist+kMCShift);
614 TH1* mcdstbg = (TH1*)res->At(kBgDist+kMCShift);
615 TH1* mcdstbgLB = (TH1*)res->At(kBgMCDist+kMCShift);
616 TH1* dtdst = (TH1*)res->At(kDataDist);
617 TH1* dtdstbg = (TH1*)res->At(kBgDist);
619 TH2* mcDstZN = (TH2*)FindObject(useShapeType==kNormShapeDist ? "TrData_ZvDist":"TrData_ZvDPhiS", listMC );
620 TH2* mcDstZSec = (TH2*)FindObject(useShapeType==kNormShapeDist ? "TrSec_ZvDist":"TrSec_ZvDPhiS", listMC );
621 TH2* mcDstZCombU = (TH2*)FindObject(useShapeType==kNormShapeDist ? "TrCombU_ZvDist":"TrCombU_ZvDPhiS", listMC );
622 TH2* mcDstZCombC = (TH2*)FindObject(useShapeType==kNormShapeDist ? "TrComb_ZvDist":"TrComb_ZvDPhiS", listMC );
624 mcDstZN->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
625 mcDstZSec->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
626 mcDstZCombU->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
627 mcDstZCombC->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
629 TH1* mcDstN = mcDstZN->ProjectionY("mcDstN");
630 TH1* mcDstSec = mcDstZSec->ProjectionY("mcDstSec");
631 TH1* mcDstCombU = mcDstZCombU->ProjectionY("mcDstCombU");
632 TH1* mcDstCombC = mcDstZCombC->ProjectionY("mcDstCombC");
635 mcDstN = NormalizeBg(mcdst,mcDstN,scl,sclE);
636 mcDstSec->Scale(scl);
637 mcDstCombU->Scale(scl);
638 mcDstCombC->Scale(scl);
639 mcDstCombC->Add(mcDstCombU,-1);
643 dtdst->GetXaxis()->SetLabelSize(0.03);
644 dtdst->GetXaxis()->SetTitleSize(0.03);
645 dtdst->GetXaxis()->SetTitleOffset(2);
646 dtdstbg->Draw("same");
649 mcDstSec->Draw("same");
650 mcdstbgLB->Draw("same");
651 mcdstbg->Draw("same");
652 mcDstCombC->Draw("same");
655 SetHStyle(mcdst,kBlue, 25,0.7);
656 SetHStyle(mcdstbgLB,kGreen, 7/*32*/,0.5);
657 SetHStyle(mcdstbg,kCyan, 7/*26*/,0.5);
658 SetHStyle(mcDstCombC,kGreen+2, 21,0.7);
659 SetHStyle(mcDstSec,kBlue+2, 22,0.7);
661 SetHStyle(dtdst,kRed, 20,0.7);
662 SetHStyle(dtdstbg,kBlue, 34,0.7);
664 double vmcTot,vmcTotE;
665 double vmcSec,vmcSecE, ratSec,ratSecE;
666 double vmcCmbEst,vmcCmbEstE, ratCmbEst,ratCmbEstE;
667 double vmcCmb,vmcCmbE, ratCmb,ratCmbE;
668 double vmcCmbC,vmcCmbCE, ratCmbC,ratCmbCE;
669 double cutSgMin,cutSgMax;
670 double cutBgMin,cutBgMax;
671 if (useShapeType==kNormShapeDist) {
673 cutSgMax = kWDistSgCut;
674 cutBgMin = kWDistBgTailMin;
675 cutBgMax = kWDistBgTailMax;
679 cutSgMax = kdPhiSgCut;
680 cutBgMin = kdPhiBgTailMin;
681 cutBgMax = kdPhiBgTailMax;
683 Integrate(mcdst, cutSgMin,cutSgMax, vmcTot,vmcTotE);
684 Integrate(mcDstSec, cutSgMin,cutSgMax, vmcSec,vmcSecE);
685 GetRatE(vmcSec,vmcSecE, vmcTot,vmcTotE, ratSec,ratSecE);
687 Integrate(mcdstbgLB, cutSgMin,cutSgMax, vmcCmb,vmcCmbE);
688 GetRatE(vmcCmb,vmcCmbE, vmcTot,vmcTotE, ratCmb,ratCmbE);
690 Integrate(mcdstbg, cutSgMin,cutSgMax, vmcCmbEst,vmcCmbEstE);
691 GetRatE(vmcCmbEst,vmcCmbEstE, vmcTot,vmcTotE, ratCmbEst,ratCmbEstE);
693 Integrate(mcDstCombC, cutSgMin,cutSgMax, vmcCmbC,vmcCmbCE);
694 GetRatE(vmcCmbC,vmcCmbCE, vmcTot,vmcTotE, ratCmbC,ratCmbCE);
696 double vdtTot,vdtTotE;
697 double vdtBg,vdtBgE, ratdtBg,ratdtBgE;
699 Integrate(dtdst, cutSgMin,cutSgMax, vdtTot,vdtTotE);
700 Integrate(dtdstbg, cutSgMin,cutSgMax, vdtBg,vdtBgE);
701 GetRatE( vdtBg,vdtBgE, vdtTot,vdtTotE, ratdtBg,ratdtBgE);
704 double dmn = mcdst->GetMinimum();
705 double dmx = mcdst->GetMaximum();
706 TLine *ln = new TLine(cutSgMax, dmn, cutSgMax, dmx);
707 ln->SetLineColor(kBlack);
709 TLine *lnc = new TLine(cutBgMin, dmn, cutBgMin, dmx);
710 lnc->SetLineColor(kRed);
712 if (useShapeType==kNormShapeDPhi) {
713 ln = new TLine(-cutSgMax, dmn, -cutSgMax, dmx);
714 ln->SetLineColor(kBlack);
717 lnc = new TLine(-cutBgMin, dmn, -cutBgMin, dmx);
718 lnc->SetLineColor(kRed);
722 TLegend *legDstMC1 = new TLegend(0.60,0.72, 0.95,0.95);
723 legDstMC1->SetFillColor(kWhite);
726 legDstMC1->AddEntry(dtdst, "Data raw","pl");
727 sprintf(buff,"Data Comb. %s. : %.1f%%",useBgType.Data(),ratdtBg*100);
728 legDstMC1->AddEntry(dtdstbg, buff,"pl");
732 legDstMC1->AddEntry(mcdst, "MC raw","pl");
733 sprintf(buff,"MC Comb. %s. : %.1f%%",useBgType.Data(),ratCmbEst*100);
734 legDstMC1->AddEntry(mcdstbg, buff,"pl");
736 sprintf(buff,"MC Comb. %s. : %.1f%%","MC Lbl.",ratCmb*100);
737 legDstMC1->AddEntry(mcdstbgLB, buff,"pl");
739 sprintf(buff,"MC Comb.Uncorr %s. : %.1f%%","MC Lbl.",ratCmbC*100);
740 legDstMC1->AddEntry(mcDstCombC, buff,"pl");
742 sprintf(buff,"MC Sec. : %.1f%%",ratSec*100);
743 legDstMC1->AddEntry(mcDstSec, buff,"pl");
747 if (useShapeType==kNormShapeDist) gPad->SetLogx();
753 AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
755 sprintf(buff,"%s/%sDst_%s",figDir,uniqueName.Data(),outStr);
756 SaveCanvas(canvDst,buff,"cg");
761 //______________________________________________________________________
762 void CropHisto(TH1* histo, int bx0, int bx1, int by0, int by1)
764 // fill 0 to all bins outside defined range
765 TAxis *xax = histo->GetXaxis();
766 int nbx = xax->GetNbins();
767 double vmn=1e16,vmx=-1e16;
768 if (histo->InheritsFrom(TH2::Class())) {
769 TAxis *yax = histo->GetYaxis();
770 int nby = yax->GetNbins();
771 for (int ix=nbx+2;ix--;) {
772 for (int iy=nby+2;iy--;) {
773 if ((ix<bx0||ix>bx1)||(iy<by0||iy>by1)) {
774 histo->SetBinContent(ix,iy,0);
775 histo->SetBinError(ix,iy,0);
778 double vl = histo->GetBinContent(ix,iy);
779 if (vl<vmn) vmn = vl;
780 if (vl>vmx) vmx = vl;
786 for (int ix=nbx+2;ix--;) {
787 if ((ix<bx0||ix>bx1)) {
788 histo->SetBinContent(ix,0);
789 histo->SetBinError(ix,0);
792 double vl = histo->GetBinContent(ix);
793 if (vl<vmn) vmn = vl;
794 if (vl>vmx) vmx = vl;
803 histo->SetMaximum(vmx);
804 histo->SetMinimum(vmn);
807 //______________________________________________________________________
808 void CropHisto(TH1* histo, double vx0, double vx1, double vy0, double vy1)
810 // fill 0 to all bins outside defined range
811 TAxis *xax = histo->GetXaxis();
812 int bx0,bx1,by0=-1,by1=-1;
813 bx0 = xax->FindBin(vx0+kEps);
814 bx1 = xax->FindBin(vx1-kEps);
815 if (histo->InheritsFrom(TH2::Class())) {
816 TAxis *yax = histo->GetYaxis();
817 by0 = yax->FindBin(vy0+kEps);
818 by1 = yax->FindBin(vy1-kEps);
820 CropHisto(histo,bx0,bx1,by0,by1);
823 //______________________________________________________________________
824 TH1* NormalizeBg(TH1* dataH, TH1* bgH, double &scl, double &sclE)
826 // match generated bg and data tails, calculate normalization, return normalized bg copy
828 TAxis* xax = dataH->GetXaxis();
829 int nbtot = xax->GetNbins();
830 int bgBins[2][2] = {{0}}; // limiting bins for tails integration
831 Int_t ntails; // 0 for dphi plot, 1 for weighted dist plot
832 if (useShapeType == kNormShapeDist) { // only positive tail
833 bgBins[0][0] = xax->FindBin(kWDistBgTailMin+kEps); // positive tail min bin
834 bgBins[0][1] = xax->FindBin(kWDistBgTailMax-kEps); // positive tail max bin
837 else if (useShapeType == kNormShapeDPhi) { // both tails
838 bgBins[0][0] = xax->FindBin( kdPhiBgTailMin+kEps); // positive tail min bin
839 bgBins[0][1] = xax->FindBin( kdPhiBgTailMax-kEps); // positive tail max bin
840 bgBins[1][0] = xax->FindBin(-kdPhiBgTailMax+kEps); // negative tail min bin
841 bgBins[1][1] = xax->FindBin(-kdPhiBgTailMin-kEps); // positive tail max bin
844 else {printf("NormalizeBg: unknown shape type %d\n",useShapeType);exit(1);}
845 printf("NormalizeBg: bins for tails: right: %d:%d / left: %d:%d\n",bgBins[0][0],bgBins[0][1],bgBins[1][0],bgBins[1][1]);
847 double meanR=0,meanRE=0,meanRE2=0;
848 double meanD=0,meanDE2=0;
849 double meanB=0,meanBE2=0;
850 double meanRI=0,meanRIE=0;
851 for (int itp=0;itp<=ntails;itp++) {
852 for (int ib=bgBins[itp][0];ib<=bgBins[itp][1];ib++) {
853 if (ib<1||ib>nbtot) continue;
854 double vD = dataH->GetBinContent(ib);
855 double vB = bgH->GetBinContent(ib);
856 double eD = dataH->GetBinError(ib);
857 double eB = bgH->GetBinError(ib);
858 meanD += vD; meanDE2 += eD*eD;
859 meanB += vB; meanBE2 += eB*eB;
860 if (vD<=0 || vB<=0 || eD<=0 || eB<=0) continue;
862 double ratE2 = rat*rat*(eD*eD/vD/vD + eB*eB/vB/vB);
863 meanR += rat/ratE2; meanRE2 += 1.0/ratE2;
869 meanRE2 = 1./meanRE2;
870 meanRE = TMath::Sqrt(meanRE2);
872 if (meanDE2>0 && meanBE2>0) {
873 meanRI = meanD/meanB;
874 meanRIE = meanRI*TMath::Sqrt(meanDE2/meanD/meanD + meanBE2/meanB/meanB);
876 printf("NormalizeBg: Tails scaling %s wrt %s: Wgh.Mean:%.4f(%.4f) / Integral:%.4f(%.4f)\n",
877 bgH->GetName(),dataH->GetName(), meanR,meanRE, meanRI,meanRIE);
878 printf("NormalizeBg: Select scaling type %s\n",useScaleType==kSclWghMean ? "Wgh.Mean":"Integral");
880 scl = useScaleType==kSclWghMean ? meanR : meanRI;
881 sclE = useScaleType==kSclWghMean ? meanRE : meanRIE;
885 sprintf(buff,"%s_bgNorm",bgH->GetName());
886 bgH = (TH1*)bgH->Clone(buff);
887 sprintf(buff,"%s bgNorm%d %.4f+-%.4f",bgH->GetName(),useScaleType,scl,sclE);
888 TH1* dumH = (TH1*)bgH->Clone("dummySCL$"); dumH->Reset();
889 for (int i=1;i<=nbtot;i++) {
890 dumH->SetBinContent(i,scl);
891 dumH->SetBinError(i,sclE);
898 //______________________________________________________________________
899 TObject* FindObject(const char* nameH, const TList* lst, Bool_t normPerEvent)
901 // get histo, optionally normalizing it per processed event
902 if (!lst) {printf("FindObject %s: No list provided\n",nameH); exit(1);}
903 int nent = lst->GetEntries();
906 for (int i=nent;i--;) {
907 nm = lst->At(i)->GetName();
908 if (nm.EndsWith(nameH)) {hst = lst->At(i); break;}
910 if (!hst) {printf("FindObject: No %s histo in list %s\n",nameH,lst->GetName()); exit(1);}
911 if (!normPerEvent || hst->TestBit(kBitNormPerEvent)) return hst; // already normalized
912 TString nameHS = nameH;
913 if (nameHS==kHStatName) return hst; // never scale stat. histo
915 TH1* hstat = (TH1*)FindObject(kHStatName,lst,kFALSE);
916 double nrm = hstat->GetBinContent(kEvProcData);
917 if (nrm<1) {printf("FindObject: Anomaluous %d number of events processed in list %p\n",int(nrm),lst); exit(1);}
919 // account for eventual cut in Z
920 TH1* hzv = (TH1*)FindObject("zv",lst,kFALSE);
921 int nbz = hzv->GetNbinsX();
922 double zvTot = hzv->Integral(1,nbz);
923 int zb0 = hzv->FindBin( useZvMin+kEps); if (zb0<1) zb0 = 1;
924 int zb1 = hzv->FindBin( useZvMax-kEps); if (zb1>nbz) zb1 = nbz;
925 double zvSel = hzv->Integral(zb0,zb1);
926 if (zvTot<1 || zvSel<1) {printf("No statistics: NzvTot: %.1f NzvSel:%.f\n",zvTot,zvSel); return 0;}
927 else printf("%f fraction of selected events is used with current Zv cut %.1f:%.1f\n",zvSel/zvTot,useZvMin,useZvMax);
930 if (hst->InheritsFrom(TH1::Class())) ((TH1*)hst)->Scale(1./nrm);
931 else if (hst->InheritsFrom(THnSparse::Class())) {
932 THnSparse* spr = (THnSparse*) hst;
934 int coord[3] = {0,0,0};
935 for (Long64_t i = 0; i < spr->GetNbins(); ++i) {
936 // Get the content of the bin from the current histogram
937 Double_t v = spr->GetBinContent(i, coord);
938 spr->SetBinContent(coord, v/nrm);
939 spr->SetBinError(coord,TMath::Sqrt(v)/nrm);
943 hst->SetBit(kBitNormPerEvent);
947 //______________________________________________________________________
948 TList* LoadList(const char* flName, const char* addPref, const char* nameL)
950 // load list with histos
951 TString nms = flName;
952 gSystem->ExpandPathName(nms);
953 TFile* fl = TFile::Open(nms.Data());
954 if (!fl) {printf("LoadList: No file %s\n",nms.Data()); exit(1);}
955 TList* lst = (TList*)fl->Get(nameL);
956 if (!lst) {printf("LoadList: No list %s in file %s\n",nameL,nms.Data()); exit(1);}
957 lst->SetName(flName);
959 int nEnt = lst->GetSize();
961 for (int i=0;i<nEnt;i++) {
962 TNamed* ob = (TNamed*)lst->At(i);
965 ob->SetName(nm.Data());
971 //____________________________________________________________________________
972 void GetRatE(double x,double xe, double y,double ye, double &rat, double &rate)
975 if (TMath::Abs(y)<1e-16 || TMath::Abs(x)<1e-16) return;
977 rate = rat*TMath::Sqrt( xe*xe/(x*x) + ye*ye/(y*y));
980 //____________________________________________________________________________
981 void Integrate(TH1* hist, double xmn,double xmx, double &val, double& err)
983 // integrate 1d histo within given limits
984 TAxis* xax = hist->GetXaxis();
985 int bmn = xax->FindBin(xmn+kEps); if (bmn<1) bmn = 0; // include
986 int bmx = xax->FindBin(xmx-kEps);
987 val = hist->IntegralAndError(bmn,bmx,err);
988 // is this histo with symmetric axis ? then integrate also negative half axis
989 if (TMath::Abs( xax->GetXmin() + xax->GetXmax() )<1e-6) {
990 bmn = xax->FindBin(-xmx+kEps);
991 bmx = xax->FindBin(-xmn-kEps);
993 val += hist->IntegralAndError(bmn,bmx,errn);
994 err = TMath::Sqrt(err*err + errn*errn);
999 //____________________________________________________________________________
1000 const char* HName(const char* prefix,const char* htype)
1002 // compose the name of histo in the clist
1003 static TString strh;
1004 strh = "Tr"; strh += prefix; strh += "_"; strh += htype;
1008 //____________________________________________________________________________
1009 Int_t CheckStat(const TList* lst, const char* dtType)
1011 // check if needed bg was generated
1012 TH1* hstat = (TH1*)FindObject(kHStatName,lst);
1013 TString dts = dtType;
1014 if (dts=="Data") return int( hstat->GetBinContent(kEvProcData) );
1015 if (dts=="Mix") return int( hstat->GetBinContent(kEvProcMix) );
1016 if (dts=="Inj") return int( hstat->GetBinContent(kEvProcInj) );
1017 if (dts=="Rot") return int( hstat->GetBinContent(kEvProcRot) );
1018 printf("Unknown process %s statistics is checked. Alowed: Data,Mix,Inj,Rot",dtType);
1022 //____________________________________________________________________________
1023 void ProjDZE(THnSparseF* hrawd, THnSparseF* hgenb, THnSparseF* hmcComb, TObjArray* res, int bStepEta,int bStepZv)
1025 // project 3d histo of Dist vs Zv vs Eta to Zv vs Eta with all cuts
1026 int shift = hmcComb ? kMCShift : 0; // is this mc?
1028 // determine boundaries for zv and eta cuts
1030 double cutDstMin,cutDstMax;
1031 double cutBgMin,cutBgMax;
1032 double cutSgMin,cutSgMax;
1033 if (useShapeType==kNormShapeDist) {
1035 cutDstMax = kWDistBgTailMax;
1037 cutBgMin = kWDistBgTailMin;
1038 cutBgMax = kWDistBgTailMax;
1041 cutSgMax = kWDistSgCut;
1044 cutDstMin = -kdPhiBgTailMax;
1045 cutDstMax = kdPhiBgTailMax;
1047 cutBgMin = kdPhiBgTailMin;
1048 cutBgMax = kdPhiBgTailMax;
1051 cutSgMax = kdPhiSgCut;
1054 int bn0[3] = {0}; // 1st bin to count
1055 int bn1[3] = {0}; // last bin to count
1057 TAxis* axEta = hrawd->GetAxis(0);
1058 bn0[0] = axEta->FindBin(-useEtaCut+kEps);
1059 bn1[0] = axEta->FindBin( useEtaCut-kEps);
1061 TAxis* axZv = hrawd->GetAxis(1);
1062 bn0[1] = axZv->FindBin( useZvMin+kEps);
1063 bn1[1] = axZv->FindBin( useZvMax-kEps);
1065 TAxis* axDst = hrawd->GetAxis(2);
1066 bn0[2] = axDst->FindBin( cutDstMin + kEps);
1067 bn1[2] = axDst->FindBin( cutDstMax - kEps);
1070 int nb[3] = { bn1[0]-bn0[0]+1, bn1[1]-bn0[1]+1, bn1[2]-bn0[2]+1}; // number of bins to count
1071 int nbTot[3] = {axEta->GetNbins(), axZv->GetNbins(), axDst->GetNbins() }; // total bins
1073 if (bStepEta<1 || bStepEta>nb[0]) bStepEta = nb[0];
1074 if (bStepZv<1 || bStepEta>nb[1]) bStepZv = nb[1];
1076 for (int i=3;i--;) { // set default axis range
1077 hrawd->GetAxis(i)->SetRange(1,nbTot[i]);
1078 hgenb->GetAxis(i)->SetRange(1,nbTot[i]);
1079 if (hmcComb) hmcComb->GetAxis(i)->SetRange(1,nbTot[i]);
1083 sprintf(grpTit,"grp_eta%d_zv%d",bStepEta,bStepZv);
1085 TString pref = hmcComb ? "mc" : "dt";
1087 // "Data" histo with cut on tails where we look for signal
1088 hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
1089 TH2* hRawDtCut = hrawd->Projection(1,0,"e");
1090 hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
1091 hRawDtCut->SetName(pref+"_RawWithCut");
1092 hRawDtCut->SetTitle(pref+" Raw with cut on tracklets");
1093 res->AddAtAndExpand(hRawDtCut, kRawDtCut+shift);
1095 // "Data - Est.Bg" histo with cut on tails where we look for signal
1096 hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
1097 TH2* hSignalEst = hrawd->Projection(1,0,"e");
1098 hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
1099 hSignalEst->SetName(pref+"_SignalCut_"+grpTit);
1100 hSignalEst->SetTitle(pref+" Signal (raw-bg) with cut on tracklets "+grpTit);
1101 res->AddAtAndExpand(hSignalEst, kSignalEst+shift);
1103 // "Data - MC.Bg" histo with cut on tails where we look for signal
1104 TH2* hSignalEstMC = 0;
1106 hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
1107 hSignalEstMC = hrawd->Projection(1,0,"e");
1108 hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
1109 hSignalEstMC->SetName(pref+"_SignalCut_bgMCLabels_"+grpTit);
1110 hSignalEstMC->SetTitle(pref+" Signal (raw-bg_MCLabels) with cut on tracklets "+grpTit);
1111 res->AddAtAndExpand(hSignalEstMC, kSignalEstMC+shift);
1114 // Estimated background in the cut range
1115 hgenb->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
1116 TH2* hBgEst = hgenb->Projection(1,0,"e");
1117 hgenb->GetAxis(2)->SetRange(bn0[2],bn1[2]);
1118 hBgEst->SetName(pref+"_BgEst_"+grpTit);
1119 hBgEst->SetTitle(pref+" Estimated Bg "+grpTit);
1120 res->AddAtAndExpand(hBgEst, kBgEst+shift);
1122 // 1-beta for "data" = (Data_cut - Bg_cut) / Data_cut
1123 TH2* h1mBeta = hrawd->Projection(1,0,"e");
1125 h1mBeta->SetName(pref+"_h1mBeta_"+grpTit);
1126 h1mBeta->SetTitle(pref+" 1-#beta with gen.bg. "+grpTit);
1127 res->AddAtAndExpand(h1mBeta, k1MBeta+shift);
1129 // If MC labels info is provided
1130 TH2* h1mBetaMC = 0; // 1-beta for MC with bg from labels
1131 TH2* hBgMC = 0; // bg from MC labels
1133 hmcComb->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
1134 h1mBetaMC = hmcComb->Projection(1,0,"e");
1135 h1mBetaMC->SetName(pref+"_h1mBetaMC");
1136 h1mBetaMC->SetTitle(pref+" 1-#beta with bg. from MC labels");
1137 h1mBetaMC->Divide(hRawDtCut);
1138 res->AddAtAndExpand(h1mBetaMC, k1MBetaMC+shift);
1139 for (int ib0=1;ib0<=nbTot[0];ib0++)
1140 for (int ib1=1;ib1<=nbTot[1];ib1++)
1141 h1mBetaMC->SetBinContent(ib0,ib1, 1.- h1mBetaMC->GetBinContent(ib0,ib1));
1143 hBgMC = hmcComb->Projection(1,0,"e");
1144 hBgMC->SetName(pref+"_Bg_MClab");
1145 hBgMC->SetTitle(pref+" Bg from MC labels");
1146 res->AddAtAndExpand(hBgMC, kBgMC+shift);
1148 // finalize estimated signal with bg from MC labels
1149 hSignalEstMC->Add(hBgMC,-1);
1151 hmcComb->GetAxis(2)->SetRange(bn0[2],bn1[2]);
1154 // rescaling factors for generated bg
1155 TH2* hBgRescFc = hrawd->Projection(1,0,"e"); hBgRescFc->Reset();
1156 hBgRescFc->SetName(pref+"_hBgRescFactors_"+grpTit);
1157 hBgRescFc->SetTitle(pref+" Scale.factor for gen.bg. "+grpTit);
1158 res->AddAtAndExpand(hBgRescFc, kBgRescFc+shift);
1160 int nbint = bStepEta*bStepZv;
1161 float nbinstsq = TMath::Sqrt(nbint);
1162 hrawd->GetAxis(0)->SetRange(bn0[0],bn1[0]);
1163 hrawd->GetAxis(1)->SetRange(bn0[1],bn1[1]);
1164 TH1* hDstDt = hrawd->Projection(2,"e");
1165 hrawd->GetAxis(0)->SetRange(1,nbTot[0]);
1166 hrawd->GetAxis(1)->SetRange(1,nbTot[1]);
1167 hDstDt->SetName(pref+"_DistRaw_"+grpTit); // "Data" projection on tracklet quality (w.distance) axis to check the tails
1168 hDstDt->SetTitle(pref+" DistRaw "+grpTit);
1169 double nrmDst,dumErr = 0;
1170 Integrate(hDstDt, cutBgMin,cutBgMax, nrmDst, dumErr);
1171 hDstDt->Scale(1./nrmDst);
1172 res->AddAtAndExpand(hDstDt, kDataDist+shift);
1174 hgenb->GetAxis(0)->SetRange(bn0[0],bn1[0]);
1175 hgenb->GetAxis(1)->SetRange(bn0[1],bn1[1]);
1176 TH1* hDstBg = hgenb->Projection(2,"e"); hDstBg->Reset();
1177 hgenb->GetAxis(0)->SetRange(1,nbTot[0]);
1178 hgenb->GetAxis(1)->SetRange(1,nbTot[1]);
1179 hDstBg->SetName(pref+"_DistBgNorm_"+grpTit); // Gen.Bg projection on tracklet quality (w.distance) axis to check the tails
1180 hDstBg->SetTitle(pref+" DistBgNorm "+grpTit); // Gen.Bg projection on tracklet quality (w.distance) axis to check the tails
1181 res->AddAtAndExpand(hDstBg, kBgDist+shift);
1184 hmcComb->GetAxis(0)->SetRange(bn0[0],bn1[0]);
1185 hmcComb->GetAxis(1)->SetRange(bn0[1],bn1[1]);
1186 hDstBgMC = hmcComb->Projection(2,"e");
1187 hmcComb->GetAxis(0)->SetRange(1,nbTot[0]);
1188 hmcComb->GetAxis(1)->SetRange(1,nbTot[1]);
1189 hDstBgMC->SetName(pref+"_DistBgMC");
1190 hDstBgMC->SetTitle(pref+" Bg. Distance from MC labels");
1191 hDstBgMC->Scale(1./nrmDst);
1192 res->AddAtAndExpand(hDstBgMC, kBgMCDist+shift);
1195 // fill 1-beta matrix
1196 for (int ib0=bn0[0];ib0<=bn1[0];ib0+=bStepEta) { // eta
1197 hrawd->GetAxis(0)->SetRange(ib0,ib0+bStepEta-1);
1198 hgenb->GetAxis(0)->SetRange(ib0,ib0+bStepEta-1);
1199 for (int ib1=bn0[1];ib1<=bn1[1];ib1+=bStepZv) { // zv
1200 hrawd->GetAxis(1)->SetRange(ib1,ib1+bStepZv-1);
1201 hgenb->GetAxis(1)->SetRange(ib1,ib1+bStepZv-1);
1203 TH1D* dstD = hrawd->Projection(2,"e"); // data "qaulity" for given eta:zv bin
1204 TH1D* dstB = hgenb->Projection(2,"e"); // data "qaulity" for given eta:zv bin
1206 TH1* nrmB = NormalizeBg(dstD,dstB,scl,sclE); // get rescaling factor for bg. from tails comparison
1209 // integral in the range where we look for signal
1210 Integrate(nrmB, cutSgMin, cutSgMax, bgVal, bgErr);
1211 Integrate(dstD, cutSgMin, cutSgMax, dtVal, dtErr);
1212 double beta,betaErr;
1213 GetRatE(bgVal,bgErr, dtVal, dtErr,beta,betaErr);
1214 // betaErr*=nbinstsq; // ??? RS
1215 for (int i=ib0;i<ib0+bStepEta;i++) {
1216 for (int j=ib1;j<ib1+bStepZv;j++) {
1217 hBgRescFc->SetBinContent(i,j, scl);
1218 hBgRescFc->SetBinError(i,j, sclE);
1228 hDstBg->Scale(1./nrmDst);
1230 // finalize estimated bg and signal matrices
1231 hBgEst->Multiply(hBgRescFc);
1232 hSignalEst->Add(hBgEst,-1);
1235 for (int ib0=bn0[0];ib0<=bn1[0];ib0++) { // eta
1236 for (int ib1=bn0[1];ib1<=bn1[1];ib1++) { // zv
1237 // printf("Bin %d %d\n",ib0,ib1);
1238 double bg = hBgEst->GetBinContent(ib0,ib1);
1239 double bgE = hBgEst->GetBinError(ib0,ib1);
1240 double dt = hRawDtCut->GetBinContent(ib0,ib1);
1241 double dtE = hRawDtCut->GetBinError(ib0,ib1);
1243 GetRatE(bg,bgE,dt,dtE, beta,betaE );
1244 h1mBeta->SetBinContent(ib0,ib1,1.-beta);
1245 h1mBeta->SetBinError(ib0,ib1,betaE);
1250 // crop to needed range
1251 for (int i=shift;i<kNHistos+shift;i++) {
1252 TH2* hist = (TH2*)res->At(i);
1253 if (!hist || !hist->InheritsFrom(TH2::Class())) continue;
1254 CropHisto(hist, bn0[0],bn1[0], bn0[1],bn1[1]);
1257 h1mBeta->SetMinimum(0.6);
1258 h1mBeta->SetMaximum(0.85);
1260 h1mBetaMC->SetMinimum(0.6);
1261 h1mBetaMC->SetMaximum(0.85);
1265 for (int i=3;i--;) { // set default axis range
1266 hrawd->GetAxis(i)->SetRange(1,nbTot[i]);
1267 hgenb->GetAxis(i)->SetRange(1,nbTot[i]);
1268 if (hmcComb) hmcComb->GetAxis(i)->SetRange(1,nbTot[i]);
1274 void GetRealMinMax(TH1* histo, double &vmn, double &vmx)
1276 TAxis *xax = histo->GetXaxis();
1277 int nbx = xax->GetNbins();
1279 if (histo->InheritsFrom(TH2::Class())) {
1280 TAxis *yax = histo->GetYaxis();
1281 int nby = yax->GetNbins();
1282 for (int ix=nbx+2;ix--;) {
1283 for (int iy=nby+2;iy--;) {
1284 double vl = histo->GetBinContent(ix,iy);
1285 if (vl<kEps) continue;
1286 if (vl<vmn) vmn = vl;
1287 if (vl>vmx) vmx = vl;
1293 for (int ix=nbx+2;ix--;) {
1294 double vl = histo->GetBinContent(ix);
1295 if (vl<vmn) vmn = vl;
1296 if (vl>vmx) vmx = vl;