/* $Id$ */ #if !defined(__CINT__) || defined(__MAKECINT__) #include "AliPWG0Helper.h" #include "dNdEtaAnalysis.h" #include "AlidNdEtaCorrection.h" #include <TCanvas.h> #include <TFile.h> #include <TH1.h> #include <TH2F.h> #include <TH3F.h> #include <TLine.h> #include <TSystem.h> #include <TLegend.h> #include <TPad.h> #include <TF1.h> extern TPad* gPad; void Track2Particle1DCreatePlots(const char* fileName = "correction_map.root", const char* folderName = "dndeta_correction", Float_t upperPtLimit = 10); #endif Int_t markers[] = {20,20,21,22,23,28,29}; Int_t colors[] = {1,2,3,4,6,8,102}; void loadlibs() { gSystem->Load("libTree"); gSystem->Load("libVMC"); gSystem->Load("libSTEERBase"); gSystem->Load("libANALYSIS"); gSystem->Load("libPWG0base"); } void SetRanges(TAxis* axis) { if (strcmp(axis->GetTitle(), "#eta") == 0) axis->SetRangeUser(-1.7999, 1.7999); if (strcmp(axis->GetTitle(), "p_{T} [GeV/c]") == 0) axis->SetRangeUser(0, 9.9999); if (strcmp(axis->GetTitle(), "vtx z [cm]") == 0) axis->SetRangeUser(-15, 14.9999); if (strcmp(axis->GetTitle(), "Ntracks") == 0) axis->SetRangeUser(0, 99.9999); } void SetRanges(TH1* hist) { SetRanges(hist->GetXaxis()); SetRanges(hist->GetYaxis()); SetRanges(hist->GetZaxis()); } void Prepare3DPlot(TH3* hist) { hist->GetXaxis()->SetTitleOffset(1.5); hist->GetYaxis()->SetTitleOffset(1.5); hist->GetZaxis()->SetTitleOffset(1.5); hist->SetStats(kFALSE); } void Prepare2DPlot(TH2* hist) { hist->SetStats(kFALSE); hist->GetYaxis()->SetTitleOffset(1.4); SetRanges(hist); } void Prepare1DPlot(TH1* hist, Bool_t setRanges = kTRUE) { hist->SetLineWidth(2); hist->SetStats(kFALSE); hist->GetXaxis()->SetTitleOffset(1.2); hist->GetYaxis()->SetTitleOffset(1.2); if (setRanges) SetRanges(hist); } void InitPad() { if (!gPad) return; gPad->Range(0, 0, 1, 1); gPad->SetLeftMargin(0.15); //gPad->SetRightMargin(0.05); //gPad->SetTopMargin(0.13); //gPad->SetBottomMargin(0.1); gPad->SetGridx(); gPad->SetGridy(); } void InitPadCOLZ() { gPad->Range(0, 0, 1, 1); gPad->SetRightMargin(0.15); gPad->SetLeftMargin(0.12); gPad->SetGridx(); gPad->SetGridy(); } void Secondaries() { TFile* file = TFile::Open("systematics.root"); TH2F* secondaries = dynamic_cast<TH2F*> (file->Get("fSecondaries")); if (!secondaries) { printf("Could not read histogram\n"); return; } TCanvas* canvas = new TCanvas("Secondaries", "Secondaries", 1000, 1000); canvas->Divide(3, 3); for (Int_t i=1; i<=8; i++) { TH1D* hist = secondaries->ProjectionY(Form("proj_%d", i), i, i); hist->SetTitle(secondaries->GetXaxis()->GetBinLabel(i)); canvas->cd(i); hist->Draw(); } } void Track2Particle1DComposition(const char** fileNames, Int_t folderCount, const char** folderNames, Float_t upperPtLimit = 9.9) { gSystem->Load("libPWG0base"); TString canvasName; canvasName.Form("Track2Particle1DComposition"); TCanvas* canvas = new TCanvas(canvasName, canvasName, 1200, 400); canvas->Divide(3, 1); TLegend* legend = new TLegend(0.7, 0.7, 0.95, 0.95); for (Int_t i=0; i<folderCount; ++i) { Correction1DCreatePlots(fileNames[i], folderNames[i], upperPtLimit); TH1* corrX = dynamic_cast<TH1*> (gROOT->FindObject("generated_x_div_measured_x")); TH1* corrY = dynamic_cast<TH1*> (gROOT->FindObject("generated_y_div_measured_y")); TH1* corrZ = dynamic_cast<TH1*> (gROOT->FindObject("generated_z_div_measured_z")); Prepare1DPlot(corrX); Prepare1DPlot(corrY); Prepare1DPlot(corrZ); const char* title = "Track2Particle Correction"; corrX->SetTitle(title); corrY->SetTitle(title); corrZ->SetTitle(title); corrZ->GetXaxis()->SetRangeUser(0, upperPtLimit); corrX->SetLineColor(i+1); corrY->SetLineColor(i+1); corrZ->SetLineColor(i+1); canvas->cd(1); InitPad(); corrX->DrawCopy(((i>0) ? "SAME" : "")); canvas->cd(2); InitPad(); corrY->DrawCopy(((i>0) ? "SAME" : "")); canvas->cd(3); InitPad(); corrZ->DrawCopy(((i>0) ? "SAME" : "")); legend->AddEntry(corrZ, folderNames[i]); } legend->Draw(); //canvas->SaveAs(Form("Track2Particle1D_%s_%d_%f.gif", fileName, gMax, upperPtLimit)); //canvas->SaveAs(Form("Track2Particle1D_%s_%d_%f.eps", fileName, gMax, upperPtLimit)); } TH1** DrawRatios(const char* fileName = "systematics.root") { gSystem->Load("libPWG0base"); TFile* file = TFile::Open(fileName); TString canvasName; canvasName.Form("DrawRatios"); TCanvas* canvas = new TCanvas(canvasName, canvasName, 800, 400); canvas->Divide(2, 1); canvas->cd(1); TH1** ptDists = new TH1*[4]; TLegend* legend = new TLegend(0.73, 0.73, 0.98, 0.98); const char* folderNames[] = { "correction_0", "correction_1", "correction_2", "correction_3" }; const char* particleNames[] = { "#pi", "K", "p", "other" }; for (Int_t i=0; i<4; ++i) { AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(folderNames[i], folderNames[i]); dNdEtaCorrection->LoadHistograms(fileName, folderNames[i]); TH3F* gene = dNdEtaCorrection->GetTrack2ParticleCorrection()->GetGeneratedHistogram(); gene->GetYaxis()->SetRangeUser(-0.8, 0.8); gene->GetXaxis()->SetRangeUser(-10, 10); ptDists[i] = dynamic_cast<TH1*> (gene->Project3D("z")->Clone(Form("%s_z", folderNames[i]))); ptDists[i]->SetTitle(";p_{T};Count"); if (!ptDists[i]) { printf("Problem getting distribution %d.\n", i); return 0; } ptDists[i]->GetYaxis()->SetRangeUser(1, ptDists[i]->GetMaximum()*1.1); ptDists[i]->GetXaxis()->SetRangeUser(0, 9.9); ptDists[i]->SetLineColor(i+1); ptDists[i]->DrawCopy((i == 0) ? "" : "SAME"); ptDists[i]->GetYaxis()->SetRange(0, 0); legend->AddEntry(ptDists[i], particleNames[i]); } gPad->SetLogy(); TH1* total = dynamic_cast<TH1*> (ptDists[0]->Clone("total")); for (Int_t i=1; i<4; ++i) total->Add(ptDists[i]); canvas->cd(2); for (Int_t i=0; i<4; ++i) { ptDists[i]->Divide(total); ptDists[i]->SetStats(kFALSE); ptDists[i]->SetTitle(";p_{T};Fraction of total"); ptDists[i]->GetYaxis()->SetRangeUser(0, 1); ptDists[i]->Draw((i == 0) ? "" : "SAME"); } legend->SetFillColor(0); legend->Draw(); canvas->SaveAs("DrawRatios.gif"); canvas = new TCanvas("PythiaRatios", "PythiaRatios", 500, 500); for (Int_t i=0; i<4; ++i) { TH1* hist = ptDists[i]->Clone(); hist->GetXaxis()->SetRangeUser(0, 1.9); hist->Draw((i == 0) ? "" : "SAME"); } legend->Draw(); canvas->SaveAs("pythiaratios.eps"); file->Close(); return ptDists; } void DrawCompareToReal() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "correction_map.root", "new_compositions.root" }; const char* folderNames[] = { "dndeta_correction", "PythiaRatios" }; Track2Particle1DComposition(fileNames, 2, folderNames); } void DrawDifferentSpecies() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "systematics.root", "systematics.root", "systematics.root", "systematics.root" }; const char* folderNames[] = { "correction_0", "correction_1", "correction_2", "correction_3" }; Track2Particle1DComposition(fileNames, 4, folderNames); } void DrawpiKpAndCombined() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "systematics.root", "systematics.root", "systematics.root", "correction_map.root" }; const char* folderNames[] = { "correction_0", "correction_1", "correction_2", "dndeta_correction" }; Track2Particle1DComposition(fileNames, 4, folderNames); } void DrawSpeciesAndCombination() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "systematics.root", "systematics.root", "systematics.root", "new_compositions.root" }; const char* folderNames[] = { "correction_0", "correction_1", "correction_2", "PythiaRatios" }; Track2Particle1DComposition(fileNames, 4, folderNames); } void DrawSimulatedVsCombined() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "new_compositions.root", "new_compositions.root" }; const char* folderNames[] = { "Pythia", "PythiaRatios" }; Track2Particle1DComposition(fileNames, 2, folderNames); } void DrawBoosts() { gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = { "new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root" }; const char* folderNames[] = { "PythiaRatios", "PiBoosted", "KBoosted", "pBoosted" }; Track2Particle1DComposition(fileNames, 4, folderNames); } TH2F* HistogramDifferences(const char* filename, const char* folder1, const char* folder2) { gSystem->Load("libPWG0base"); AlidNdEtaCorrection* fdNdEtaCorrection[2]; TFile::Open(filename); fdNdEtaCorrection[0] = new AlidNdEtaCorrection(folder1, folder1); fdNdEtaCorrection[0]->LoadHistograms(filename, folder1); fdNdEtaCorrection[1] = new AlidNdEtaCorrection(folder2, folder2); fdNdEtaCorrection[1]->LoadHistograms(filename, folder2); TH3F* hist1 = fdNdEtaCorrection[0]->GetTrack2ParticleCorrection()->GetCorrectionHistogram(); TH3F* hist2 = fdNdEtaCorrection[1]->GetTrack2ParticleCorrection()->GetCorrectionHistogram(); //TH1F* difference = new TH1F("difference", Form(";#DeltaC_{pT, z, #eta} %s / %s;Count", folder2, folder1), 1000, 0.9, 1.1); TH2F* difference = new TH2F(Form("difference_%s_%s", folder1, folder2), Form(";#Sigma (C_{pT, z} %s / C_{pT, z} %s);#eta;Count", folder2, folder1), 100, 0.9, 1.1, hist1->GetYaxis()->GetNbins(), hist1->GetYaxis()->GetXmin(), hist1->GetYaxis()->GetXmax()); for (Int_t x=hist1->GetXaxis()->FindBin(-10); x<=hist1->GetXaxis()->FindBin(10); ++x) for (Int_t y=hist1->GetYaxis()->FindBin(-0.8); y<=hist1->GetYaxis()->FindBin(0.8); ++y) for (Int_t z=hist1->GetZaxis()->FindBin(0.3); z<=hist1->GetZaxis()->FindBin(9.9); ++z) if (hist1->GetBinContent(x, y, z) != 0) difference->Fill(hist2->GetBinContent(x, y, z) / hist1->GetBinContent(x, y, z), hist1->GetYaxis()->GetBinCenter(y)); difference->GetYaxis()->SetRangeUser(-0.8, 0.8); printf("Over-/Underflow bins: %d %d\n", difference->GetBinContent(0), difference->GetBinContent(difference->GetNbinsX()+1)); return difference; } void HistogramDifferences() { TH2F* KBoosted = HistogramDifferences("new_compositions.root", "PythiaRatios", "KBoosted"); TH2F* pBoosted = HistogramDifferences("new_compositions.root", "PythiaRatios", "pBoosted"); TH2F* KReduced = HistogramDifferences("new_compositions.root", "PythiaRatios", "KReduced"); TH2F* pReduced = HistogramDifferences("new_compositions.root", "PythiaRatios", "pReduced"); TCanvas* canvas = new TCanvas("HistogramDifferences", "HistogramDifferences", 1000, 1000); canvas->Divide(2, 2); canvas->cd(1); KBoosted->GetXaxis()->SetRangeUser(-0.05, 0.05); KBoosted->Draw("COLZ"); canvas->cd(2); KReduced->GetXaxis()->SetRangeUser(-0.05, 0.05); KReduced->Draw("COLZ"); canvas->cd(3); pBoosted->GetXaxis()->SetRangeUser(-0.02, 0.02); pBoosted->Draw("COLZ"); canvas->cd(4); pReduced->GetXaxis()->SetRangeUser(-0.02, 0.02); pReduced->Draw("COLZ"); canvas->SaveAs("HistogramDifferences.gif"); canvas = new TCanvas("HistogramDifferencesProfile", "HistogramDifferencesProfile", 1000, 500); canvas->Divide(2, 1); canvas->cd(1); gPad->SetBottomMargin(0.13); KBoosted->SetTitle("a) Ratio of correction maps"); KBoosted->SetStats(kFALSE); KBoosted->GetXaxis()->SetTitleOffset(1.4); KBoosted->GetXaxis()->SetLabelOffset(0.02); KBoosted->Draw("COLZ"); canvas->cd(2); gPad->SetGridx(); gPad->SetGridy(); TLegend* legend = new TLegend(0.73, 0.73, 0.98, 0.98); for (Int_t i=0; i<4; ++i) { TH2F* hist = 0; TString name; switch (i) { case 0: hist = KBoosted; name = "K enhanced"; break; case 1: hist = KReduced; name = "K reduced"; break; case 2: hist = pBoosted; name = "p enhanced"; break; case 3: hist = pReduced; name = "p reduced"; break; } TProfile* profile = hist->ProfileY(); profile->SetTitle("b) Mean and RMS"); profile->GetXaxis()->SetRange(hist->GetYaxis()->GetFirst(), hist->GetYaxis()->GetLast()); profile->GetXaxis()->SetTitleOffset(1.2); profile->GetXaxis()->SetLabelOffset(0.02); profile->GetYaxis()->SetRangeUser(0.98, 1.02); profile->SetStats(kFALSE); profile->SetLineColor(i+1); profile->SetMarkerColor(i+1); profile->DrawCopy(((i > 0) ? "SAME" : "")); legend->AddEntry(profile, name); } legend->Draw(); canvas->SaveAs("particlecomposition_result.eps"); } void ScalePtDependent(TH3F* hist, TF1* function) { // assumes that pt is the third dimension of hist // scales with function(pt) for (Int_t z=1; z<=hist->GetNbinsZ(); ++z) { Double_t factor = function->Eval(hist->GetZaxis()->GetBinCenter(z)); printf("z = %d, pt = %f, scaling with %f\n", z, hist->GetZaxis()->GetBinCenter(z), factor); for (Int_t x=1; x<=hist->GetNbinsX(); ++x) for (Int_t y=1; y<=hist->GetNbinsY(); ++y) hist->SetBinContent(x, y, z, hist->GetBinContent(x, y, z) * factor); } } void ScalePtDependent(TH3F* hist, TH1* function) { // assumes that pt is the third dimension of hist // scales with histogram(pt) for (Int_t z=1; z<=hist->GetNbinsZ(); ++z) { Double_t factor = function->GetBinContent(function->GetXaxis()->FindBin(hist->GetZaxis()->GetBinCenter(z))); printf("z = %d, pt = %f, scaling with %f\n", z, hist->GetZaxis()->GetBinCenter(z), factor); for (Int_t x=1; x<=hist->GetNbinsX(); ++x) for (Int_t y=1; y<=hist->GetNbinsY(); ++y) hist->SetBinContent(x, y, z, hist->GetBinContent(x, y, z) * factor); } } const char* ChangeComposition(void** correctionPointer, Int_t index) { AlidNdEtaCorrection** fdNdEtaCorrection = (AlidNdEtaCorrection**) correctionPointer; switch (index) { case 0: // result from pp events { TFile::Open("pythiaratios.root"); for (Int_t i=0; i<4; ++i) { TString name; name.Form("correction_%d", i); fdNdEtaCorrection[i] = new AlidNdEtaCorrection(name, name); fdNdEtaCorrection[i]->LoadHistograms("pythiaratios.root", name); } } return "Pythia"; break; case 1: // each species rated with pythia ratios /*TH1** ptDists = DrawRatios("pythiaratios.root"); for (Int_t i=0; i<3; ++i) { ScalePtDependent(fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetMeasuredHistogram(), ptDists[i]); ScalePtDependent(fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetGeneratedHistogram(), ptDists[i]); }*/ return "PythiaRatios"; break; // one species enhanced / reduced case 2: // + 30% kaons case 3: // - 30% kaons case 4: // + 30% protons case 5: // - 30% protons case 6: // + 30% kaons + 30% protons case 7: // - 30% kaons - 30% protons case 8: // + 30% kaons - 30% protons case 9: // - 30% kaons + 30% protons case 10: // + 30% others case 11: // - 30% others TString* str = new TString; if (index < 6) { Int_t correctionIndex = index / 2; Double_t scaleFactor = (index % 2 == 0) ? 1.3 : 0.7; fdNdEtaCorrection[correctionIndex]->GetTrack2ParticleCorrection()->GetTrackCorrection()->Scale(scaleFactor); str->Form("%s%s", (correctionIndex == 0) ? "Pi" : ((correctionIndex == 1) ? "K" : (correctionIndex == 2) ? "p" : "others"), (index % 2 == 0) ? "Boosted" : "Reduced"); } else if (index < 10) { Double_t scaleFactor = (index % 2 == 0) ? 1.3 : 0.7; fdNdEtaCorrection[1]->GetTrack2ParticleCorrection()->GetTrackCorrection()->Scale(scaleFactor); str->Form("%s%s", "K", (scaleFactor > 1) ? "Boosted" : "Reduced"); if (index >= 8) scaleFactor = (index % 2 == 0) ? 0.3 : 1.7; fdNdEtaCorrection[2]->GetTrack2ParticleCorrection()->GetTrackCorrection()->Scale(scaleFactor); *str += Form("%s%s", "p", (scaleFactor > 1) ? "Boosted" : "Reduced"); } else { Double_t scaleFactor = (index % 2 == 0) ? 1.3 : 0.7; fdNdEtaCorrection[3]->GetTrack2ParticleCorrection()->GetTrackCorrection()->Scale(scaleFactor); str->Form("%s%s", "others", (scaleFactor > 1) ? "Boosted" : "Reduced"); } return str->Data(); break; // each species rated with pythia ratios case 12: // + 50% pions case 13: // - 50% pions case 14: // + 50% kaons case 15: // - 50% kaons case 16: // + 50% protons case 17: // - 50% protons TH1** ptDists = DrawRatios("pythiaratios.root"); Int_t functionIndex = (index - 2) / 2; Double_t scaleFactor = (index % 2 == 0) ? 1.5 : 0.5; ptDists[functionIndex]->Scale(scaleFactor); for (Int_t i=0; i<3; ++i) { ScalePtDependent(fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetMeasuredHistogram(), ptDists[i]); ScalePtDependent(fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetGeneratedHistogram(), ptDists[i]); } TString* str = new TString; str->Form("%s%s", (functionIndex == 0) ? "Pi" : ((functionIndex == 1) ? "K" : "p"), (index % 2 == 0) ? "Boosted" : "Reduced"); return str->Data(); break; case 999: TF1* ptDependence = new TF1("simple", "x", 0, 100); ScalePtDependent(fdNdEtaCorrection[0]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetGeneratedHistogram(), ptDependence); ScalePtDependent(fdNdEtaCorrection[0]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetMeasuredHistogram(), ptDependence); break; } return "noname"; } void Composition() { loadlibs(); gSystem->Unlink("new_compositions.root"); gSystem->Unlink("new_compositions_analysis.root"); const char* names[] = { "pi", "K", "p", "other" }; TH1* hRatios[20]; //backgroundEvents = 1162+434; // Michele for MB1, run 104892, 15.02.10 backgroundEvents = -1; // use 0 bin from MC! for 2.36 TeV Printf("Subtracting %d background events!!!", backgroundEvents); gSystem->Sleep(1000); Int_t nCompositions = 12; Int_t counter = 0; for (Int_t comp = 1; comp < nCompositions; ++comp) { AlidNdEtaCorrection* fdNdEtaCorrection[4]; TFile::Open("correction_mapparticle-species.root"); for (Int_t i=0; i<4; ++i) { TString name; name.Form("dndeta_correction_%s", names[i]); fdNdEtaCorrection[i] = new AlidNdEtaCorrection(name, name); fdNdEtaCorrection[i]->LoadHistograms(); } const char* newName = ChangeComposition(fdNdEtaCorrection, comp); Double_t geneCount[5]; Double_t measCount[5]; geneCount[4] = 0; measCount[4] = 0; for (Int_t i=0; i<4; ++i) { geneCount[i] = fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetGeneratedHistogram()->Integral(); measCount[i] = fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetTrackCorrection()->GetMeasuredHistogram()->Integral(); geneCount[4] += geneCount[i]; measCount[4] += measCount[i]; printf("Particle %s: %d gene, %d meas\n", ((i == 0) ? "pi" : (i == 1) ? "K" : (i == 2) ? "p" : "others"), (Int_t) geneCount[i], (Int_t) measCount[i]); } printf("Generated ratios are: %f pi, %f K, %f p, %f others\n", geneCount[0] / geneCount[4], geneCount[1] / geneCount[4], geneCount[2] / geneCount[4], geneCount[3] / geneCount[4]); printf("Reconstructed ratios are: %f pi, %f K, %f p, %f others\n", measCount[0] / measCount[4], measCount[1] / measCount[4], measCount[2] / measCount[4], measCount[3] / measCount[4]); TList* collection = new TList; // skip "other" particle correction here // with them has to be dealt differently, maybe just increasing the neutral particles... for (Int_t i=1; i<4; ++i) collection->Add(fdNdEtaCorrection[i]); fdNdEtaCorrection[0]->Merge(collection); fdNdEtaCorrection[0]->Finish(); delete collection; // save everything TFile* file = TFile::Open("new_compositions.root", "UPDATE"); fdNdEtaCorrection[0]->SetName(newName); fdNdEtaCorrection[0]->SaveHistograms(); //file->Write(); file->Close(); // correct dNdeta distribution with modified correction map TFile::Open("analysis_esd_raw.root"); dNdEtaAnalysis* fdNdEtaAnalysis = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD"); fdNdEtaAnalysis->LoadHistograms(); fdNdEtaAnalysis->Finish(fdNdEtaCorrection[0], 0.2, 3, newName); hRatios[counter] = (TH1F*) fdNdEtaAnalysis->GetdNdEtaHistogram()->Clone(newName); hRatios[counter]->SetTitle(newName); hRatios[counter]->SetYTitle("dN_{ch}/d#eta ratio #frac{default composition}{modified composition}"); if (counter > 0) hRatios[counter]->Divide(hRatios[0],hRatios[counter],1,1); file = TFile::Open("new_compositions_analysis.root", "UPDATE"); hRatios[counter]->Write(); file->Close(); delete fdNdEtaAnalysis; counter++; } /* gROOT->ProcessLine(".L drawPlots.C"); const char* fileNames[] = {"new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root", "new_compositions.root" }; const char* folderNames[] = { "PythiaRatios", "PiBoosted", "PiReduced", "KBoosted", "KReduced", "pBoosted", "pReduced" }; Track2Particle1DComposition(fileNames, nCompositions, folderNames); */ } void drawSystematics() { //Secondaries(); //DrawDifferentSpecies(); //Composition(); Sigma2VertexSimulation(); } void DrawdNdEtaDifferences() { TH1* hists[5]; TLegend* legend = new TLegend(0.3, 0.73, 0.70, 0.98); legend->SetFillColor(0); TCanvas* canvas = new TCanvas("DrawdNdEtaDifferences", "DrawdNdEtaDifferences", 1000, 500); canvas->Divide(2, 1); canvas->cd(1); for (Int_t i=0; i<5; ++i) { hists[i] = 0; TFile* file = 0; TString title; switch(i) { case 0 : file = TFile::Open("systematics_dndeta_reference.root"); title = "standard composition"; break; case 1 : file = TFile::Open("systematics_dndeta_KBoosted.root"); title = "+ 50% kaons"; break; case 2 : file = TFile::Open("systematics_dndeta_KReduced.root"); title = "- 50% kaons"; break; case 3 : file = TFile::Open("systematics_dndeta_pBoosted.root"); title = "+ 50% protons"; break; case 4 : file = TFile::Open("systematics_dndeta_pReduced.root"); title = "- 50% protons"; break; default: return; } if (file) { hists[i] = (TH1*) file->Get("dndeta/dndeta_dNdEta_corrected_2"); hists[i]->SetTitle("a)"); Prepare1DPlot(hists[i], kFALSE); hists[i]->GetXaxis()->SetRangeUser(-0.7999, 0.7999); hists[i]->GetYaxis()->SetRangeUser(6, 7); hists[i]->SetLineColor(colors[i]); hists[i]->SetMarkerColor(colors[i]); hists[i]->SetMarkerStyle(markers[i]); hists[i]->GetXaxis()->SetLabelOffset(0.015); hists[i]->GetYaxis()->SetTitleOffset(1.5); gPad->SetLeftMargin(0.12); hists[i]->DrawCopy(((i > 0) ? "SAME" : "")); legend->AddEntry(hists[i], title); hists[i]->SetTitle(title); } } legend->Draw(); canvas->cd(2); gPad->SetLeftMargin(0.14); TLegend* legend2 = new TLegend(0.73, 0.73, 0.98, 0.98); legend2->SetFillColor(0); for (Int_t i=1; i<5; ++i) { if (hists[i]) { legend2->AddEntry(hists[i]); hists[i]->Divide(hists[0]); hists[i]->SetTitle("b)"); hists[i]->SetLineColor(colors[i-1]); hists[i]->SetMarkerColor(colors[i-1]); hists[i]->GetYaxis()->SetRangeUser(0.95, 1.05); hists[i]->GetYaxis()->SetTitle("Ratio to standard composition"); hists[i]->GetYaxis()->SetTitleOffset(1.8); hists[i]->DrawCopy(((i > 1) ? "SAME" : "")); } } legend2->Draw(); canvas->SaveAs("particlecomposition_result_detail.gif"); TCanvas* canvas2 = new TCanvas("DrawdNdEtaDifferences2", "DrawdNdEtaDifferences2", 700, 500); for (Int_t i=1; i<5; ++i) { if (hists[i]) { hists[i]->SetTitle(""); hists[i]->GetYaxis()->SetTitleOffset(1.1); hists[i]->DrawCopy(((i > 1) ? "SAME" : "")); } } legend2->Draw(); canvas2->SaveAs("particlecomposition_result.gif"); canvas2->SaveAs("particlecomposition_result.eps"); } void mergeCorrectionsWithDifferentCrosssections(Int_t origin, Int_t correctionTarget = 3, Char_t* correctionFileName="correction_mapprocess-types.root", const char* analysisFileName = "analysis_esd_raw.root", const Char_t* outputFileName=0) { // // Function used to merge standard corrections with vertex // reconstruction corrections obtained by a certain mix of ND, DD // and SD events. // // the dn/deta spectrum is corrected and the ratios // (standard to changed x-section) of the different dN/deta // distributions are saved to a file. // // correctionTarget is of type AlidNdEtaCorrection::CorrectionType // kINEL = 3 // kNSD = 4 // kOnePart = 6 if (outputFileName == 0) { if (correctionTarget == 3) outputFileName = "systematics_vtxtrigger_compositions_inel.root"; if (correctionTarget == 4) outputFileName = "systematics_vtxtrigger_compositions_nsd.root"; if (correctionTarget == 6) outputFileName = "systematics_vtxtrigger_compositions_onepart.root"; } loadlibs(); const Char_t* typeName[] = { "vertexreco", "trigger", "vtxtrigger" }; //Karel: // fsd = 0.153 +- 0.031 (0.050 to take into account SD definition) --> change // fdd = 0.080 +- 0.050 --> change // fnd = 0.767 +- 0.059 --> keep (error small) // const Char_t* changes[] = { "pythia","ddmore","ddless","sdmore","sdless", "dmore", "dless", "sdlessddmore", "sdmoreddless", "ddmore25","ddless25","sdmore25","sdless25", "dmore25", "dless25", "sdlessddmore25", "sdmoreddless25"}; //Float_t scalesND[] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; //Float_t scalesDD[] = {1.0, 1.5, 0.5, 1.0, 1.0, 1.5, 0.5, 1.5, 0.5, 1.25, 0.75, 1.0, 1.0, 1.25, 0.75, 1.25, 0.75}; //Float_t scalesSD[] = {1.0, 1.0, 1.0, 1.5, 0.5, 1.5, 0.5, 0.5, 1.5, 1.0, 1.0, 1.25, 0.75, 1.25, 0.75, 0.75, 1.25}; //Float_t scalesDD[] = {1.0, 1.4, 0.6, 1.0, 1.0, 1.4, 0.6, 1.4, 0.6, 1.25, 0.75, 1.0, 1.0, 1.25, 0.75, 1.25, 0.75}; //Float_t scalesSD[] = {1.0, 1.0, 1.0, 1.4, 0.6, 1.4, 0.6, 0.4, 1.6, 1.0, 1.0, 1.25, 0.75, 1.25, 0.75, 0.75, 1.25}; /* Int_t nChanges = 9; const Char_t* changes[] = { "ua5","ddmore","ddless","sdmore","sdless", "dmore", "dless", "sdlessddmore", "sdmoreddless" }; Float_t scalesND[] = {0.767, 0.767, 0.767, 0.767, 0.767, 0.767, 0.767, 0.767, 0.767}; Float_t scalesDD[] = {0.080, 0.130, 0.030, 0.080, 0.080, 0.130, 0.030, 0.130, 0.030}; Float_t scalesSD[] = {0.153, 0.153, 0.153, 0.203, 0.103, 0.203, 0.103, 0.103, 0.203};*/ Float_t ref_SD = -1; Float_t ref_DD = -1; Float_t ref_ND = -1; Float_t error_SD = -1; Float_t error_DD = -1; Float_t error_ND = -1; GetRelativeFractions(origin, ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND); Printf("Using x-sections:\n SD: %f +- %f\n DD: %f +- %f\n ND: %f +- %f", ref_SD, error_SD, ref_DD, error_DD, ref_ND, error_ND); const Char_t* changes[] = { "default","sdless","sdmore","ddless","ddmore", "dless", "dmore", "sdlessddmore", "sdmoreddless" }; Int_t nChanges = 9; Float_t scalesSD[9]; Float_t scalesDD[9]; Float_t scalesND[9]; if (1) { // sample 8 points on the error ellipse for (Int_t i=0; i<9; i++) { Float_t factorSD = 0; Float_t factorDD = 0; if (i > 0 && i < 3) factorSD = (i % 2 == 0) ? 1 : -1; else if (i >= 3 && i < 5) factorDD = (i % 2 == 0) ? 1 : -1; else if (i >= 5 && i < 9) { factorSD = ((i % 2 == 0) ? 1.0 : -1.0) / TMath::Sqrt(2); if (i == 5 || i == 6) factorDD = factorSD; else factorDD = -factorSD; } scalesSD[i] = ref_SD + factorSD * error_SD; scalesDD[i] = ref_DD + factorDD * error_DD; scalesND[i] = 1.0 - scalesDD[i] - scalesSD[i]; Printf("Case %d: SD: %f DD: %f ND: %f", i, scalesSD[i], scalesDD[i], scalesND[i]); } } else { Printf("WARNING: Special treatment for ratios active"); gSystem->Sleep(1000); // constrained values by allowed changing of cross-sections Float_t pythiaScaling = 0.224 / 0.189; if (origin == 10) { // 900 GeV for (Int_t i=0; i<9; i++) { scalesSD[i] = 15.3; scalesDD[i] = 9.5; } scalesSD[1] = 15.7; scalesSD[2] = 17.6; scalesSD[3] = 13.5; scalesSD[4] = 17.6; scalesDD[5] = 15.5; scalesDD[6] = 8.8; scalesDD[7] = 13.8; scalesDD[8] = 7.6; } else if (origin == 20) { // 2.36 TeV pythiaScaling = 0.217 / 0.167; for (Int_t i=0; i<9; i++) { scalesSD[i] = 15.9; scalesDD[i] = 10.7; } scalesSD[1] = 13.5; scalesSD[2] = 15.2; scalesSD[3] = 13.5; scalesSD[4] = 17.6; scalesDD[5] = 13.8; scalesDD[6] = 7.6; scalesDD[7] = 13.8; scalesDD[8] = 7.6; } else AliFatal("Not supported"); for (Int_t i=0; i<9; i++) { scalesSD[i] /= 100; scalesSD[i] *= pythiaScaling; scalesDD[i] /= 100; scalesND[i] = 1.0 - scalesDD[i] - scalesSD[i]; Printf("Case %d: SD: %f DD: %f ND: %f", i, scalesSD[i], scalesDD[i], scalesND[i]); } } Int_t backgroundEvents = 0; //backgroundEvents = 1162+434; // Michele for MB1, run 104892, 15.02.10 //backgroundEvents = 6; // Michele for V0AND, run 104892, 15.02.10 //backgroundEvents = 4398+961; // Michele for MB1, run 104824-52, 16.02.10 //backgroundEvents = 19; // Michele for V0AND, run 104824-52, 16.02.10 backgroundEvents = -1; // use 0 bin from MC! for 2.36 TeV Printf("Subtracting %d background events!!!", backgroundEvents); gSystem->Sleep(1000); /* const Char_t* changes[] = { "pythia", "qgsm", "phojet"}; Float_t scalesND[] = {1.0, 1.10, 1.11}; Float_t scalesSD[] = {1.0, 0.69, 0.86}; Float_t scalesDD[] = {1.0, 0.98, 0.61}; Int_t nChanges = 3; */ // cross section from Pythia // 14 TeV! // Float_t sigmaND = 55.2; // Float_t sigmaDD = 9.78; // Float_t sigmaSD = 14.30; // standard correction TFile::Open(correctionFileName); AlidNdEtaCorrection* correctionStandard = new AlidNdEtaCorrection("dndeta_correction","dndeta_correction"); correctionStandard->LoadHistograms(); // dont take vertexreco from this one correctionStandard->GetVertexRecoCorrection()->Reset(); // dont take triggerbias from this one correctionStandard->GetTriggerBiasCorrectionINEL()->Reset(); correctionStandard->GetTriggerBiasCorrectionNSD()->Reset(); correctionStandard->GetTriggerBiasCorrectionND()->Reset(); correctionStandard->GetTriggerBiasCorrectionOnePart()->Reset(); AlidNdEtaCorrection* corrections[100]; TH1F* hRatios[100]; Int_t counter = 0; for (Int_t j=2; j<3; j++) { // j = 0 (change vtx), j = 1 (change trg), j = 2 (change both) for (Int_t i=0; i<nChanges; i++) { TFile::Open(correctionFileName); TString name; name.Form("dndeta_correction_syst_%s_%s", typeName[j], changes[i]); AlidNdEtaCorrection* current = new AlidNdEtaCorrection(name, name); current->LoadHistograms("dndeta_correction"); current->Reset(); name.Form("dndeta_correction_ND"); AlidNdEtaCorrection* dNdEtaCorrectionND = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionND->LoadHistograms(); name.Form("dndeta_correction_DD"); AlidNdEtaCorrection* dNdEtaCorrectionDD = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionDD->LoadHistograms(); name.Form("dndeta_correction_SD"); AlidNdEtaCorrection* dNdEtaCorrectionSD = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionSD->LoadHistograms(); // calculating relative Float_t nd = dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t dd = dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t sd = dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t total = nd + dd + sd; nd /= total; sd /= total; dd /= total; Printf("Ratios in the correction map are: ND=%f, DD=%f, SD=%f", nd, dd, sd); Float_t scaleND = scalesND[i] / nd; Float_t scaleDD = scalesDD[i] / dd; Float_t scaleSD = scalesSD[i] / sd; Printf("ND=%.2f, DD=%.2f, SD=%.2f",scaleND, scaleDD, scaleSD); /* Float_t nd = 100 * sigmaND/(sigmaND + (scalesDD[i]*sigmaDD) + (scalesDD[i]*sigmaSD)); Float_t dd = 100 * (scalesDD[i]*sigmaDD)/(sigmaND + (scalesDD[i]*sigmaDD) + (scalesDD[i]*sigmaSD)); Float_t sd = 100 * (scalesSD[i]*sigmaSD)/(sigmaND + (scalesDD[i]*sigmaDD) + (scalesDD[i]*sigmaSD)); printf(Form("%s : ND=%.2f\%, DD=%.2f\%, SD=%.2f\% \n",changes[i],nd,dd,sd));*/ current->SetTitle(Form("ND=%.2f\%,DD=%.2f\%,SD=%.2f\%",scaleND,scaleDD,scaleSD)); current->SetTitle(name); // scale if (j == 0 || j == 2) { dNdEtaCorrectionND->GetVertexRecoCorrection()->Scale(scaleND); dNdEtaCorrectionDD->GetVertexRecoCorrection()->Scale(scaleDD); dNdEtaCorrectionSD->GetVertexRecoCorrection()->Scale(scaleSD); } if (j == 1 || j == 2) { dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionNSD()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionNSD()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionNSD()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionND()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionND()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionND()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionOnePart()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionOnePart()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionOnePart()->Scale(scaleSD); } //clear track in correction dNdEtaCorrectionND->GetTrack2ParticleCorrection()->Reset(); dNdEtaCorrectionDD->GetTrack2ParticleCorrection()->Reset(); dNdEtaCorrectionSD->GetTrack2ParticleCorrection()->Reset(); TList collection; collection.Add(correctionStandard); collection.Add(dNdEtaCorrectionND); collection.Add(dNdEtaCorrectionDD); collection.Add(dNdEtaCorrectionSD); current->Merge(&collection); current->Finish(); // print 0 bin efficiency TH1* hist2 = current->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->Get1DCorrection("y", -10, 10); if (hist2->GetBinContent(1)) { Float_t triggerEff = 100.0 / hist2->GetBinContent(1); Printf("trigger eff in 0 bin is: %.2f %%", triggerEff); } corrections[counter] = current; // now correct dNdeta distribution with modified correction map TFile::Open(analysisFileName); dNdEtaAnalysis* fdNdEtaAnalysis = new dNdEtaAnalysis("fdNdEtaAnalysisESD", "fdNdEtaAnalysisESD"); fdNdEtaAnalysis->LoadHistograms(); fdNdEtaAnalysis->Finish(current, 0.151, correctionTarget, Form("%d %d", j, i), backgroundEvents); name = "ratio"; if (j==0) name.Append("_vetexReco_"); if (j==1) name.Append("_triggerBias_"); if (j==2) name.Append("_vertexReco_triggerBias_"); name.Append(changes[i]); hRatios[counter] = (TH1F*) fdNdEtaAnalysis->GetdNdEtaHistogram()->Clone(name); name.Form("ND #times %0.2f DD #times %0.2f, SD #times %0.2f",scaleND,scaleDD,scaleSD); hRatios[counter]->SetTitle(name.Data()); hRatios[counter]->SetYTitle("dN_{ch}/d#eta ratio #frac{default cross-section}{modified cross-sections}"); TF1* pol0 = new TF1("pol0", "[0]", -0.49, 0.49); pol0->SetParameter(0, 0); hRatios[counter]->Fit(pol0, "RN"); Printf("Case %d: %f", i, pol0->GetParameter(0)); if (counter > 0) hRatios[counter]->Divide(hRatios[0],hRatios[counter],1,1); delete fdNdEtaAnalysis; counter++; } } TFile* fout = new TFile(outputFileName,"RECREATE"); // to make everything consistent hRatios[0]->Divide(hRatios[0],hRatios[0],1,1); for (Int_t i=0; i<counter; i++) { corrections[i]->SaveHistograms(); hRatios[i]->Write(); } fout->Write(); fout->Close(); } void GetRelativeFractions(Int_t origin, Float_t& ref_SD, Float_t& ref_DD, Float_t& ref_ND, Float_t& error_SD, Float_t& error_DD, Float_t& error_ND) { // origin: // -1 = Pythia (test) // 0 = UA5 // 1 = Data 1.8 TeV // 2 = Tel-Aviv // 3 = Durham // switch (origin) { case -10: // Pythia default at 7 GeV, 50% error Printf("PYTHIA x-sections"); ref_SD = 0.192637; error_SD = ref_SD * 0.5; ref_DD = 0.129877; error_DD = ref_DD * 0.5; ref_ND = 0.677486; error_ND = 0; break; case -1: // Pythia default at 900 GeV, as test Printf("PYTHIA x-sections"); ref_SD = 0.223788; ref_DD = 0.123315; ref_ND = 0.652897; break; case 0: // UA5 Printf("UA5 x-sections a la first paper"); ref_SD = 0.153; error_SD = 0.05; ref_DD = 0.080; error_DD = 0.05; ref_ND = 0.767; error_ND = 0; break; case 10: // UA5 Printf("UA5 x-sections hadron level definition for Pythia"); // Fractions in Pythia with UA5 cuts selection for SD // ND: 0.688662 // SD: 0.188588 --> this should be 15.3 // DD: 0.122750 ref_SD = 0.224 * 0.153 / 0.189; error_SD = 0.023 * 0.224 / 0.189; ref_DD = 0.095; error_DD = 0.06; ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0; break; case 11: // UA5 Printf("UA5 x-sections hadron level definition for Phojet"); // Fractions in Phojet with UA5 cuts selection for SD // ND: 0.783573 // SD: 0.151601 --> this should be 15.3 // DD: 0.064827 ref_SD = 0.191 * 0.153 / 0.152; error_SD = 0.023 * 0.191 / 0.152; ref_DD = 0.095; error_DD = 0.06; ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0; break; case 20: // E710, 1.8 TeV Printf("E710 x-sections hadron level definition for Pythia"); // ND: 0.705709 // SD: 0.166590 --> this should be 15.9 // DD: 0.127701 ref_SD = 0.217 * 0.159 / 0.167; error_SD = 0.024 * 0.217 / 0.167; ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43; ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0; break; case 21: // E710, 1.8 TeV Printf("E710 x-sections hadron level definition for Phojet"); // ND: 0.817462 // SD: 0.125506 --> this should be 15.9 // DD: 0.057032 ref_SD = 0.161 * 0.159 / 0.126; error_SD = 0.024 * 0.161 / 0.126; ref_DD = 0.075 * 1.43; error_DD = 0.02 * 1.43; ref_ND = 1.0 - ref_SD - ref_DD; error_ND = 0; break; case 1: // data 1.8 TeV Printf("??? x-sections"); ref_SD = 0.152; ref_DD = 0.092; ref_ND = 1 - ref_SD - ref_DD; break; case 2: // tel-aviv model Printf("Tel-aviv model x-sections"); ref_SD = 0.171; ref_DD = 0.094; ref_ND = 1 - ref_SD - ref_DD; break; case 3: // durham model Printf("Durham model x-sections"); ref_SD = 0.190; ref_DD = 0.125; ref_ND = 1 - ref_SD - ref_DD; break; default: AliFatal(Form("Unknown origin %d", origin)); } } void CreateCorrectionsWithUA5CrossSections(Int_t origin, const Char_t* correctionFileName="correction_mapprocess-types.root", const Char_t* outputFileName="correction_map2.root") { // // Function used to merge standard corrections with vertex // reconstruction corrections obtained by a certain mix of ND, DD // and SD events. // loadlibs(); const Char_t* typeName[] = { "vertexreco", "trigger", "vtxtrigger" }; Float_t ref_SD = -1; Float_t ref_DD = -1; Float_t ref_ND = -1; Float_t error_SD = -1; Float_t error_DD = -1; Float_t error_ND = -1; GetRelativeFractions(origin, ref_SD, ref_DD, ref_ND, error_SD, error_DD, error_ND); Printf("Using x-sections:\n SD: %f +- %f\n DD: %f +- %f\n ND: %f +- %f", ref_SD, error_SD, ref_DD, error_DD, ref_ND, error_ND); //Karel (UA5): // fsd = 0.153 +- 0.031 // fdd = 0.080 +- 0.050 // fnd = 0.767 +- 0.059 // Karel (1.8 TeV): // // Tel-Aviv model Sd/Inel = 0.171 Dd/Inel = 0.094 // Durham model Sd/Inel = 0.190 Dd/Inel = 0.125 // Data Sd/Inel = 0.152 +- 0.030 Dd/Inel = 0.092 +- 0.45 // standard correction TFile::Open(correctionFileName); AlidNdEtaCorrection* correctionStandard = new AlidNdEtaCorrection("dndeta_correction","dndeta_correction"); correctionStandard->LoadHistograms(); // dont take vertexreco from this one correctionStandard->GetVertexRecoCorrection()->Reset(); // dont take triggerbias from this one correctionStandard->GetTriggerBiasCorrectionINEL()->Reset(); correctionStandard->GetTriggerBiasCorrectionNSD()->Reset(); correctionStandard->GetTriggerBiasCorrectionND()->Reset(); correctionStandard->GetTriggerBiasCorrectionOnePart()->Reset(); AlidNdEtaCorrection* corrections[100]; TH1F* hRatios[100]; Int_t counter = 0; TFile::Open(correctionFileName); AlidNdEtaCorrection* current = new AlidNdEtaCorrection("dndeta_correction_ua5", "dndeta_correction_ua5"); current->LoadHistograms("dndeta_correction"); current->Reset(); TString name; name.Form("dndeta_correction_ND"); AlidNdEtaCorrection* dNdEtaCorrectionND = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionND->LoadHistograms(); name.Form("dndeta_correction_DD"); AlidNdEtaCorrection* dNdEtaCorrectionDD = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionDD->LoadHistograms(); name.Form("dndeta_correction_SD"); AlidNdEtaCorrection* dNdEtaCorrectionSD = new AlidNdEtaCorrection(name,name); dNdEtaCorrectionSD->LoadHistograms(); // calculating relative Float_t nd = dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t dd = dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t sd = dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral(); Float_t total = nd + dd + sd; nd /= total; sd /= total; dd /= total; Printf("Ratios in the correction map are: ND=%f, DD=%f, SD=%f", nd, dd, sd); Float_t scaleND = ref_ND / nd; Float_t scaleDD = ref_DD / dd; Float_t scaleSD = ref_SD / sd; Printf("ND=%.2f, DD=%.2f, SD=%.2f",scaleND, scaleDD, scaleSD); // scale dNdEtaCorrectionND->GetVertexRecoCorrection()->Scale(scaleND); dNdEtaCorrectionDD->GetVertexRecoCorrection()->Scale(scaleDD); dNdEtaCorrectionSD->GetVertexRecoCorrection()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionNSD()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionNSD()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionNSD()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionND()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionND()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionND()->Scale(scaleSD); dNdEtaCorrectionND->GetTriggerBiasCorrectionOnePart()->Scale(scaleND); dNdEtaCorrectionDD->GetTriggerBiasCorrectionOnePart()->Scale(scaleDD); dNdEtaCorrectionSD->GetTriggerBiasCorrectionOnePart()->Scale(scaleSD); //clear track in correction dNdEtaCorrectionND->GetTrack2ParticleCorrection()->Reset(); dNdEtaCorrectionDD->GetTrack2ParticleCorrection()->Reset(); dNdEtaCorrectionSD->GetTrack2ParticleCorrection()->Reset(); TList collection; collection.Add(correctionStandard); collection.Add(dNdEtaCorrectionND); collection.Add(dNdEtaCorrectionDD); collection.Add(dNdEtaCorrectionSD); current->Merge(&collection); current->Finish(); // print 0 bin efficiency TH1* hist2 = current->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->Get1DCorrection("y", -10, 10); if (hist2->GetBinContent(1) > 0) { Float_t triggerEff = 100.0 / hist2->GetBinContent(1); Printf("trigger eff in 0 bin is: %.2f %%", triggerEff); } TFile* fout = new TFile(outputFileName,"RECREATE"); current->SaveHistograms(); fout->Write(); fout->Close(); Printf("Trigger efficiencies:"); Printf("ND: %.2f %%", 100.0 * dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral() / dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral()); Printf("SD: %.2f %%", 100.0 * dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral() / dNdEtaCorrectionSD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral()); Printf("DD: %.2f %%", 100.0 * dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral() / dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral()); Printf("INEL: %.2f %%", 100.0 * current->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral() / current->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral()); Printf("NSD: %.2f %%", 100.0 * (dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral() + dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetMeasuredHistogram()->Integral()) / (dNdEtaCorrectionND->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral() + dNdEtaCorrectionDD->GetTriggerBiasCorrectionINEL()->GetEventCorrection()->GetGeneratedHistogram()->Integral())); } DrawTriggerEfficiency(Char_t* fileName) { gStyle->SetOptStat(0); gStyle->SetOptTitle(0); gStyle->SetOptFit(0); gStyle->SetTextSize(0.04); gStyle->SetTitleSize(0.05,"xyz"); //gStyle->SetTitleFont(133, "xyz"); //gStyle->SetLabelFont(133, "xyz"); //gStyle->SetLabelSize(17, "xyz"); gStyle->SetLabelOffset(0.01, "xyz"); gStyle->SetTitleOffset(1.1, "y"); gStyle->SetTitleOffset(1.1, "x"); gStyle->SetEndErrorSize(0.0); //############################################## //making canvas and pads TCanvas *c = new TCanvas("trigger_eff", "",600,500); TPad* p1 = new TPad("pad1","", 0, 0.0, 1.0, 1.0, 0, 0, 0); p1->SetBottomMargin(0.15); p1->SetTopMargin(0.03); p1->SetLeftMargin(0.15); p1->SetRightMargin(0.03); p1->SetGridx(); p1->SetGridy(); p1->Draw(); p1->cd(); gSystem->Load("libPWG0base"); AlidNdEtaCorrection* corrections[4]; AliCorrectionMatrix2D* triggerBiasCorrection[4]; TH1F* hTriggerEffInv[4]; TH1F* hTriggerEff[4]; Char_t* names[] = {"triggerBiasND", "triggerBiasDD", "triggerBiasSD", "triggerBiasINEL"}; for (Int_t i=0; i<4; i++) { corrections[i] = new AlidNdEtaCorrection(names[i], names[i]); corrections[i]->LoadHistograms(fileName, names[i]); triggerBiasCorrection[i] = corrections[i]->GetTriggerBiasCorrectionINEL(); hTriggerEffInv[i] = triggerBiasCorrection[i]->Get1DCorrection(); hTriggerEff[i] = (TH1F*)hTriggerEffInv[i]->Clone(); for (Int_t b=0; b<=hTriggerEff[i]->GetNbinsX(); b++) { hTriggerEff[i]->SetBinContent(b,1); hTriggerEff[i]->SetBinError(b,0); } hTriggerEff[i]->Divide(hTriggerEff[i],hTriggerEffInv[i]); hTriggerEff[i]->Scale(100); } Int_t colors[] = {2,3,4,1}; Float_t effs[4]; for (Int_t i=0; i<4; i++) { hTriggerEff[i]->Fit("pol0","","",-20,20); effs[i] = ((TF1*)hTriggerEff[i]->GetListOfFunctions()->At(0))->GetParameter(0); ((TF1*)hTriggerEff[i]->GetListOfFunctions()->At(0))->SetLineWidth(1); ((TF1*)hTriggerEff[i]->GetListOfFunctions()->At(0))->SetLineStyle(2); ((TF1*)hTriggerEff[i]->GetListOfFunctions()->At(0))->SetLineColor(colors[i]); cout << effs[i] << endl; } Char_t* text[] = {"ND", "DD", "SD", "INEL"}; TLatex* latex[4]; TH2F* null = new TH2F("","",100,-25,35,100,0,110); null->SetXTitle("Vertex z [cm]"); null->GetXaxis()->CenterTitle(kTRUE); null->SetYTitle("Trigger efficiency [%]"); null->GetYaxis()->CenterTitle(kTRUE); null->Draw(); for (Int_t i=0; i<4; i++) { hTriggerEff[i]->SetLineWidth(2); hTriggerEff[i]->SetLineColor(colors[i]); hTriggerEff[i]->Draw("same"); latex[i] = new TLatex(22,effs[i]-1.5, Form("%s (%0.1f)",text[i],effs[i])); latex[i]->SetTextColor(colors[i]); latex[i]->Draw(); } } DrawSpectraPID(Char_t* fileName) { gSystem->Load("libPWG0base"); Char_t* names[] = {"correction_0", "correction_1", "correction_2", "correction_3"}; AlidNdEtaCorrection* corrections[4]; AliCorrectionMatrix3D* trackToPartCorrection[4]; TH1F* measuredPt[4]; TH1F* generatedPt[4]; TH1F* ratioPt[4]; for (Int_t i=0; i<4; i++) { corrections[i] = new AlidNdEtaCorrection(names[i], names[i]); corrections[i]->LoadHistograms(fileName, names[i]); trackToPartCorrection[i] = corrections[i]->GetTrack2ParticleCorrection(); Int_t binX1 = (TH1F*)trackToPartCorrection[i]->GetMeasuredHistogram()->GetXaxis()->FindBin(-10); Int_t binX2 = (TH1F*)trackToPartCorrection[i]->GetMeasuredHistogram()->GetXaxis()->FindBin(10); Int_t binY1 = (TH1F*)trackToPartCorrection[i]->GetMeasuredHistogram()->GetYaxis()->FindBin(-1); Int_t binY2 = (TH1F*)trackToPartCorrection[i]->GetMeasuredHistogram()->GetYaxis()->FindBin(1); measuredPt[i] = (TH1F*)trackToPartCorrection[i]->GetMeasuredHistogram()->ProjectionZ(Form("m_%d",i),binX1,binX2,binY1,binY2); generatedPt[i] = (TH1F*)trackToPartCorrection[i]->GetGeneratedHistogram()->ProjectionZ(Form("g_%d",i),binX1,binX2,binY1,binY2); ratioPt[i] = (TH1F*)generatedPt[i]->Clone(Form("r_%d",i)); ratioPt[i]->Divide(measuredPt[i], generatedPt[i], 1,1,"B"); } ratioPt[0]->Draw(); for (Int_t i=0; i<3; i++) { ratioPt[i]->SetLineColor(i+1); ratioPt[i]->SetLineWidth(2); ratioPt[i]->Draw("same"); } return; measuredPt[0]->SetLineColor(2); measuredPt[0]->SetLineWidth(5); measuredPt[0]->Draw(); generatedPt[0]->Draw("same"); } void changePtSpectrum(const char* fileName = "analysis_mc.root", Float_t ptCutOff = 0.2, const char* fileName2 = 0) { Float_t factor = 0.5; TFile* file = TFile::Open(fileName); TH1F* hist = dynamic_cast<TH1F*> (file->Get("dndeta_check_pt")->Clone()); TH1* hist2 = 0; if (fileName2) { file2 = TFile::Open(fileName2); hist2 = dynamic_cast<TH1*> (file2->Get("dndeta_check_pt")->Clone()); hist2->Scale(hist->GetBinContent(hist->FindBin(ptCutOff)) / hist2->GetBinContent(hist2->FindBin(ptCutOff))); } //hist->Scale(1.0 / hist->Integral()); //hist->Rebin(3); //hist->Scale(1.0/3); TH1F* clone1 = dynamic_cast<TH1F*> (hist->Clone("clone1")); TH1F* clone2 = dynamic_cast<TH1F*> (hist->Clone("clone2")); TH1F* scale1 = dynamic_cast<TH1F*> (hist->Clone("scale1")); TH1F* scale2 = dynamic_cast<TH1F*> (hist->Clone("scale2")); for (Int_t i=1; i <= hist->GetNbinsX(); ++i) { if (hist->GetBinCenter(i) > ptCutOff) { scale1->SetBinContent(i, 1); scale2->SetBinContent(i, 1); } else { // 90 % at pt = 0, 0% at pt = ptcutoff scale1->SetBinContent(i, 1 - (ptCutOff - hist->GetBinCenter(i)) / ptCutOff * factor); // 110% at pt = 0, ... scale2->SetBinContent(i, 1 + (ptCutOff - hist->GetBinCenter(i)) / ptCutOff * factor); } scale1->SetBinError(i, 0); scale2->SetBinError(i, 0); } /* new TCanvas; scale1->Draw(); scale2->SetLineColor(kRed); scale2->Draw("SAME"); */ clone1->Multiply(scale1); clone2->Multiply(scale2); Prepare1DPlot(hist); Prepare1DPlot(clone1); Prepare1DPlot(clone2); /*hist->SetMarkerStyle(markers[0]); clone1->SetMarkerStyle(markers[0]); clone2->SetMarkerStyle(markers[0]);*/ hist->SetTitle(";p_{T} in GeV/c;dN_{ch}/dp_{T} in c/GeV"); hist->GetXaxis()->SetRangeUser(0, 0.5); hist->GetYaxis()->SetRangeUser(0.01, clone2->GetMaximum() * 1.1); hist->GetYaxis()->SetTitleOffset(1); TCanvas* canvas = new TCanvas("c", "c", 600, 600); gPad->SetGridx(); gPad->SetGridy(); gPad->SetTopMargin(0.05); gPad->SetRightMargin(0.05); gPad->SetBottomMargin(0.12); hist->Draw("H"); clone1->SetLineColor(kRed); clone1->Draw("HSAME"); clone2->SetLineColor(kBlue); clone2->Draw("HSAME"); hist->Draw("HSAME"); if (hist2) { Prepare1DPlot(hist2); hist2->SetLineStyle(2); hist2->Draw("HSAME"); } Float_t fraction = hist->Integral(hist->GetXaxis()->FindBin(ptCutOff), hist->GetNbinsX()) / hist->Integral(1, hist->GetNbinsX()); Float_t fraction1 = clone1->Integral(clone1->GetXaxis()->FindBin(ptCutOff), clone1->GetNbinsX()) / clone1->Integral(1, clone1->GetNbinsX()); Float_t fraction2 = clone2->Integral(clone2->GetXaxis()->FindBin(ptCutOff), clone2->GetNbinsX()) / clone2->Integral(1, clone2->GetNbinsX()); printf("%f %f %f\n", fraction, fraction1, fraction2); printf("Rel. %f %f\n", fraction1 / fraction, fraction2 / fraction); //canvas->SaveAs("changePtSpectrum.gif"); canvas->SaveAs("changePtSpectrum.eps"); } void FractionBelowPt() { gSystem->Load("libPWG0base"); AlidNdEtaCorrection* fdNdEtaCorrection[4]; TFile::Open("systematics.root"); for (Int_t i=0; i<4; ++i) { TString name; name.Form("correction_%d", i); fdNdEtaCorrection[i] = new AlidNdEtaCorrection(name, name); fdNdEtaCorrection[i]->LoadHistograms("systematics.root", name); } Double_t geneCount[5]; Double_t measCount[5]; geneCount[4] = 0; measCount[4] = 0; for (Int_t i=0; i<4; ++i) { TH3F* hist = (TH3F*) fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetGeneratedHistogram(); geneCount[i] = hist->Integral(hist->GetXaxis()->FindBin(-10), hist->GetXaxis()->FindBin(10), hist->GetYaxis()->FindBin(-0.8), hist->GetYaxis()->FindBin(0.8), 1, hist->GetZaxis()->FindBin(0.3)); hist = (TH3F*) fdNdEtaCorrection[i]->GetTrack2ParticleCorrection()->GetMeasuredHistogram(); measCount[i] = hist->Integral(hist->GetXaxis()->FindBin(-10), hist->GetXaxis()->FindBin(10), hist->GetYaxis()->FindBin(-0.8), hist->GetYaxis()->FindBin(0.8), 1, hist->GetZaxis()->FindBin(0.3)); geneCount[4] += geneCount[i]; measCount[4] += measCount[i]; printf("Particle %s: %d gene, %d meas\n", ((i == 0) ? "pi" : (i == 1) ? "K" : (i == 2) ? "p" : "others"), (Int_t) geneCount[i], (Int_t) measCount[i]); } printf("Generated ratios are: %f pi, %f K, %f p, %f others\n", geneCount[0] / geneCount[4], geneCount[1] / geneCount[4], geneCount[2] / geneCount[4], geneCount[3] / geneCount[4]); printf("Reconstructed ratios are: %f pi, %f K, %f p, %f others\n", measCount[0] / measCount[4], measCount[1] / measCount[4], measCount[2] / measCount[4], measCount[3] / measCount[4]); } mergeCorrectionsMisalignment(Char_t* alignedFile = "correction_map_aligned.root", Char_t* misalignedFile = "correction_map_misaligned.root", Char_t* outputFileName="correction_map_misaligned_single.root") { // // from the aligned and misaligned corrections, 3 new corrections are created // in these new corrections only one of the corrections (track2particle, vertex, trigger) // is taken from the misaligned input to allow study of the effect on the different // corrections gSystem->Load("libPWG0base"); const Char_t* typeName[] = { "track2particle", "vertex", "trigger" }; AlidNdEtaCorrection* corrections[3]; for (Int_t j=0; j<3; j++) { // j = 0 (track2particle), j = 1 (vertex), j = 2 (trigger) AlidNdEtaCorrection* alignedCorrection = new AlidNdEtaCorrection("dndeta_correction","dndeta_correction"); alignedCorrection->LoadHistograms(alignedFile); AlidNdEtaCorrection* misalignedCorrection = new AlidNdEtaCorrection("dndeta_correction","dndeta_correction"); misalignedCorrection->LoadHistograms(misalignedFile); TString name; name.Form("dndeta_correction_alignment_%s", typeName[j]); AlidNdEtaCorrection* current = new AlidNdEtaCorrection(name, name); switch (j) { case 0: alignedCorrection->GetTrack2ParticleCorrection()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionNSD()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionND()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionINEL()->Reset(); misalignedCorrection->GetVertexRecoCorrection()->Reset(); break; case 1: misalignedCorrection->GetTrack2ParticleCorrection()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionNSD()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionND()->Reset(); misalignedCorrection->GetTriggerBiasCorrectionINEL()->Reset(); alignedCorrection->GetVertexRecoCorrection()->Reset(); break; case 2: misalignedCorrection->GetTrack2ParticleCorrection()->Reset(); alignedCorrection->GetTriggerBiasCorrectionNSD()->Reset(); alignedCorrection->GetTriggerBiasCorrectionND()->Reset(); alignedCorrection->GetTriggerBiasCorrectionINEL()->Reset(); misalignedCorrection->GetVertexRecoCorrection()->Reset(); break; default: return; } TList collection; collection.Add(misalignedCorrection); collection.Add(alignedCorrection); current->Merge(&collection); current->Finish(); corrections[j] = current; } TFile* fout = new TFile(outputFileName, "RECREATE"); for (Int_t i=0; i<3; i++) corrections[i]->SaveHistograms(); fout->Write(); fout->Close(); } void DrawdNdEtaDifferencesAlignment() { TH1* hists[5]; TLegend* legend = new TLegend(0.3, 0.73, 0.70, 0.98); legend->SetFillColor(0); TCanvas* canvas = new TCanvas("DrawdNdEtaDifferences", "DrawdNdEtaDifferences", 1000, 500); canvas->Divide(2, 1); canvas->cd(1); for (Int_t i=0; i<5; ++i) { hists[i] = 0; TFile* file = 0; TString title; switch(i) { case 0 : file = TFile::Open("systematics_misalignment_aligned.root"); title = "aligned"; break; case 1 : file = TFile::Open("systematics_misalignment_misaligned.root"); title = "fully misaligned"; break; case 2 : file = TFile::Open("systematics_misalignment_track2particle.root"); title = "only track2particle"; break; case 3 : file = TFile::Open("systematics_misalignment_vertex.root"); title = "only vertex rec."; break; case 4 : file = TFile::Open("systematics_misalignment_trigger.root"); title = "only trigger bias"; break; default: return; } if (file) { hists[i] = (TH1*) file->Get("dndeta/dndeta_dNdEta_corrected_2"); hists[i]->SetTitle(""); Prepare1DPlot(hists[i], kFALSE); hists[i]->GetXaxis()->SetRangeUser(-0.7999, 0.7999); hists[i]->GetYaxis()->SetRangeUser(6, 7); hists[i]->SetLineWidth(1); hists[i]->SetLineColor(colors[i]); hists[i]->SetMarkerColor(colors[i]); hists[i]->SetMarkerStyle(markers[i]); hists[i]->GetXaxis()->SetLabelOffset(0.015); hists[i]->GetYaxis()->SetTitleOffset(1.5); gPad->SetLeftMargin(0.12); hists[i]->DrawCopy(((i > 0) ? "SAME" : "")); legend->AddEntry(hists[i], title); hists[i]->SetTitle(title); } } legend->Draw(); canvas->cd(2); gPad->SetLeftMargin(0.14); TLegend* legend2 = new TLegend(0.63, 0.73, 0.98, 0.98); legend2->SetFillColor(0); for (Int_t i=1; i<5; ++i) { if (hists[i]) { legend2->AddEntry(hists[i]); hists[i]->Divide(hists[0]); hists[i]->SetTitle("b)"); hists[i]->GetYaxis()->SetRangeUser(0.9, 1.1); hists[i]->GetYaxis()->SetTitle("Ratio to standard composition"); hists[i]->GetYaxis()->SetTitleOffset(1.8); hists[i]->DrawCopy(((i > 1) ? "SAME" : "")); } } legend2->Draw(); canvas->SaveAs("misalignment_result.eps"); canvas->SaveAs("misalignment_result.gif"); } void EvaluateMultiplicityEffect() { gSystem->Load("libPWG0base"); AlidNdEtaCorrection* fdNdEtaCorrectionLow[4]; AlidNdEtaCorrection* fdNdEtaCorrectionHigh[4]; TFile::Open("systematics-low-multiplicity.root"); for (Int_t i=0; i<4; ++i) { TString name; name.Form("correction_%d", i); fdNdEtaCorrectionLow[i] = new AlidNdEtaCorrection(name, name); fdNdEtaCorrectionLow[i]->LoadHistograms("systematics-low-multiplicity.root", name); } TList list; for (Int_t i=1; i<4; ++i) list.Add(fdNdEtaCorrectionLow[i]); fdNdEtaCorrectionLow[0]->Merge(&list); fdNdEtaCorrectionLow[0]->Finish(); TFile::Open("systematics-high-multiplicity.root"); for (Int_t i=0; i<4; ++i) { TString name; name.Form("correction_%d", i); fdNdEtaCorrectionHigh[i] = new AlidNdEtaCorrection(name, name); fdNdEtaCorrectionHigh[i]->LoadHistograms("systematics-high-multiplicity.root", name); } TList list2; for (Int_t i=1; i<4; ++i) list2.Add(fdNdEtaCorrectionHigh[i]); fdNdEtaCorrectionHigh[0]->Merge(&list2); fdNdEtaCorrectionHigh[0]->Finish(); TH1F* outputLow = new TH1F("Track2ParticleLow", "Track2Particle at low multiplicity", 200, 0, 2); TH1F* outputHigh = new TH1F("Track2ParticleHigh", "Track2Particle at high multiplicity", 200, 0, 2); TH3F* hist = fdNdEtaCorrectionLow[0]->GetTrack2ParticleCorrection()->GetCorrectionHistogram(); TH3F* hist2 = fdNdEtaCorrectionHigh[0]->GetTrack2ParticleCorrection()->GetCorrectionHistogram(); for (Int_t x=hist->GetXaxis()->FindBin(-10); x<=hist->GetXaxis()->FindBin(10); ++x) for (Int_t y=hist->GetYaxis()->FindBin(-0.8); y<=hist->GetYaxis()->FindBin(0.8); ++y) for (Int_t z=hist->GetZaxis()->FindBin(0.3); z<=hist->GetZaxis()->FindBin(9.9); ++z) //for (Int_t z=1; z<=hist->GetNbinsZ(); ++z) { if (hist->GetBinContent(x, y, z) > 0) outputLow->Fill(hist->GetBinContent(x, y, z)); //if (hist->GetBinContent(x, y, z) == 1) // printf("z = %f, eta = %f, pt = %f: %f %f %f\n", hist->GetXaxis()->GetBinCenter(x), hist->GetYaxis()->GetBinCenter(y), hist->GetZaxis()->GetBinCenter(z), hist->GetBinContent(x, y, z), fdNdEtaCorrectionLow[0]->GetTrack2ParticleCorrection()->GetGeneratedHistogram()->GetBinContent(x, y, z), fdNdEtaCorrectionLow[0]->GetTrack2ParticleCorrection()->GetMeasuredHistogram()->GetBinContent(x, y, z)); if (hist2->GetBinContent(x, y, z) > 0) outputHigh->Fill(hist2->GetBinContent(x, y, z)); } TCanvas* canvas = new TCanvas("EvaluateMultiplicityEffect", "EvaluateMultiplicityEffect", 1000, 500); canvas->Divide(2, 1); canvas->cd(1); outputLow->Draw(); outputLow->Fit("gaus", "0"); outputLow->GetFunction("gaus")->SetLineColor(2); outputLow->GetFunction("gaus")->DrawCopy("SAME"); canvas->cd(2); outputHigh->Draw(); outputHigh->Fit("gaus", "0"); outputHigh->GetFunction("gaus")->DrawCopy("SAME"); canvas->SaveAs(Form("%s.gif", canvas->GetName())); } void PlotErrors(Float_t xmin, Float_t xmax, Float_t ymin, Float_t ymax, Float_t zmin, Float_t zmax, const char* correctionMapFile = "correction_map.root", const char* correctionMapFolder = "dndeta_correction") { gSystem->Load("libPWG0base"); AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(correctionMapFolder, correctionMapFolder); dNdEtaCorrection->LoadHistograms(correctionMapFile, correctionMapFolder); dNdEtaCorrection->GetTrack2ParticleCorrection()->PlotBinErrors(xmin, xmax, ymin, ymax, zmin, zmax)->Draw(); } void runStudy(const char* baseCorrectionMapFile = "correction_map.root", const char* baseCorrectionMapFolder = "dndeta_correction", const char* changedCorrectionMapFile = "correction_map.root", const char* changedCorrectionMapFolder = "dndeta_correction", const char* dataFile = "analysis_esd_raw.root", const char* output = "analysis_esd_syst.root") { gSystem->Load("libPWG0base"); TFile* file = TFile::Open(output, "RECREATE"); const Int_t max = 5; dNdEtaAnalysis* fdNdEtaAnalysis[5]; new TCanvas; TLegend* legend = new TLegend(0.63, 0.73, 0.98, 0.98); legend->SetFillColor(0); for (Int_t i = 0; i < max; ++i) { TFile::Open(baseCorrectionMapFile); AlidNdEtaCorrection* baseCorrection = new AlidNdEtaCorrection(baseCorrectionMapFolder, baseCorrectionMapFolder); baseCorrection->LoadHistograms(); AlidNdEtaCorrection::CorrectionType correctionType = AlidNdEtaCorrection::kNone; const char* name = 0; TFile::Open(changedCorrectionMapFile); switch (i) { case 0 : name = "default"; break; case 1 : baseCorrection->GetTrack2ParticleCorrection()->LoadHistograms(Form("%s/Track2Particle", changedCorrectionMapFolder)); name = "Track2Particle"; break; case 2 : baseCorrection->GetVertexRecoCorrection()->LoadHistograms(Form("%s/VertexReconstruction", changedCorrectionMapFolder)); name = "VertexReco"; break; case 3 : baseCorrection->GetTriggerBiasCorrectionINEL()->LoadHistograms(Form("%s/TriggerBias_MBToINEL", changedCorrectionMapFolder)); name = "TriggerBias_MBToINEL"; break; case 4 : baseCorrection->LoadHistograms(changedCorrectionMapFolder); name = "all"; break; default: return; } TFile::Open(dataFile); fdNdEtaAnalysis[i] = new dNdEtaAnalysis(name, name); fdNdEtaAnalysis[i]->LoadHistograms("dndeta"); fdNdEtaAnalysis[i]->Finish(baseCorrection, 0.3, AlidNdEtaCorrection::kINEL); file->cd(); fdNdEtaAnalysis[i]->SaveHistograms(); TH1* hist = fdNdEtaAnalysis[i]->GetdNdEtaHistogram(0); hist->SetLineColor(colors[i]); hist->SetMarkerColor(colors[i]); hist->SetMarkerStyle(markers[i]+1); hist->DrawCopy((i == 0) ? "" : "SAME"); legend->AddEntry(hist, name); } legend->Draw(); } void ChangePtInCorrection(const char* fileName = "correction_map.root", const char* dirName = "dndeta_correction") { loadlibs(); if (!TFile::Open(fileName)) return; AlidNdEtaCorrection* dNdEtaCorrection = new AlidNdEtaCorrection(dirName, dirName); if (!dNdEtaCorrection->LoadHistograms()) return; dNdEtaCorrection->Finish(); AliCorrection* corr = dNdEtaCorrection->GetCorrection(AlidNdEtaCorrection::kTrack2Particle); Printf(">>>> Before"); corr->PrintInfo(0); Float_t factor = 0.5; Float_t ptCutOff = 0.2; TH3* gene = corr->GetTrackCorrection()->GetGeneratedHistogram(); TH3* meas = corr->GetTrackCorrection()->GetMeasuredHistogram(); for (Int_t z = 1; z <= gene->GetZaxis()->FindBin(ptCutOff - 0.01); z++) { Float_t localFactor = 1 - (ptCutOff - gene->GetZaxis()->GetBinCenter(z)) / ptCutOff * factor; Printf("%f %f", gene->GetZaxis()->GetBinCenter(z), localFactor); for (Int_t x = 1; x <= gene->GetNbinsX(); x++) for (Int_t y = 1; y <= gene->GetNbinsY(); y++) { gene->SetBinContent(x, y, z, gene->GetBinContent(x, y, z) * localFactor); meas->SetBinContent(x, y, z, meas->GetBinContent(x, y, z) * localFactor); } } dNdEtaCorrection->Finish(); Printf(">>>> After"); corr->PrintInfo(0); } Float_t FitAverage(TH1* hist, Int_t n, Float_t* begin, Float_t *end, Int_t color, Int_t& totalBins) { Float_t average = 0; totalBins = 0; for (Int_t i=0; i<n; i++) { func = new TF1("func", "[0]", hist->GetXaxis()->GetBinLowEdge(hist->GetXaxis()->FindBin(begin[i])), hist->GetXaxis()->GetBinUpEdge(hist->GetXaxis()->FindBin(end[i]))); Int_t bins = hist->GetXaxis()->FindBin(end[i]) - hist->GetXaxis()->FindBin(begin[i]) + 1; func->SetParameter(0, 1); func->SetLineColor(color); hist->Fit(func, "RNQ"); func->Draw("SAME"); average += func->GetParameter(0) * bins; totalBins += bins; } return average / totalBins; } void SPDIntegrateGaps(Bool_t all, const char* mcFile = "../../../LHC10b2/v0or/spd/analysis_esd_raw.root") { Float_t eta = 1.29; Int_t binBegin = ((TH2*) gFile->Get("fEtaPhi"))->GetXaxis()->FindBin(-eta); Int_t binEnd = ((TH2*) gFile->Get("fEtaPhi"))->GetXaxis()->FindBin(eta); Printf("eta range: %f bins: %d %d", eta, binBegin, binEnd); if (!all) Printf("Eta smaller than 0 side"); c = new TCanvas; TFile::Open("analysis_esd_raw.root"); hist = ((TH2*) gFile->Get("fEtaPhi"))->ProjectionY("hist", binBegin, (all) ? binEnd : 40); hist->Rebin(2); hist->SetStats(0); hist->Sumw2(); hist->Draw("HIST"); gPad->SetGridx(); gPad->SetGridy(); TFile::Open(mcFile); mcHist = ((TH2*) gFile->Get("fEtaPhi"))->ProjectionY("mcHist", binBegin, (all) ? binEnd : 40); mcHist->Rebin(2); mcHist->SetLineColor(2); mcHist->Scale(hist->Integral() / mcHist->Integral()); mcHist->Draw("SAME"); Float_t add = 0; Int_t bins; Float_t okRangeBegin[] = { 0.04, 0.67, 1.34 }; Float_t okRangeEnd[] = { 0.55, 1.24, 1.63 }; Float_t gapRangeBegin[] = { 0.6, 1.27 }; Float_t gapRangeEnd[] = { 0.65, 1.32 }; Float_t averageOK = FitAverage(hist, 3, okRangeBegin, okRangeEnd, 1, bins); Float_t averageGap = FitAverage(hist, 2, gapRangeBegin, gapRangeEnd, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin2[] = { 2.4, 2.65 }; Float_t okRangeEnd2[] = { 2.55, 3.2 }; Float_t gapRangeBegin2[] = { 2.59, 3.3 }; Float_t gapRangeEnd2[] = { 2.61, 3.3 }; averageOK = FitAverage(hist, 2, okRangeBegin2, okRangeEnd2, 1, bins); averageGap = FitAverage(hist, 2, gapRangeBegin2, gapRangeEnd2, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin3[] = { 3.55, 3.9 }; Float_t okRangeEnd3[] = { 3.8, 4.15 }; Float_t gapRangeBegin3[] = { 3.83 }; Float_t gapRangeEnd3[] = { 3.86 }; averageOK = FitAverage(hist, 2, okRangeBegin3, okRangeEnd3, 1, bins); averageGap = FitAverage(hist, 1, gapRangeBegin3, gapRangeEnd3, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin4[] = { 4.2, 4.5 }; Float_t okRangeEnd4[] = { 4.4, 4.7 }; Float_t gapRangeBegin4[] = { 4.45 }; Float_t gapRangeEnd4[] = { 4.45 }; averageOK = FitAverage(hist, 2, okRangeBegin4, okRangeEnd4, 1, bins); averageGap = FitAverage(hist, 1, gapRangeBegin4, gapRangeEnd4, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin5[] = { 5.4, 5.7 }; Float_t okRangeEnd5[] = { 5.6, 5.8 }; Float_t gapRangeBegin5[] = { 5.63 }; Float_t gapRangeEnd5[] = { 5.67 }; averageOK = FitAverage(hist, 2, okRangeBegin5, okRangeEnd5, 1, bins); averageGap = FitAverage(hist, 1, gapRangeBegin5, gapRangeEnd5, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Printf("This adds %.2f %% to the total number of tracklets (%f)", 100.0 * add / hist->Integral(), hist->Integral()); c->SaveAs("gap1.png"); add1 = add; total1 = hist->Integral(); if (all) return; Printf("\nEta larger than 0 side"); c = new TCanvas; TFile::Open("analysis_esd_raw.root"); hist = ((TH2*) gFile->Get("fEtaPhi"))->ProjectionY("hist2", 41, binEnd); hist->Rebin(2); hist->SetStats(0); hist->Sumw2(); hist->Draw("HIST"); gPad->SetGridx(); gPad->SetGridy(); TFile::Open(mcFile); mcHist = ((TH2*) gFile->Get("fEtaPhi"))->ProjectionY("mcHist", 41, binEnd); mcHist->Rebin(2); mcHist->SetLineColor(2); mcHist->Scale(hist->Integral() / mcHist->Integral()); mcHist->Draw("SAME"); add = 0; Float_t okRangeBegin[] = { 0.04, 0.67, 1.34 }; Float_t okRangeEnd[] = { 0.55, 1.24, 1.63 }; Float_t gapRangeBegin[] = { 0.6, 1.27 }; Float_t gapRangeEnd[] = { 0.65, 1.32 }; Float_t averageOK = FitAverage(hist, 3, okRangeBegin, okRangeEnd, 1, bins); Float_t averageGap = FitAverage(hist, 2, gapRangeBegin, gapRangeEnd, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin2[] = { 2.32, 2.65 }; Float_t okRangeEnd2[] = { 2.55, 3.2 }; Float_t gapRangeBegin2[] = { 2.59, 3.3 }; Float_t gapRangeEnd2[] = { 2.61, 3.3 }; averageOK = FitAverage(hist, 2, okRangeBegin2, okRangeEnd2, 1, bins); averageGap = FitAverage(hist, 2, gapRangeBegin2, gapRangeEnd2, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin3[] = { 3.55, 3.9 }; Float_t okRangeEnd3[] = { 3.8, 4.15 }; Float_t gapRangeBegin3[] = { 3.83 }; Float_t gapRangeEnd3[] = { 3.86 }; averageOK = FitAverage(hist, 2, okRangeBegin3, okRangeEnd3, 1, bins); averageGap = FitAverage(hist, 1, gapRangeBegin3, gapRangeEnd3, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Float_t okRangeBegin4[] = { 4.2, 4.5 }; Float_t okRangeEnd4[] = { 4.4, 4.7 }; Float_t gapRangeBegin4[] = { 4.45 }; Float_t gapRangeEnd4[] = { 4.45 }; averageOK = FitAverage(hist, 2, okRangeBegin4, okRangeEnd4, 1, bins); averageGap = FitAverage(hist, 1, gapRangeBegin4, gapRangeEnd4, 2, bins); add += bins * (averageOK - averageGap); Printf("Average OK: %f %f %d: %f", averageOK, averageGap, bins, add); Printf("This adds %.2f %% to the total number of tracklets (%f)", 100.0 * add / hist->Integral(), hist->Integral()); c->SaveAs("gap2.png"); Printf("In total we add %.2f %%.", 100.0 * (add1 + add) / (total1 + hist->Integral())); }