// 1-D histograms with alphanumeric labels // author; Rene Brun TCanvas *hlabels1() { const Int_t nx = 20; const char *people[nx] = {"Jean","Pierre","Marie","Odile","Sebastien", "Fons","Rene","Nicolas","Xavier","Greg","Bjarne","Anton","Otto", "Eddy","Peter","Pasha","Philippe","Suzanne","Jeff","Valery"}; TCanvas *c1 = new TCanvas("c1","demo bin labels",10,10,900,500); c1->SetGrid(); c1->SetTopMargin(0.15); TH1F *h = new TH1F("h","test",3,0,3); h->SetStats(0); h->SetFillColor(38); h->SetCanExtend(TH1::kAllAxes); for (Int_t i=0;i<5000;i++) { Int_t r = gRandom->Rndm()*20; h->Fill(people[r],1); } h->LabelsDeflate(); h->Draw(); TPaveText *pt = new TPaveText(0.7,0.85,0.98,0.98,"brNDC"); pt->SetFillColor(18); pt->SetTextAlign(12); pt->AddText("Use the axis Context Menu LabelsOption"); pt->AddText(" \"a\" to sort by alphabetic order"); pt->AddText(" \">\" to sort by decreasing values"); pt->AddText(" \"<\" to sort by increasing values"); pt->Draw(); return c1; }
void th2polyEurope(Int_t npoints=500000) { Int_t i,j; Double_t lon1 = -25; Double_t lon2 = 35; Double_t lat1 = 34; Double_t lat2 = 72; Double_t R = (lat2-lat1)/(lon2-lon1); Int_t W = 800; Int_t H = (Int_t)(R*800); gStyle->SetStatX(0.28); gStyle->SetStatY(0.45); gStyle->SetStatW(0.15); // Canvas used to draw TH2Poly (the map) TCanvas *ce = new TCanvas("ce", "ce",0,0,W,H); ce->ToggleEventStatus(); ce->SetGridx(); ce->SetGridy(); // Real surfaces taken from Wikipedia. const Int_t nx = 36; // see http://en.wikipedia.org/wiki/Area_and_population_of_European_countries const char *countries[nx] = { "france", "spain", "sweden", "germany", "finland", "norway", "poland", "italy", "yugoslavia", "united_kingdom", "romania", "belarus","greece", "czechoslovakia","bulgaria", "iceland", "hungary","portugal","austria", "ireland", "lithuania", "latvia", "estonia", "denmark", "netherlands", "switzerland","moldova","belgium", "albania", "cyprus", "luxembourg", "andorra","malta", "liechtenstein", "san_marino", "monaco" }; Float_t surfaces[nx] = { 547030, 505580, 449964, 357021, 338145, 324220, 312685, 301230, 255438, 244820, 237500, 207600, 131940, 127711, 110910, 103000, 93030, 89242, 83870, 70280, 65200, 64589, 45226, 43094, 41526, 41290, 33843, 30528, 28748, 9250, 2586, 468, 316, 160, 61, 2}; TH1F *h = new TH1F("h","Countries surfaces (in km^{2})",3,0,3); for (i=0; i<nx; i++) h->Fill(countries[i], surfaces[i]); h->LabelsDeflate(); TFile::SetCacheFileDir("."); TFile *f; f = TFile::Open("http://root.cern.ch/files/europe.root","cacheread"); if (!f) { printf("Cannot access europe.root. Is internet working ?\n"); return; } TH2Poly *p = new TH2Poly( "Europe", "Europe (bin contents are normalized to the surfaces in km^{2})", lon1,lon2,lat1,lat2); p->GetXaxis()->SetNdivisions(520); p->GetXaxis()->SetTitle("longitude"); p->GetYaxis()->SetTitle("latitude"); p->SetContour(100); TMultiGraph *mg; TKey *key; TIter nextkey(gDirectory->GetListOfKeys()); while ((key = (TKey*)nextkey())) { TObject *obj = key->ReadObj(); if (obj->InheritsFrom("TMultiGraph")) { mg = (TMultiGraph*)obj; p->AddBin(mg); } } TRandom r; Double_t longitude, latitude; Double_t x, y, pi4 = TMath::Pi()/4, alpha = TMath::Pi()/360; gBenchmark->Start("Partitioning"); p->ChangePartition(100, 100); gBenchmark->Show("Partitioning"); // Fill TH2Poly according to a Mercator projection. gBenchmark->Start("Filling"); for (i=0; i<npoints; i++) { longitude = r.Uniform(lon1,lon2); latitude = r.Uniform(lat1,lat2); x = longitude; y = 38*TMath::Log(TMath::Tan(pi4+alpha*latitude)); p->Fill(x,y); } gBenchmark->Show("Filling"); Int_t nbins = p->GetNumberOfBins(); Double_t maximum = p->GetMaximum(); // h2 contains the surfaces computed from TH2Poly. TH1F *h2 = (TH1F *)h->Clone("h2"); h2->Reset(); for (j=0; j<nx; j++) { for (i=0; i<nbins; i++) { if (strstr(countries[j],p->GetBinName(i+1))) { h2->Fill(countries[j],p->GetBinContent(i+1)); h2->SetBinError(j, p->GetBinError(i+1)); } } } // Normalize the TH2Poly bin contents to the real surfaces. Double_t scale = surfaces[0]/maximum; for (i=0; i<nbins; i++) p->SetBinContent(i+1, scale*p->GetBinContent(i+1)); gStyle->SetOptStat(1111); p->Draw("COLZ"); TCanvas *c1 = new TCanvas("c1", "c1",W+10,0,W-20,H); c1->SetRightMargin(0.047); scale = h->GetMaximum()/h2->GetMaximum(); h->SetStats(0); h->SetLineColor(kRed-3); h->SetLineWidth(2); h->SetMarkerStyle(20); h->SetMarkerColor(kBlue); h->SetMarkerSize(0.8); h->Draw("LP"); h->GetXaxis()->SetLabelFont(42); h->GetXaxis()->SetLabelSize(0.03); h->GetYaxis()->SetLabelFont(42); h2->Scale(scale); Double_t scale2=TMath::Sqrt(scale); for (i=0; i<nx; i++) h2->SetBinError(i+1, scale2*h2->GetBinError(i+1)); h2->Draw("E SAME"); h2->SetMarkerStyle(20); h2->SetMarkerSize(0.8); TLegend *leg = new TLegend(0.5,0.67,0.92,0.8,NULL,"NDC"); leg->SetTextFont(42); leg->SetTextSize(0.025); leg->AddEntry(h,"Real countries surfaces from Wikipedia (in km^{2})","lp"); leg->AddEntry(h2,"Countries surfaces from TH2Poly (with errors)","lp"); leg->Draw(); leg->Draw(); Double_t wikiSum = h->Integral(); Double_t polySum = h2->Integral(); Double_t error = TMath::Abs(wikiSum-polySum)/wikiSum; printf("THPoly Europe surface estimation error wrt wikipedia = %f per cent when using %d points\n",100*error,npoints); }
void GetOptimization() { struct path thisPath; std::vector<path> paths; std::vector<TString> pathNames; struct filter thisFilter; std::vector<filter> filters; std::vector<std::pair<std::vector<TString>,Double_t> > xSections; std::vector<TString> filenamesBkg; std::vector<TString> filenamesSig; /* Parameters */ Int_t nCuts = 120; Bool_t doBandE = true; // if true, do seperate for cuts in barrel and endcap Double_t luminosity = 2.0E33; // in cm^-2 s^-1 // Cross-sections in mb filenamesBkg.push_back("../test/QCD-HLTVars-1.root"); // filenamesBkg.push_back("sameXSection"); xSections.push_back(make_pair(filenamesBkg, 2.16E-2)); filenamesBkg.clear(); // filenamesBkg.push_back("newXSection.root"); // ... // xSections.push_back(make_pair(filenamesBkg, xSection)); // filenamesBkg.clear(); filenamesSig.push_back("../test/ZEE-HLTVars.root"); /* ********** */ // Filters thisFilter.name = "l1Match"; thisFilter.pathNum = 0; thisFilter.direction = 0; thisFilter.hltBarrelCut = 0.; thisFilter.hltEndcapCut = 0.; thisFilter.maxCut = 0.; filters.push_back(thisFilter); thisFilter.name = "Et"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 15.; thisFilter.hltEndcapCut = 15.; thisFilter.maxCut = 60.; filters.push_back(thisFilter); thisFilter.name = "IHcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 3.; thisFilter.hltEndcapCut = 3.; thisFilter.maxCut = 6.; filters.push_back(thisFilter); thisFilter.name = "pixMatch"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 0; thisFilter.hltEndcapCut = 0; thisFilter.maxCut = 0; filters.push_back(thisFilter); thisFilter.name = "Eoverp"; thisFilter.pathNum = 1; thisFilter.direction = -1; thisFilter.hltBarrelCut = 1.5; thisFilter.hltEndcapCut = 2.45; thisFilter.maxCut = 5.; filters.push_back(thisFilter); thisFilter.name = "Itrack"; thisFilter.pathNum = 1; thisFilter.direction = -1; thisFilter.hltBarrelCut = 0.06; thisFilter.hltEndcapCut = 0.06; thisFilter.maxCut = 0.24; filters.push_back(thisFilter); pathNames.push_back("SingleElecsPT."); pathNames.push_back("SingleElecs."); thisPath.names = pathNames; thisPath.nCandsCut = 1; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); pathNames.push_back("RelaxedSingleElecsPT."); pathNames.push_back("RelaxedSingleElecs."); thisPath.names = pathNames; thisPath.nCandsCut = 1; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); filters.clear(); thisFilter.name = "l1Match"; thisFilter.pathNum = 0; thisFilter.direction = 0; thisFilter.hltBarrelCut = 0.; thisFilter.hltEndcapCut = 0.; thisFilter.maxCut = 0.; filters.push_back(thisFilter); thisFilter.name = "Et"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 10.; thisFilter.hltEndcapCut = 10.; thisFilter.maxCut = 40.; filters.push_back(thisFilter); thisFilter.name = "IHcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 9.; thisFilter.hltEndcapCut = 9.; thisFilter.maxCut = 18.; filters.push_back(thisFilter); thisFilter.name = "pixMatch"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 0; thisFilter.hltEndcapCut = 0; thisFilter.maxCut = 0; filters.push_back(thisFilter); thisFilter.name = "Eoverp"; thisFilter.pathNum = 1; thisFilter.direction = -1; thisFilter.hltBarrelCut = 15000; thisFilter.hltEndcapCut = 24500; thisFilter.maxCut = 5.; filters.push_back(thisFilter); thisFilter.name = "Itrack"; thisFilter.pathNum = 1; thisFilter.direction = -1; thisFilter.hltBarrelCut = 0.4; thisFilter.hltEndcapCut = 0.4; thisFilter.maxCut = 0.12; filters.push_back(thisFilter); pathNames.push_back("DoubleElecsPT."); pathNames.push_back("DoubleElecs."); thisPath.names = pathNames; thisPath.nCandsCut = 2; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); pathNames.push_back("RelaxedDoubleElecsPT."); pathNames.push_back("RelaxedDoubleElecs."); thisPath.names = pathNames; thisPath.nCandsCut = 2; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); filters.clear(); thisFilter.name = "l1Match"; thisFilter.pathNum = 0; thisFilter.direction = 0; thisFilter.hltBarrelCut = 0.; thisFilter.hltEndcapCut = 0.; thisFilter.maxCut = 0.; filters.push_back(thisFilter); thisFilter.name = "Et"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 30.; thisFilter.hltEndcapCut = 30.; thisFilter.maxCut = 60.; filters.push_back(thisFilter); thisFilter.name = "IEcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 1.5; thisFilter.hltEndcapCut = 1.5; thisFilter.maxCut = 6.; filters.push_back(thisFilter); thisFilter.name = "IHcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 4.; thisFilter.hltEndcapCut = 6.; thisFilter.maxCut = 12.; filters.push_back(thisFilter); thisFilter.name = "Itrack"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 1; thisFilter.hltEndcapCut = 1; thisFilter.maxCut = 5; filters.push_back(thisFilter); pathNames.push_back("SinglePhots."); thisPath.names = pathNames; thisPath.nCandsCut = 1; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); pathNames.push_back("RelaxedSinglePhots."); thisPath.names = pathNames; thisPath.nCandsCut = 1; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); filters.clear(); thisFilter.name = "l1Match"; thisFilter.pathNum = 0; thisFilter.direction = 0; thisFilter.hltBarrelCut = 0.; thisFilter.hltEndcapCut = 0.; thisFilter.maxCut = 0.; filters.push_back(thisFilter); thisFilter.name = "Et"; thisFilter.pathNum = 0; thisFilter.direction = 1; thisFilter.hltBarrelCut = 20.; thisFilter.hltEndcapCut = 20.; thisFilter.maxCut = 40.; filters.push_back(thisFilter); thisFilter.name = "IEcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 2.5; thisFilter.hltEndcapCut = 2.5; thisFilter.maxCut = 5.; filters.push_back(thisFilter); thisFilter.name = "IHcal"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 6.; thisFilter.hltEndcapCut = 8.; thisFilter.maxCut = 24.; filters.push_back(thisFilter); thisFilter.name = "Itrack"; thisFilter.pathNum = 0; thisFilter.direction = -1; thisFilter.hltBarrelCut = 3; thisFilter.hltEndcapCut = 3; thisFilter.maxCut = 6; filters.push_back(thisFilter); pathNames.push_back("DoublePhots."); thisPath.names = pathNames; thisPath.nCandsCut = 2; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); pathNames.push_back("RelaxedDoublePhots."); thisPath.names = pathNames; thisPath.nCandsCut = 2; thisPath.filters = filters; paths.push_back(thisPath); pathNames.clear(); filters.clear(); /* *********** */ Int_t cutNum = 0, pathNum = 0, filterNum = 0, oldFilterNum = 0, fileNum = 0, xSecNum = 0; Double_t cut = 0.; Long64_t passSig = 0, totalSig = 0; Long64_t passBkg = 0, totalBkg = 0; Double_t effSig = 0., errSig = 0.; Double_t effBkg = 0., errBkg = 0., rateTotBkg = 0., errTotBkg = 0.; Double_t conversion = 1.0E-27; std::vector<std::pair<Double_t,Double_t> > sigPass; std::vector<std::pair<Double_t,Double_t> > bkgPass; TString cutText; TString cutTextEcap; TString baseCutText; TString baseCutTextEcap; TString cutBasePT1; TString cutBasePT2; TString cutBase1; TString cutBase2; // cutBasePT1 = "ElecHLTCutVarsPreTracks_hltCutVars_"; // cutBasePT2 = "ElecsPT_EGAMMAHLT.obj."; // cutBase1 = ""; // cutBase2 = "Elecs_EGAMMAHLT.obj."; std::vector<std::vector<TGraphErrors> > EffVBkg; std::vector<std::vector<TGraphErrors> > EffVBkgEcap; std::vector<TGraphErrors> pathEffVBkgs; TGraphErrors filterEffVBkgs(nCuts); for (pathNum = 0; pathNum < paths.size(); pathNum++) { for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { // filterEffVBkgs = new TGraphErrors(nCuts); pathEffVBkgs.push_back(filterEffVBkgs); } EffVBkg.push_back(pathEffVBkgs); if (doBandE) { EffVBkgEcap.push_back(pathEffVBkgs); } } std::vector<std::pair<TChain*,Double_t> > bkgEvents; for (xSecNum = 0; xSecNum < xSections.size(); xSecNum++) { TChain *bkgProc = new TChain("Events"); for (fileNum = 0; fileNum < (xSections[xSecNum].first).size(); fileNum++) { bkgProc->Add((xSections[xSecNum].first)[fileNum]); } bkgEvents.push_back(make_pair(bkgProc,xSections[xSecNum].second)); } TChain *sigEvents = new TChain("Events"); for (fileNum = 0; fileNum < filenamesSig.size(); fileNum++) { sigEvents->Add(filenamesSig[fileNum]); } Double_t testX, testY, testdX, testdY; Double_t thisBCut = 0., thisECut = 0.; TString pathName, filterName; for (cutNum = 0; cutNum < nCuts; cutNum++) { cout<<"Cut "<<cutNum<<endl; for (pathNum = 0; pathNum < paths.size(); pathNum++) { for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { if ((paths[pathNum].filters)[filterNum].maxCut != 0.) { cutText = "(Sum$("; for (oldFilterNum = 0; oldFilterNum < filterNum; oldFilterNum++) { pathName = (paths[pathNum].names)[(paths[pathNum].filters)[filterNum].pathNum]; filterName = (paths[pathNum].filters)[oldFilterNum].name; thisBCut = (paths[pathNum].filters)[oldFilterNum].hltBarrelCut; thisECut = (paths[pathNum].filters)[oldFilterNum].hltEndcapCut; if (thisBCut == thisECut) { cutText += pathName; cutText += filterName; switch ((paths[pathNum].filters)[oldFilterNum].direction) { case -1: cutText += " < "; cutText += (paths[pathNum].filters)[oldFilterNum].hltBarrelCut; break; case 0: break; case 1: cutText += " > "; cutText += (paths[pathNum].filters)[oldFilterNum].hltBarrelCut; break; default: cout<<"Invalid value of direction in "<<pathName<<filterName<<endl; break; } } else { cutText += "(("; cutText += pathName; cutText += filterName; switch ((paths[pathNum].filters)[oldFilterNum].direction) { case -1: cutText += " < "; cutText += thisBCut; break; case 0: break; case 1: cutText += " > "; cutText += thisBCut; break; default: cout<<"Invalid value of direction in "<<pathName<<filterName<<endl; break; } cutText += " && abs("; cutText += pathName; cutText += "eta) < 1.5) || ("; cutText += pathName; cutText += filterName; switch ((paths[pathNum].filters)[oldFilterNum].direction) { case -1: cutText += " < "; cutText += thisECut; break; case 0: break; case 1: cutText += " > "; cutText += thisECut; break; default: cout<<"Invalid value of direction in "<<pathName<<filterName<<endl; break; } cutText += " && abs("; cutText += pathName; cutText += "eta) > 1.5 && abs("; cutText += pathName; cutText += "eta) < 2.5))"; } if (oldFilterNum != filterNum - 1) cutText += " && "; } baseCutText = cutText; pathName = paths[pathNum].names[(paths[pathNum].filters)[filterNum].pathNum]; filterName = (paths[pathNum].filters)[filterNum].name; cutText += " && "; cutText += pathName; cutText += filterName; cut = (Double_t)cutNum / (Double_t)nCuts * (paths[pathNum].filters)[oldFilterNum].maxCut; switch ((paths[pathNum].filters)[filterNum].direction) { case -1: cutText += " < "; cutText += cut; break; case 0: break; case 1: cutText += " > "; cutText += cut; break; default: cout<<"Invalid value of direction in "<<pathName<<filterName<<endl; break; } if (doBandE) { cutTextEcap = cutText; cutText += " && abs("; cutText += pathName; cutText += "eta) < 1.5"; cutTextEcap += " && abs("; cutTextEcap += pathName; cutTextEcap += "eta) > 1.5 && abs("; cutTextEcap += pathName; cutTextEcap += ") < 2.5"; baseCutText += " && abs("; baseCutText += pathName; baseCutTextEcap = baseCutText; baseCutText += "eta) < 1.5"; baseCutTextEcap += "eta) > 1.5 && abs("; baseCutTextEcap += pathName; baseCutTextEcap += "eta) < 2.5"; } cutText += ") >= "; cutText += paths[pathNum].nCandsCut; cutText += ")"; cutTextEcap += ") >= "; cutTextEcap += paths[pathNum].nCandsCut; cutTextEcap += ")"; baseCutText += ") >= "; baseCutText += paths[pathNum].nCandsCut; baseCutText += ")"; baseCutTextEcap += ") >= "; baseCutTextEcap += paths[pathNum].nCandsCut; baseCutTextEcap += ")"; cout<<cutText<<endl; cout<<cutTextEcap<<endl; // cout<<cutText<<endl; // cout<<baseCutText<<endl; passSig = sigEvents->Draw("",cutText); totalSig = sigEvents->Draw("",baseCutText); if (totalSig != 0) { effSig = (Double_t)passSig / (Double_t)totalSig; errSig = sqrt(effSig * (1. - effSig) / (Double_t)totalSig); } else { effSig = 0.; errSig = 0.; } rateTotBkg = 0.; errTotBkg = 0.; for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) { passBkg = bkgEvents[xSecNum].first->Draw("",cutText); totalBkg = bkgEvents[xSecNum].first->Draw("",""); if (totalBkg != 0) { effBkg = (Double_t)passBkg / (Double_t)totalBkg; errBkg = sqrt(effBkg * (1. - effBkg) / (Double_t)totalBkg); } else { effBkg = 0.; errBkg = 0.; } rateTotBkg += effBkg * bkgEvents[xSecNum].second * luminosity * conversion; errTotBkg = sqrt(errTotBkg * errTotBkg + errBkg * errBkg * bkgEvents[xSecNum].second * luminosity * conversion * bkgEvents[xSecNum].second * luminosity * conversion); } if (cutNum == 6) { cout<<cutText<<endl; cout<<rateTotBkg<<" +- "<<errTotBkg<<", "<<effSig<<" +- "<<errSig<<endl;; } EffVBkg[pathNum][filterNum].SetPoint(cutNum, rateTotBkg, effSig); EffVBkg[pathNum][filterNum].SetPointError(cutNum, errTotBkg, errSig); if (cutNum == 6) { EffVBkg[pathNum][filterNum].GetPoint(cutNum, testX, testY); cout<<testX<<", "<<testY<<endl; } if (doBandE) { passSig = sigEvents->Draw("",cutTextEcap); totalSig = sigEvents->Draw("",baseCutText); if (totalSig != 0) { effSig = (Double_t)passSig / (Double_t)totalSig; errSig = sqrt(effSig * (1. - effSig) / (Double_t)totalSig); } else { effSig = 0.; errSig = 0.; } rateTotBkg = 0.; errTotBkg = 0.; for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) { passBkg = bkgEvents[xSecNum].first->Draw("",cutText); totalBkg = bkgEvents[xSecNum].first->Draw("",""); if (totalBkg != 0) { effBkg = (Double_t)passBkg / (Double_t)totalBkg; errBkg = sqrt(effBkg * (1. - effBkg) / (Double_t)totalBkg); } else { effBkg = 0.; errBkg = 0.; } rateTotBkg += effBkg * bkgEvents[xSecNum].second * luminosity * conversion; errTotBkg = sqrt(errTotBkg * errTotBkg + errBkg * errBkg * bkgEvents[xSecNum].second * luminosity * conversion * bkgEvents[xSecNum].second * luminosity * conversion); } if (cutNum == 6) { cout<<cutText<<endl; cout<<rateTotBkg<<" +- "<<errTotBkg<<", "<<effSig<<" +- "<<errSig<<endl;; } EffVBkgEcap[pathNum][filterNum].SetPoint(cutNum, rateTotBkg, effSig); EffVBkgEcap[pathNum][filterNum].SetPointError(cutNum, errTotBkg, errSig); if (cutNum == 6) { EffVBkg[pathNum][filterNum].GetPoint(cutNum, testX, testY); cout<<testX<<", "<<testY<<endl; } } } } } } TCanvas *myCanvas; TString tempPathName, canvasTitle, graphTitle, outFilename; Int_t n; Int_t nGraphs, curGraph; for (pathNum = 0; pathNum < paths.size(); pathNum++) { canvasTitle = "Efficiency vs. Background for "; tempPathName = paths[pathNum].names[paths[pathNum].filters[(paths[pathNum].filters).size()-1].pathNum]; tempPathName.Resize(tempPathName.Index(".", 1, 0, TString::kExact)); outFilename = "./images/"; outFilename += tempPathName; outFilename += "EffVBkg.gif"; n = 0; while (tempPathName.Contains(TRegexp("[a-z][A-Z]")) && n < 10) { tempPathName.Insert(tempPathName.Index(TRegexp("[a-z][A-Z]"))+1, " "); n++; } canvasTitle += tempPathName; nGraphs = 0; for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { if ((paths[pathNum].filters)[filterNum].maxCut != 0) nGraphs++; } myCanvas = new TCanvas("myCanvas", canvasTitle, 0, 0, 1000, 500*(nGraphs / 2 + 1)); myCanvas->Divide(2,nGraphs / 2 + 1); curGraph = 0; for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { if ((paths[pathNum].filters)[filterNum].maxCut != 0.) { myCanvas->cd(curGraph+1); curGraph++; graphTitle = "Efficiency vs. Background for "; graphTitle += (paths[pathNum].filters)[filterNum].name; graphTitle += " Filter;Background Rate (Hz);Signal Eff."; EffVBkg[pathNum][filterNum].SetTitle(graphTitle); EffVBkg[pathNum][filterNum].Draw("AP"); } } myCanvas->Print(outFilename); if (doBandE) { canvasTitle = "Efficiency vs. Background for "; tempPathName = paths[pathNum].names[paths[pathNum].filters[(paths[pathNum].filters).size()-1].pathNum]; tempPathName.Resize(tempPathName.Index(".", 1, 0, TString::kExact)); tempPathName += "Endcap"; outFilename = "./images/"; outFilename += tempPathName; outFilename += "EffVBkg.gif"; n = 0; while (tempPathName.Contains(TRegexp("[a-z][A-Z]")) && n < 10) { tempPathName.Insert(tempPathName.Index(TRegexp("[a-z][A-Z]"))+1, " "); n++; } canvasTitle += tempPathName; nGraphs = 0; for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { if ((paths[pathNum].filters)[filterNum].maxCut != 0) nGraphs++; } myCanvas = new TCanvas("myCanvas", canvasTitle, 0, 0, 1000, 500*(nGraphs / 2 + 1)); myCanvas->Divide(2,nGraphs / 2 + 1); curGraph = 0; for (filterNum = 0; filterNum < (paths[pathNum].filters).size(); filterNum++) { if ((paths[pathNum].filters)[filterNum].maxCut != 0.) { myCanvas->cd(curGraph+1); curGraph++; graphTitle = "Efficiency vs. Background for "; graphTitle += (paths[pathNum].filters)[filterNum].name; graphTitle += " Filter in Endcap;Background Rate (Hz);Signal Eff."; EffVBkgEcap[pathNum][filterNum].SetTitle(graphTitle); EffVBkgEcap[pathNum][filterNum].Draw("AP"); } } myCanvas->Print(outFilename); } } TH1F *timingSig = new TH1F("timingSig", "Timing of Single Electron Filters in Signal Events", 6, 0, 6); timingSig->SetCanExtend(TH1::kAllAxes); timingSig->SetStats(0); TTreeFormula *l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",sigEvents); TTreeFormula *EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",sigEvents); TTreeFormula *IHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecIHcal",sigEvents); TTreeFormula *pixMatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.pixMatch",sigEvents); TTreeFormula *EoverpTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Eoverp",sigEvents); TTreeFormula *ItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecItrack",sigEvents); Long64_t event = 0; Double_t avgL1Match = 0.; Double_t avgEt = 0.; Double_t avgIHcal = 0.; Double_t avgPixMatch = 0.; Double_t avgEoverp = 0.; Double_t avgItrack = 0.; for (event = 0; event < sigEvents->GetEntries(); event++) { sigEvents->LoadTree(event); avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgIHcal = (event*avgIHcal + IHcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPixMatch = (event*avgPixMatch + pixMatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEoverp = (event*avgEoverp + EoverpTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgItrack = (event*avgItrack + ItrackTiming->EvalInstance(0))/ ((Double_t) (event+1)); } timingSig->Fill("L1 Match", avgL1Match); timingSig->Fill("Et", avgEt); timingSig->Fill("IHcal", avgIHcal); timingSig->Fill("Pix Match", avgPixMatch); timingSig->Fill("E/p", avgEoverp); timingSig->Fill("Itrack", avgItrack); timingSig->LabelsDeflate("X"); timingSig->LabelsOption("v"); TH1F *timingBkg = new TH1F("timingBkg", "Timing of Single Electron Filters in Background Events", 6, 0, 6); timingBkg->SetCanExtend(TH1::kAllAxes); timingBkg->SetStats(0); avgL1Match = 0.; avgEt = 0.; avgIHcal = 0.; avgPixMatch = 0.; avgEoverp = 0.; avgItrack = 0.; for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) { delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",bkgEvents[xSecNum].first); delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",bkgEvents[xSecNum].first); delete IHcalTiming; IHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecIHcal",bkgEvents[xSecNum].first); delete pixMatchTiming; pixMatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.pixMatch",bkgEvents[xSecNum].first); delete EoverpTiming; EoverpTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Eoverp",bkgEvents[xSecNum].first); delete ItrackTiming; ItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.ElecItrack",bkgEvents[xSecNum].first); event = 0; for (event = 0; event < bkgEvents[xSecNum].first->GetEntries(); event++) { bkgEvents[xSecNum].first->LoadTree(event); avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgIHcal = (event*avgIHcal + IHcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPixMatch = (event*avgPixMatch + pixMatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEoverp = (event*avgEoverp + EoverpTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgItrack = (event*avgItrack + ItrackTiming->EvalInstance(0))/ ((Double_t) (event+1)); } } timingBkg->Fill("L1 Match", avgL1Match); timingBkg->Fill("Et", avgEt); timingBkg->Fill("IHcal", avgIHcal); timingBkg->Fill("Pix Match", avgPixMatch); timingBkg->Fill("E/p", avgEoverp); timingBkg->Fill("Itrack", avgItrack); timingBkg->LabelsDeflate("X"); timingBkg->LabelsOption("v"); myCanvas = new TCanvas("myCanvas", "Timing vs. Filter for Isolated Electron Filters", 1000, 500); myCanvas->Divide(2,1); myCanvas->cd(1); timingSig->Draw(); myCanvas->cd(2); timingBkg->Draw(); myCanvas->Print("images/TimingIso.gif"); delete myCanvas; delete timingSig; delete timingBkg; timingSig = new TH1F("timingSig", "Timing of Single Photon Filters in Signal Events", 6, 0, 6); timingSig->SetCanExtend(TH1::kAllAxes); timingSig->SetStats(0); delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",sigEvents); delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",sigEvents); TTreeFormula *IEcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.IEcal",sigEvents); TTreeFormula *PhotIHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotIHcal",sigEvents); TTreeFormula *PhotItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotItrack",sigEvents); event = 0; avgL1Match = 0.; avgEt = 0.; Double_t avgIEcal = 0.; Double_t avgPhotIHcal = 0.; Double_t avgPhotItrack = 0.; for (event = 0; event < sigEvents->GetEntries(); event++) { sigEvents->LoadTree(event); avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgIEcal = (event*avgIEcal + IEcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPhotIHcal = (event*avgPhotIHcal + PhotIHcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPhotItrack = (event*avgPhotItrack + PhotItrackTiming->EvalInstance(0))/ ((Double_t) (event+1)); } timingSig->Fill("L1 Match", avgL1Match); timingSig->Fill("Et", avgEt); timingSig->Fill("IEcal", avgIEcal); timingSig->Fill("IHcal", avgPhotIHcal); timingSig->Fill("Itrack", avgPhotItrack); timingSig->LabelsDeflate("X"); timingSig->LabelsOption("v"); timingBkg = new TH1F("timingBkg", "Timing of Single Photon Filters in Background Events", 6, 0, 6); timingBkg->SetCanExtend(TH1::kAllAxes); timingBkg->SetStats(0); avgL1Match = 0.; avgEt = 0.; avgIEcal = 0.; avgPhotIHcal = 0.; avgPhotItrack = 0.; for (xSecNum = 0; xSecNum < bkgEvents.size(); xSecNum++) { delete l1MatchTiming; l1MatchTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.l1Match",bkgEvents[xSecNum].first); delete EtTiming; EtTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.Et",bkgEvents[xSecNum].first); delete IEcalTiming; IEcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.IEcal",bkgEvents[xSecNum].first); delete PhotIHcalTiming; PhotIHcalTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotIHcal",bkgEvents[xSecNum].first); delete PhotItrackTiming; PhotItrackTiming = new TTreeFormula("Timing","HLTTiming_hltCutVars_IsoTiming_EGAMMAHLT.obj.PhotItrack",bkgEvents[xSecNum].first); event = 0; for (event = 0; event < bkgEvents[xSecNum].first->GetEntries(); event++) { bkgEvents[xSecNum].first->LoadTree(event); avgL1Match = (event*avgL1Match + l1MatchTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgEt = (event*avgEt + EtTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgIEcal = (event*avgIEcal + IEcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPhotIHcal = (event*avgPhotIHcal + PhotIHcalTiming->EvalInstance(0))/ ((Double_t) (event+1)); avgPhotItrack = (event*avgPhotItrack + PhotItrackTiming->EvalInstance(0))/ ((Double_t) (event+1)); } } timingBkg->Fill("L1 Match", avgL1Match); timingBkg->Fill("Et", avgEt); timingBkg->Fill("IEcal", avgIEcal); timingBkg->Fill("IHcal", avgPhotIHcal); timingBkg->Fill("Itrack", avgPhotItrack); timingBkg->LabelsDeflate("X"); timingBkg->LabelsOption("v"); myCanvas = new TCanvas("myCanvas", "Timing vs. Filter for Isolated Photon Filters", 1000, 500); myCanvas->Divide(2,1); myCanvas->cd(1); timingSig->Draw(); myCanvas->cd(2); timingBkg->Draw(); myCanvas->Print("images/TimingIsoPhot.gif"); }
void draw_centEff_fitResults(string cutname = "hiHF_hfCoinc3_pVtx") { ifstream in; //in.open("temp.txt"); in.open(Form("centEff_fitResults_%s.txt",cutname.data())); string run; int runtemp; Float_t eff, chi2; Int_t nlines = 0; //TFile *f = new TFile("hist_effcon_runDep.root","RECREATE"); TCanvas *c1 = new TCanvas("c1","",10,10,900,500); c1->SetGrid(); TH1F *h = new TH1F("h1","Eff+Contamination vs. run",1,0,1); h->SetStats(0); h->SetTitle("Eff+Contamination vs. run; Run number;Efficiency+Contamination (%)"); h->SetAxisRange(95,105,"Y"); h->SetCanExtend(TH1::kAllAxes); h->SetLineColor(2); TH1F *hgaus = new TH1F("hgaus","Eff+Contamination",20,99,101); while (1) { in >> run>> eff >> chi2; //run = itoa(runtemp); if (!in.good()) break; if (nlines < 5) printf("run=%s, eff+contamination=%3f, reduced chi2=%3f\n",run.data(),eff,chi2); h->Fill(run.data(),eff); hgaus->Fill(eff); nlines++; } in.close(); printf(" found %d points\n",nlines); c1->cd(); h->LabelsDeflate(); h->Draw("hist"); c1->SaveAs(Form("figures/centEff_runDep_%s.png",cutname.data())); TCanvas *c2 = new TCanvas("c2","",500,500); double gausMean, gausResol; double histMean, histResol; TF1* fgaus = cleverGaus(hgaus); gausMean = fgaus->GetParameter(1); gausResol = fgaus->GetParameter(2); hgaus->SetTitle(";Efficiency+Contamination (%);"); hgaus->SetNdivisions(504); hgaus->Draw("hist"); fgaus->Draw("same"); histMean = hgaus->GetMean(); histResol= hgaus->GetRMS();// GetRMS()=GetStdDev() only in ROOT! float xpos(0.62), ypos(0.76); float dy=0.05; drawText(Form("from historgam"),xpos,ypos,kBlack,18); drawText(Form("mean = %.3f",histMean),xpos,ypos-dy,kBlack,18); drawText(Form("sigma = %.3f",histResol),xpos,ypos-2*dy,kBlack,18); ypos=0.55; drawText(Form("from gaus fit"),xpos,ypos,kBlack,18); drawText(Form("mean = %.3f",gausMean),xpos,ypos-dy,kBlack,18); drawText(Form("sigma = %.3f",gausResol),xpos,ypos-2*dy,kBlack,18); xpos=0.62-0.21; drawText("Dataset : HIMinimumBias2", xpos, 0.18+2*dy); drawText("Trig : HLT_HIL1MinimumBiasHF1AND_v1", xpos, 0.18+dy); drawText("Evt. sel. filter : hfCoinc3 && pVtx", xpos, 0.18); c2->SaveAs(Form("figures/centEff_runDep_gaus_%s.png",cutname.data())); }