std::pair<std::vector<float>, std::vector<float> > HelperFunctions::approxAntipole(const std::vector<std::vector<float> >& objects, const MatchingThumbnails& matching) { std::vector<std::vector<float> > copied_objects; for(MatchingThumbnails::const_iterator it = matching.begin(); it != matching.end(); ++it) { copied_objects.push_back(objects[*it]); } std::vector<std::vector<float> >::iterator it = copied_objects.begin(); while(copied_objects.size() > 2) { long start = it - copied_objects.begin(); std::vector<std::vector<float> > new_tournament; for(int i = 0; i < tournament_size && i < static_cast<int>(copied_objects.size()); ++i) { new_tournament.push_back(*it); ++it; if(it == copied_objects.end()) { it = copied_objects.begin(); } } unsigned long result = (median1(new_tournament) + start) % copied_objects.size(); unsigned long distance = it - copied_objects.begin(); copied_objects.erase(copied_objects.begin() + result); if(result < distance) { it = copied_objects.begin() + distance - 1; } else if(result == distance) { if(distance == copied_objects.size()) { it = copied_objects.begin(); } else { it = copied_objects.begin() + distance; } } } return std::make_pair(*copied_objects.begin(), *(copied_objects.begin()+1)); }
void testMM() { //TFile *fout = new TFile("fout.root","recreate"); TH1F *hx1 = new TH1F("hx1","hx1",100,0,1); TH1F *hx2 = new TH1F("hx2","hx2",100,0,1); TH1F *hx3 = new TH1F("hx3","hx3",100,0,1); TH1F *hchi2 = new TH1F("hchi2","hchi2",1000,0,2000); TH1F *mc1, *mc2, *mc3, *data, *tmp; mc1 = new TH1F("mc1","mc1",bins,x1,x2); mc2 = new TH1F("mc2","mc2",bins,x1,x2); mc3 = new TH1F("mc3","mc3",bins,x1,x2); TNtuple *d = new TNtuple("d","d","x:weight"); TH1F *pred = new TH1F("pred","pred",bins,x1,x2); TH1F *truth = new TH1F("truth","truth",bins,x1,x2); data = new TH1F("data","data",bins,x1,x2); tmp = new TH1F("tmp","tmp",bins,x1,x2); mc1->Sumw2(); mc2->Sumw2(); mc3->Sumw2(); data->Sumw2(); //GenerateData(mc1,mc2,mc3,data); GenerateDataUnbinned(mc1,mc2,mc3,d); d->Project("data","x","weight"); TCanvas *cc = new TCanvas ("temp","temp",600,600); data->Draw(); cc->SaveAs("data.pdf"); cout<<"???"<<data->Integral()<<endl; double chi2 = Fit(mc1,mc2,mc3,d,hx1,hx2,hx3,hchi2); cout<<"Fit chi2 = "<<chi2<<endl; TH1F *mctmp1, *mctmp2, *mctmp3; mctmp1 = (TH1F *)mc1->Clone("mctmp1x"); mctmp2 = (TH1F *)mc2->Clone("mctmp2x"); mctmp3 = (TH1F *)mc3->Clone("mctmp3x"); ShakeMC(mc1,mc2,mc3,mctmp1,mctmp2,mctmp3); TCanvas *c2 = new TCanvas("c2","c2",600,600); mc1->Draw(); mctmp1->Draw("same"); TCanvas *c3 = new TCanvas("c3","c3",600,600); hx1->Draw(); hx2->Draw("same"); hx3->Draw("same"); double ymax = hx1->GetMaximum(); TLine *l1 = new TLine(x1true,0,x1true,ymax); l1->SetLineWidth(2.0);l1->SetLineColor(kRed); l1->Draw(); TLine *l2 = new TLine(x2true,0,x2true,ymax); l2->SetLineWidth(2.0);l2->SetLineColor(kRed); l2->Draw(); TLine *l3 = new TLine(x3true,0,x3true,ymax); l3->SetLineWidth(2.0);l3->SetLineColor(kRed); l3->Draw(); TCanvas *cchi2 = new TCanvas("cchi2","cchi2",600,600); hchi2->Draw(); cout<<"x1 = "<<hx1->GetMean()<<"±"<<hx1->GetStdDev()<<endl; cout<<"x2 = "<<hx2->GetMean()<<"±"<<hx2->GetStdDev()<<endl; cout<<"x3 = "<<hx3->GetMean()<<"±"<<hx3->GetStdDev()<<endl; cout<<"Median 1 "<<median1(hx1)<<endl; cout<<"Median 2 "<<median1(hx2)<<endl; cout<<"Median 3 "<<median1(hx3)<<endl; double xx[]={x1true,x2true,x3true}; //cout<<"Chi2 of truth = "<<Chi2(xx)<<endl; mc1->Scale(hx1->GetMean()); mc2->Scale(hx2->GetMean()); mc3->Scale(hx3->GetMean()); pred->Add(mc1); pred->Add(mc2); pred->Add(mc3); pred->SetMarkerColor(kBlue); truth->Add(mc1,x1true/mc1->Integral()); truth->Add(mc2,x2true/mc2->Integral()); truth->Add(mc3,x3true/mc3->Integral()); truth->SetMarkerColor(kBlack); data->Scale(1/data->Integral()); data->SetMarkerColor(kRed); TCanvas *c1 = new TCanvas("c1","c1",600,600); data->Draw(); mc1->Draw("same,hist"); mc2->Draw("same,hist"); mc3->Draw("same,hist"); pred->Draw("same"); data->Draw("same"); truth->Draw("same"); float legendx1 = 0.65, legendy1 = 0.65, legendx2 = 0.84, legendy2 = 0.84; TLegend *l = new TLegend(legendx1,legendy1,legendx2,legendy2); l->AddEntry(pred,"Fit","P"); l->AddEntry(data,"Data","P"); l->AddEntry(truth,"Truth","P"); l->Draw(); }