void setRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale, double dMuonYmin) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("ctau"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); cout << YMax << endl; // Double_t YMin = min( h->GetBinContent(h->FindFirstBinAbove(0.0)), h->GetBinContent(h->FindLastBinAbove(0.0)) ); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); bool isMC = false; if (dsName.find("MC")!=std::string::npos) isMC = true; Double_t Yup(0.),Ydown(0.); if(setLogScale) { if (isMC) Ydown = YMin*0.3; else Ydown = YMin/(TMath::Power((YMax/YMin), (0.1/(1.0-0.1-0.4)))); Yup = YMax*TMath::Power((YMax/YMin), (0.4/(1.0-0.1-0.4))); } else { Ydown = max(YMin-(YMax-YMin)*(0.1/(1.0-0.1-0.4)),0.0); Yup = YMax+(YMax-YMin)*(0.4/(1.0-0.1-0.4)); } cout << Ydown << " " << Yup << endl; frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; // Create line to indicate upper fitting range for MC if (isMC) { if (dsName.find("JPSIP")!=std::string::npos) { TLine* line(0x0); if (dMuonYmin >= 1.6) line = new TLine(3.32,Ydown,3.32,Yup); else line = new TLine(3.26,Ydown,3.26,Yup); line->SetLineStyle(2); line->SetLineColor(1); line->SetLineWidth(3); frame->addObject(line); } else if (dsName.find("PSI2S")!=std::string::npos) { TLine* line(0x0); if (dMuonYmin >= 1.6) line = new TLine(3.95,Ydown,3.95,Yup); else line = new TLine(3.85,Ydown,3.85,Yup); line->SetLineStyle(2); line->SetLineColor(1); line->SetLineWidth(3); frame->addObject(line); } } }
void setMassFrom2DRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("invMass"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); // Double_t YMin = min( h->GetBinContent(h->FindFirstBinAbove(0.0)), h->GetBinContent(h->FindLastBinAbove(0.0)) ); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); Double_t Yup(0.),Ydown(0.); if(setLogScale) { Ydown = YMin/(TMath::Power((YMax/YMin), (0.1/(1.0-0.1-0.4)))); Yup = YMax*TMath::Power((YMax/YMin), (0.4/(1.0-0.1-0.4))); } else { Ydown = max(YMin-(YMax-YMin)*(0.1/(1.0-0.1-0.4)),0.0); Yup = YMax+(YMax-YMin)*(0.4/(1.0-0.1-0.4)); } frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; };
void setCtauFrom2DRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale, vector<double> rangeErr, double excEvts) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("ctau"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); Double_t Yup(0.),Ydown(0.); if(setLogScale) { Yup = YMax*TMath::Power((YMax/0.1), 0.5); Ydown = 0.1; } else { Yup = YMax+(YMax-0.0)*0.5; Ydown = 0.0; } frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; if (excEvts>0.0) { TLine *minline = new TLine(rangeErr[0], 0.0, rangeErr[0], (setLogScale?(Ydown*TMath::Power((Yup/Ydown),0.4)):(Ydown + (Yup-Ydown)*0.4))); minline->SetLineStyle(2); minline->SetLineColor(1); minline->SetLineWidth(3); frame->addObject(minline); TLine *maxline = new TLine(rangeErr[1], 0.0, rangeErr[1], (setLogScale?(Ydown*TMath::Power((Yup/Ydown),0.4)):(Ydown + (Yup-Ydown)*0.4))); maxline->SetLineStyle(2); maxline->SetLineColor(1); maxline->SetLineWidth(3); frame->addObject(maxline); } };