{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Introduction\n", "\n", "QA plots for the generic vetex finding and DCA performance" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:34.930659Z", "iopub.status.busy": "2025-03-29T01:47:34.930280Z", "iopub.status.idle": "2025-03-29T01:47:34.936762Z", "shell.execute_reply": "2025-03-29T01:47:34.935615Z" } }, "outputs": [], "source": [ "# imports to write dynamic markdown contents\n", "import os\n", "from IPython.display import display, Markdown, Latex\n", "from IPython.display import HTML" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:34.940866Z", "iopub.status.busy": "2025-03-29T01:47:34.940445Z", "iopub.status.idle": "2025-03-29T01:47:34.954419Z", "shell.execute_reply": "2025-03-29T01:47:34.953385Z" } }, "outputs": [ { "data": { "text/markdown": [ "*For the result HTML page:* " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# turn off/on code for the result HTML page\n", "\n", "display(Markdown('*For the result HTML page:* '))\n", " \n", "HTML('''\n", "
''')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:34.995898Z", "iopub.status.busy": "2025-03-29T01:47:34.995442Z", "iopub.status.idle": "2025-03-29T01:47:35.003094Z", "shell.execute_reply": "2025-03-29T01:47:35.002276Z" } }, "outputs": [ { "data": { "text/markdown": [ "[//]: # (This section starts with a 2nd level heading and get embedded in the result QA report at https://github.com/sPHENIX-Collaboration/QA-gallery/tree/QA-tracking-pythiajet)\n", "\n", "## Tracking QA with high pT Pythia events\n", "\n", "PYTHIA high $p_T$ tracking QA consists full tracker + reconstruction of events with the default Pythia configuration file. This cfg file has a single hard QCD ccbar event with minimum partonic $p_T$ of 10 GeV and truth jet triggering of $p_T>20$ GeV. \n", "\n", "Last a D0->piK filter is applied so the same sample canbe used in D0 reco validation. Please note the calorimeters are disabled to improve execution speed, which also removed some of the correlated albedo background for the tracker. \n", "\n", "In addition to the Pythia event, an Upsilon is embedded to probe an agregated tracking resolution. \n", "\n", "The source code of the macro can be found at https://github.com/sPHENIX-Collaboration/macros/tree/QA-tracking-pythiajet or [comparing it to the master branch](https://github.com/sPHENIX-Collaboration/macros/compare/QA-tracking-pythiajet?expand=1).\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import os.path\n", "\n", "# readme file of the macros, available if run under JenkinsCI\n", "# https://github.com/sPHENIX-Collaboration/utilities/blob/master/jenkins/built-test/test-tracking-qa.sh \n", "\n", "macro_markdown = 'Fun4All-macros-README.md'\n", "\n", "if os.path.isfile(macro_markdown) :\n", " with open(macro_markdown, 'r') as file:\n", " display(Markdown(file.read()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## `pyROOT` env check" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:35.005880Z", "iopub.status.busy": "2025-03-29T01:47:35.005578Z", "iopub.status.idle": "2025-03-29T01:47:44.771272Z", "shell.execute_reply": "2025-03-29T01:47:44.769811Z" } }, "outputs": [ { "data": { "text/markdown": [ "via sPHENIX software distribution at `/var/lib/jenkins/workspace/sPHENIX/Build-Master-gcc14@2/build/new/install.1`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import ROOT\n", "\n", "OFFLINE_MAIN = os.getenv(\"OFFLINE_MAIN\")\n", "if OFFLINE_MAIN is not None:\n", " display(Markdown(f\"via sPHENIX software distribution at `{OFFLINE_MAIN}`\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plotting source code" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:44.775005Z", "iopub.status.busy": "2025-03-29T01:47:44.774580Z", "iopub.status.idle": "2025-03-29T01:47:44.901847Z", "shell.execute_reply": "2025-03-29T01:47:44.900615Z" } }, "outputs": [ { "data": { "text/markdown": [ "View the source code repository at https://github.com/sPHENIX-Collaboration/QA-gallery.git" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import subprocess\n", "\n", "try:\n", " git_url = \\\n", " subprocess.run(['git','remote','get-url','origin'], stdout=subprocess.PIPE)\\\n", " .stdout.decode('utf-8').strip()\\\n", " .replace('git@github.com:','https://github.com/')\n", "\n", " display(Markdown(f\"View the source code repository at {git_url}\"))\n", "except: # catch *all* exceptions\n", " # well do nothing\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## JenkinsCI information (if available)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:44.905841Z", "iopub.status.busy": "2025-03-29T01:47:44.905602Z", "iopub.status.idle": "2025-03-29T01:47:45.030618Z", "shell.execute_reply": "2025-03-29T01:47:45.029651Z" } }, "outputs": [ { "data": { "text/markdown": [ "Some further details about the QA run, if executed under the Jenkins CI:" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* The commit being checked is sPHENIX-Collaboration/coresoftware/70c06381f9eacee17d01ab50034ac943bc8ce3fd" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* Link to the pull request: https://github.com/sPHENIX-Collaboration/coresoftware/pull/3498" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* Link to the build: https://web.sdcc.bnl.gov/jenkins-sphenix/job/sPHENIX/job/test-tracking-pythiajet-qa/5354/" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* Git repo for macros: https://github.com/sPHENIX-Collaboration/macros.git , which merges `master` and the QA tracking branch" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* Download the QA ROOT files: https://web.sdcc.bnl.gov/jenkins-sphenix/job/sPHENIX/job/test-tracking-pythiajet-qa/5354/display/redirect?page=artifacts" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Automatically generated by [sPHENIX Jenkins continuous integration](https://web.sdcc.bnl.gov/jenkins-sphenix/) [![sPHENIX](https://raw.githubusercontent.com/sPHENIX-Collaboration/utilities/master/jenkins/material/sphenix-logo-white-bg-72p.png)](https://www.sphenix.bnl.gov/web/)             [![jenkins.io](https://raw.githubusercontent.com/sPHENIX-Collaboration/utilities/master/jenkins/material/jenkins_logo_title-72p.png)](https://jenkins.io/)" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Markdown('Some further details about the QA run, if executed under the Jenkins CI:'))\n", "\n", "checkrun_repo_commit = os.getenv(\"checkrun_repo_commit\")\n", "if checkrun_repo_commit is not None:\n", " display(Markdown(f\"* The commit being checked is {checkrun_repo_commit}\"))\n", " \n", "ghprbPullLink = os.getenv(\"ghprbPullLink\")\n", "if ghprbPullLink is not None:\n", " display(Markdown(f\"* Link to the pull request: {ghprbPullLink}\"))\n", "\n", "BUILD_URL = os.getenv(\"BUILD_URL\")\n", "if BUILD_URL is not None:\n", " display(Markdown(f\"* Link to the build: {BUILD_URL}\"))\n", "\n", "git_url_macros = os.getenv(\"git_url_macros\")\n", "sha_macros = os.getenv(\"sha_macros\")\n", "if git_url_macros is not None:\n", " display(Markdown(f\"* Git repo for macros: {git_url_macros} , which merges `{sha_macros}` and the QA tracking branch\"))\n", "\n", "RUN_ARTIFACTS_DISPLAY_URL = os.getenv(\"RUN_ARTIFACTS_DISPLAY_URL\")\n", "if RUN_ARTIFACTS_DISPLAY_URL is not None:\n", " display(Markdown(f\"* Download the QA ROOT files: {RUN_ARTIFACTS_DISPLAY_URL}\"))\n", "\n", "JENKINS_URL = os.getenv(\"JENKINS_URL\")\n", "if JENKINS_URL is not None:\n", " display(Markdown(f\"Automatically generated by [sPHENIX Jenkins continuous integration]({JENKINS_URL}) [![sPHENIX](https://raw.githubusercontent.com/sPHENIX-Collaboration/utilities/master/jenkins/material/sphenix-logo-white-bg-72p.png)](https://www.sphenix.bnl.gov/web/)             [![jenkins.io](https://raw.githubusercontent.com/sPHENIX-Collaboration/utilities/master/jenkins/material/jenkins_logo_title-72p.png)](https://jenkins.io/)\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Initialization" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:45.034292Z", "iopub.status.busy": "2025-03-29T01:47:45.033598Z", "iopub.status.idle": "2025-03-29T01:47:45.637978Z", "shell.execute_reply": "2025-03-29T01:47:45.636815Z" }, "scrolled": true }, "outputs": [], "source": [ "%%cpp -d\n", "\n", "#include \"QA_Draw_Utility.C\"\n", "\n", "#include \n", "\n", "#include \n", "#include \n", "#include \n", "#include \n", "#include \n", "#include " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:45.641979Z", "iopub.status.busy": "2025-03-29T01:47:45.641757Z", "iopub.status.idle": "2025-03-29T01:47:46.483687Z", "shell.execute_reply": "2025-03-29T01:47:46.482401Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sPhenixStyle: Applying nominal settings.\n", "sPhenixStyle: ROOT6 mode\n" ] } ], "source": [ "%%cpp\n", "\n", "SetsPhenixStyle();\n", "TVirtualFitter::SetDefaultFitter(\"Minuit2\");\n", "\n", "// test sPHENIX lib load\n", "// gSystem->Load(\"libg4eval.so\");\n", "\n", "// test libs\n", "// gSystem->ListLibraries();" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:46.487538Z", "iopub.status.busy": "2025-03-29T01:47:46.487290Z", "iopub.status.idle": "2025-03-29T01:47:46.633629Z", "shell.execute_reply": "2025-03-29T01:47:46.632245Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inputs and file checks" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:46.636672Z", "iopub.status.busy": "2025-03-29T01:47:46.636455Z", "iopub.status.idle": "2025-03-29T01:47:46.743365Z", "shell.execute_reply": "2025-03-29T01:47:46.742315Z" } }, "outputs": [], "source": [ "\n", "qa_file_name_new = os.getenv(\"qa_file_name_new\")\n", "if qa_file_name_new is None:\n", "# qa_file_name_new = \"G4sPHENIX_test-tracking-low-occupancy-qa_Event100_Sum10_qa.root\"\n", " qa_file_name_new = \"G4sPHENIX_test-tracking_Event1000_Sum16_qa.root\"\n", " display(Markdown(f\"`qa_file_name_new` env not set. use the default `qa_file_name_new={qa_file_name_new}`\"))\n", "\n", "qa_file_name_ref = os.getenv(\"qa_file_name_ref\")\n", "if qa_file_name_ref is None:\n", " qa_file_name_ref = \"G4sPHENIX_test-tracking_Event1000_Sum16_qa.root\"\n", "# qa_file_name_ref = \"reference/G4sPHENIX_test-tracking-low-occupancy-qa_Event100_Sum10_qa.root\"\n", " display(Markdown(f\"`qa_file_name_ref` env not set. use the default `qa_file_name_ref={qa_file_name_ref}`\"))\n", "elif qa_file_name_ref == 'None':\n", " qa_file_name_ref = None\n", " display(Markdown(f\"`qa_file_name_ref` = None and we are set to not to use the reference histograms\"))\n", " \n" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:46.746346Z", "iopub.status.busy": "2025-03-29T01:47:46.746029Z", "iopub.status.idle": "2025-03-29T01:47:46.917450Z", "shell.execute_reply": "2025-03-29T01:47:46.916273Z" } }, "outputs": [ { "data": { "text/markdown": [ "Openning QA file at `G4sPHENIX_test-tracking_Event550_Sum10_qa.root`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Openning QA reference file at `reference/G4sPHENIX_test-tracking_Event550_Sum10_qa.root`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# qa_file_new = ROOT.TFile.Open(qa_file_name_new);\n", "\n", "# assert qa_file_new.IsOpen()\n", "# qa_file_new.ls()\n", "display(Markdown(f\"Openning QA file at `{qa_file_name_new}`\"))\n", "ROOT.gInterpreter.ProcessLine(f\"TFile *qa_file_new = new TFile(\\\"{qa_file_name_new}\\\");\")\n", "ROOT.gInterpreter.ProcessLine(f\"const char * qa_file_name_new = \\\"{qa_file_name_new}\\\";\")\n", "\n", "if qa_file_name_ref is not None:\n", "# qa_file_ref = ROOT.TFile.Open(qa_file_name_ref);\n", "\n", "# assert qa_file_ref.IsOpen()\n", " display(Markdown(f\"Openning QA reference file at `{qa_file_name_ref}`\"))\n", " ROOT.gInterpreter.ProcessLine(f\"TFile *qa_file_ref = new TFile(\\\"{qa_file_name_ref}\\\");\")\n", " ROOT.gInterpreter.ProcessLine(f\"const char * qa_file_name_ref = \\\"{qa_file_name_ref}\\\";\")\n", "else:\n", " ROOT.gInterpreter.ProcessLine(f\"TFile *qa_file_ref = nullptr;\")\n", " ROOT.gInterpreter.ProcessLine(f\"const char * qa_file_name_ref = nullptr;\")\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:46.921173Z", "iopub.status.busy": "2025-03-29T01:47:46.920857Z", "iopub.status.idle": "2025-03-29T01:47:47.039419Z", "shell.execute_reply": "2025-03-29T01:47:47.038227Z" }, "scrolled": true }, "outputs": [], "source": [ "%%cpp\n", "\n", "if (qa_file_new == nullptr) \n", "{\n", " cout <<\"Error, can not open QA root file\"<\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", " \n", " TH2 *h_new = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"DCArPhi_pT\"), \"TH2\");\n", " assert(h_new);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"DCArPhi_pT\"), \"TH2\");\n", " assert(h_ref);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref->Sumw2();\n", " h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_DCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(4, 2);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " vector> gpt_ranges{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", "\n", " TF1 *f1 = nullptr;\n", " TF1 *fit = nullptr;\n", " Double_t sigma = 0;\n", " Double_t sigma_unc = 0;\n", " char resstr[500];\n", " TLatex *res = nullptr;\n", " for (auto pt_range : gpt_ranges)\n", " {\n", " //cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new = h_new->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " h_proj_new->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_new->Rebin(5);\n", " }\n", " else\n", " {\n", " h_proj_new->GetXaxis()->SetRangeUser(-.01,.01);\n", " }\n", " h_proj_new->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new->GetXaxis()->SetTitle(TString::Format(\n", " \"DCA (r #phi) [cm]\"));\n", " h_proj_new->GetXaxis()->SetNdivisions(5,5);\n", " f1 = new TF1(\"f1\",\"gaus\",-.01,.01);\n", " h_proj_new->Fit(f1,\"qm\");\n", " sigma = f1->GetParameter(2);\n", " sigma_unc = f1->GetParError(2);\n", "\n", " TH1 *h_proj_ref = nullptr;\n", " if (h_ref)\n", " {\n", " h_proj_ref =\n", " h_ref->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", "\t//h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", "\th_proj_ref->Rebin(5);\n", " }\n", " }\n", " \n", " DrawReference(h_proj_new, h_proj_ref);\n", "\n", " sprintf(resstr,\"#sigma = %.5f #pm %.5f cm\", sigma, sigma_unc);\n", " res = new TLatex(0.325,0.825,resstr);\n", " res->SetNDC();\n", " res->SetTextSize(0.05);\n", " res->SetTextAlign(13);\n", " res->Draw();\n", " }\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " TPaveText *pt = new TPaveText(.05,.1,.95,.8);\n", " pt->AddText(\"No cuts\");\n", " pt->Draw();\n", "\n", " //SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", "\n", "\n", "\n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, with cuts on minimal tracker hits as defined in `QAG4SimulationTracking` and denoted on plot" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:47.719010Z", "iopub.status.busy": "2025-03-29T01:47:47.718193Z", "iopub.status.idle": "2025-03-29T01:47:47.952753Z", "shell.execute_reply": "2025-03-29T01:47:47.951404Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", " \n", " TH2 *h_new2 = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"DCArPhi_pT_cuts\"), \"TH2\");\n", " assert(h_new2);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new2->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref2 = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref2 = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"DCArPhi_pT_cuts\"), \"TH2\");\n", " assert(h_ref2);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref2->Sumw2();\n", " h_ref2->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c2 = new TCanvas(TString(\"QA_Draw_Tracking_DCArPhi2\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCArPhi2\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c2->Divide(4, 2);\n", " int idx2 = 1;\n", " TPad *p2;\n", "\n", " vector> gpt_ranges2{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f2 = nullptr;\n", " TF1 *fit2 = nullptr;\n", " Double_t sigma2 = 0;\n", " Double_t sigma_unc2 = 0;\n", " char resstr2[500];\n", " TLatex *res2 = nullptr;\n", " for (auto pt_range : gpt_ranges2)\n", " {\n", " //cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " p2->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new2->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new2->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new2 = h_new2->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " h_proj_new2->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_new2->Rebin(5);\n", " }\n", " else\n", " {\n", " h_proj_new2->GetXaxis()->SetRangeUser(-.01,.01);\n", " }\n", " h_proj_new2->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new2->GetXaxis()->SetTitle(TString::Format(\n", " \"DCA (r #phi) [cm]\"));\n", " h_proj_new2->GetXaxis()->SetNdivisions(5,5);\n", " f2 = new TF1(\"f2\",\"gaus\",-.01,.01);\n", " h_proj_new2->Fit(f2 , \"mq\");\n", " sigma2 = f2->GetParameter(2);\n", " sigma_unc2 = f2->GetParError(2);\n", "\n", " TH1 *h_proj_ref2 = nullptr;\n", " if (h_ref2)\n", " {\n", " h_proj_ref2 =\n", " h_ref2->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", "\t//h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", "\th_proj_ref2->Rebin(5);\n", " }\n", " }\n", " DrawReference(h_proj_new2, h_proj_ref2);\n", "\n", " sprintf(resstr2,\"#sigma = %.5f #pm %.5f cm\", sigma2, sigma_unc2);\n", " res2 = new TLatex(0.325,0.825,resstr2);\n", " res2->SetNDC();\n", " res2->SetTextSize(0.05);\n", " res2->SetTextAlign(13);\n", " res2->Draw();\n", " }\n", " \n", " \n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " TPaveText *pt2 = new TPaveText(.05,.1,.95,.8);\n", " pt2->AddText(\"Cuts: MVTX hits>=2, INTT hits>=1,\");\n", " pt2->AddText(\"TPC hits>=20\");\n", " pt2->Draw();\n", "\n", " //SaveCanvas(c2, TString(qa_file_name_new) + TString(\"_\") + TString(c2->GetName()), true);\n", "\n", " c2->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Longitudinal DCA, $DCA_z$\n", "\n", "Start with the version without track quality cuts" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:47.957910Z", "iopub.status.busy": "2025-03-29T01:47:47.957670Z", "iopub.status.idle": "2025-03-29T01:47:48.188583Z", "shell.execute_reply": "2025-03-29T01:47:48.187364Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", "\n", " TH2 *h_new = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"DCAZ_pT\"), \"TH2\");\n", " assert(h_new);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"DCAZ_pT\"), \"TH2\");\n", " assert(h_ref);\n", "\n", " // h_ref->Rebin(1, 2);\n", " // h_ref->Sumw2();\n", " h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_DCAZ\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCAZ\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(4, 2);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " vector> gpt_ranges{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f1 = nullptr;\n", " TF1 *fit = nullptr;\n", " Double_t sigma = 0;\n", " Double_t sigma_unc = 0;\n", " char resstr[500];\n", " TLatex *res = nullptr;\n", " for (auto pt_range : gpt_ranges)\n", " {\n", " //cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new = h_new->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " h_proj_new->GetXaxis()->SetRangeUser(-.05, .05);\n", " h_proj_new->Rebin(5);\n", " }\n", " else\n", " {\n", " h_proj_new->GetXaxis()->SetRangeUser(-.01, .01);\n", " }\n", " h_proj_new->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new->GetXaxis()->SetTitle(TString::Format(\n", " \"DCA (Z) [cm]\"));\n", " h_proj_new->GetXaxis()->SetNdivisions(5, 5);\n", "\n", " f1 = new TF1(\"f1\", \"gaus\", -.01, .01);\n", " h_proj_new->Fit(f1,\"mq\");\n", " sigma = f1->GetParameter(2);\n", " sigma_unc = f1->GetParError(2);\n", "\n", " TH1 *h_proj_ref = nullptr;\n", " if (h_ref)\n", " {\n", " h_proj_ref =\n", " h_ref->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " //h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_ref->Rebin(5);\n", " }\n", " }\n", " DrawReference(h_proj_new, h_proj_ref);\n", " sprintf(resstr, \"#sigma = %.5f #pm %.5f cm\", sigma, sigma_unc);\n", " res = new TLatex(0.325, 0.825, resstr);\n", " res->SetNDC();\n", " res->SetTextSize(0.05);\n", " res->SetTextAlign(13);\n", " res->Draw();\n", " }\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " TPaveText *pt = new TPaveText(.05, .1, .95, .8);\n", " pt->AddText(\"No cuts\");\n", " pt->Draw();\n", "\n", "// SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " \n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with cuts on minimal hits on each of the trackers" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:48.194800Z", "iopub.status.busy": "2025-03-29T01:47:48.194341Z", "iopub.status.idle": "2025-03-29T01:47:48.428289Z", "shell.execute_reply": "2025-03-29T01:47:48.427030Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " \n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", " \n", " // cuts plots\n", " TH2 *h_new2 = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"DCAZ_pT_cuts\"), \"TH2\");\n", " assert(h_new2);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new2->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref2 = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref2 = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"DCAZ_pT_cuts\"), \"TH2\");\n", " assert(h_ref2);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref2->Sumw2();\n", " h_ref2->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c2 = new TCanvas(TString(\"QA_Draw_Tracking_DCAZ2\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCAZ2\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c2->Divide(4, 2);\n", " int idx2 = 1;\n", " TPad *p2;\n", "\n", " vector> gpt_ranges2{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f2 = nullptr;\n", " TF1 *fit2 = nullptr;\n", " Double_t sigma2 = 0;\n", " Double_t sigma_unc2 = 0;\n", " char resstr2[500];\n", " TLatex *res2 = nullptr;\n", " for (auto pt_range : gpt_ranges2)\n", " {\n", " //cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " p2->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new2->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new2->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new2 = h_new2->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " h_proj_new2->GetXaxis()->SetRangeUser(-.05, .05);\n", " h_proj_new2->Rebin(5);\n", " }\n", " else\n", " {\n", " h_proj_new2->GetXaxis()->SetRangeUser(-.01, .01);\n", " }\n", " h_proj_new2->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new2->GetXaxis()->SetTitle(TString::Format(\n", " \"DCA (Z) [cm]\"));\n", " h_proj_new2->GetXaxis()->SetNdivisions(5, 5);\n", "\n", " f2 = new TF1(\"f2\", \"gaus\", -.01, .01);\n", " h_proj_new2->Fit(f2,\"mq\");\n", " sigma2 = f2->GetParameter(2);\n", " sigma_unc2 = f2->GetParError(2);\n", "\n", " TH1 *h_proj_ref2 = nullptr;\n", " if (h_ref2)\n", " {\n", " h_proj_ref2 =\n", " h_ref2->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " if (pt_range.first < 2.0)\n", " {\n", " //h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_ref2->Rebin(5);\n", " }\n", " }\n", " DrawReference(h_proj_new2, h_proj_ref2);\n", " sprintf(resstr2, \"#sigma = %.5f #pm %.5f cm\", sigma2, sigma_unc2);\n", " res2 = new TLatex(0.325, 0.825, resstr2);\n", " res2->SetNDC();\n", " res2->SetTextSize(0.05);\n", " res2->SetTextAlign(13);\n", " res2->Draw();\n", " }\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " TPaveText *pt2 = new TPaveText(.05, .1, .95, .8);\n", " pt2->AddText(\"Cuts: MVTX hits>=2, INTT hits>=1,\");\n", " pt2->AddText(\"TPC hits>=20\");\n", " pt2->Draw();\n", "\n", "// SaveCanvas(c2, TString(qa_file_name_new) + TString(\"_\") + TString(c2->GetName()), true);\n", " c2->Draw();\n", "}" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:48.434008Z", "iopub.status.busy": "2025-03-29T01:47:48.433662Z", "iopub.status.idle": "2025-03-29T01:47:48.541867Z", "shell.execute_reply": "2025-03-29T01:47:48.540672Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:48.545332Z", "iopub.status.busy": "2025-03-29T01:47:48.544935Z", "iopub.status.idle": "2025-03-29T01:47:48.937279Z", "shell.execute_reply": "2025-03-29T01:47:48.935972Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", " \n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", "\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_DCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(2, 1);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -0.01, 50, 0.01,\n", " \";Truth p_{T} [GeV/c]; #pm #sigma(DCA (r #phi)) [cm]\");\n", " gPad->SetLeftMargin(.2);\n", " frame->GetYaxis()->SetTitleOffset(2);\n", " TLine *l = new TLine(0.1, 0, 50, 0);\n", " l->SetLineColor(kGray);\n", " l->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"DCArPhi_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " // h_QAG4SimulationTracking_DCArPhi->Draw(\"colz\");\n", " TGraphErrors *ge_QAG4SimulationTracking_DCArPhi = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"DCArPhi_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", " }\n", "\n", " ge_QAG4SimulationTracking_DCArPhi->SetTitle(\"DCA (r #phi, #geq 2MVTX, #geq 1INTT, #geq 20TPC) [cm]\");\n", " DrawReference(ge_QAG4SimulationTracking_DCArPhi, h_ratio_ref, true);\n", " \n", " }\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -0.01, 50, 0.01,\n", " \"DCA (Z) [cm];Truth p_{T} [GeV/c]; #pm #sigma(DCA (Z)) [cm]\");\n", " // gPad->SetLeftMargin(.2);\n", " gPad->SetTopMargin(-1);\n", " frame->GetYaxis()->SetTitleOffset(1.7);\n", " //TLine *l = new TLine(0.1, 0, 50, 0);\n", " //l->SetLineColor(kGray);\n", " //l->Draw();\n", " HorizontalLine(gPad, 1)->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"DCAZ_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " TGraphErrors *ge_QAG4SimulationTracking_DCAZ = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " ge_QAG4SimulationTracking_DCAZ->SetTitle(\"DCA (Z) [cm]\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"DCAZ_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " }\n", "\n", " DrawReference(ge_QAG4SimulationTracking_DCAZ, h_ratio_ref, true);\n", " }\n", "\n", " //SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "}" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:48.940828Z", "iopub.status.busy": "2025-03-29T01:47:48.939807Z", "iopub.status.idle": "2025-03-29T01:47:49.275748Z", "shell.execute_reply": "2025-03-29T01:47:49.274445Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning in : Deleting canvas with same name: QA_Draw_Tracking_DCA_Resolution_QAG4SimulationTracking\n", "Error in : Illegal value of nxgroup=20\n", "Error in : Illegal value of nxgroup=20\n", "Error in : Illegal value of nxgroup=40\n", "Error in : Illegal value of nxgroup=40\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", " \n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", "\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_DCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_DCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(2, 1);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -0.01, 50, 0.01,\n", " \";Truth p_{T} [GeV/c]; #pm #sigma(DCA (r #phi)) [cm]\");\n", " gPad->SetLeftMargin(.2);\n", " frame->GetYaxis()->SetTitleOffset(2);\n", " TLine *l = new TLine(0.1, 0, 50, 0);\n", " l->SetLineColor(kGray);\n", " l->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"DCArPhi_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " // h_QAG4SimulationTracking_DCArPhi->Draw(\"colz\");\n", " TGraphErrors *ge_QAG4SimulationTracking_DCArPhi = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"DCArPhi_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", " }\n", "\n", " ge_QAG4SimulationTracking_DCArPhi->SetTitle(\"DCA (r #phi, #geq 2MVTX, #geq 1INTT, #geq 20TPC) [cm]\");\n", " DrawReference(ge_QAG4SimulationTracking_DCArPhi, h_ratio_ref, true);\n", " \n", " SaveGraphError2CSV(ge_QAG4SimulationTracking_DCArPhi, \"QAG4SimulationTracking_DCArPhi\");\n", " }\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -0.01, 50, 0.01,\n", " \"DCA (Z) [cm];Truth p_{T} [GeV/c]; #pm #sigma(DCA (Z)) [cm]\");\n", " // gPad->SetLeftMargin(.2);\n", " gPad->SetTopMargin(-1);\n", " frame->GetYaxis()->SetTitleOffset(1.7);\n", " //TLine *l = new TLine(0.1, 0, 50, 0);\n", " //l->SetLineColor(kGray);\n", " //l->Draw();\n", " HorizontalLine(gPad, 1)->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"DCAZ_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " TGraphErrors *ge_QAG4SimulationTracking_DCAZ = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " ge_QAG4SimulationTracking_DCAZ->SetTitle(\"DCA (Z) [cm]\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"DCAZ_pT_cuts\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " }\n", "\n", " DrawReference(ge_QAG4SimulationTracking_DCAZ, h_ratio_ref, true);\n", " SaveGraphError2CSV(ge_QAG4SimulationTracking_DCAZ, \"QAG4SimulationTracking_DCAZ\");\n", " }\n", "\n", " //SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sigmalized DCA" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:49.278266Z", "iopub.status.busy": "2025-03-29T01:47:49.278033Z", "iopub.status.idle": "2025-03-29T01:47:49.384655Z", "shell.execute_reply": "2025-03-29T01:47:49.383598Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:49.388849Z", "iopub.status.busy": "2025-03-29T01:47:49.388122Z", "iopub.status.idle": "2025-03-29T01:47:49.620687Z", "shell.execute_reply": "2025-03-29T01:47:49.619243Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " \n", " \n", " \n", " TH2 *h_new = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCArPhi_pT\"), \"TH2\");\n", " assert(h_new);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCArPhi_pT\"), \"TH2\");\n", " assert(h_ref);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref->Sumw2();\n", " h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_SigmalizedDCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_SigmalizedDCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(4, 2);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " vector> gpt_ranges{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f1 = nullptr;\n", " TF1 *fit = nullptr;\n", " Double_t sigma = 0;\n", " Double_t sigma_unc = 0;\n", " char resstr[500];\n", " TLatex *res = nullptr;\n", " for (auto pt_range : gpt_ranges)\n", " {\n", " // cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new = h_new->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " h_proj_new->GetXaxis()->SetRangeUser(-5.,5.);\n", " h_proj_new->Rebin(5);\n", " h_proj_new->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new->GetXaxis()->SetTitle(TString::Format(\n", " \"Sigmalized DCA (r #phi)\"));\n", " h_proj_new->GetXaxis()->SetNdivisions(5,5);\n", "\n", " f1 = new TF1(\"f1\",\"gaus\",-4.,4.);\n", " h_proj_new->Fit(f1, \"mq\");\n", " sigma = f1->GetParameter(2);\n", " sigma_unc = f1->GetParError(2);\n", " \n", " TH1 *h_proj_ref = nullptr;\n", " if (h_ref)\n", " {\n", " h_proj_ref =\n", " h_ref->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " //h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_ref->Rebin(5);\n", " }\n", " \n", " DrawReference(h_proj_new, h_proj_ref);\n", " sprintf(resstr,\"#sigma = %.5f #pm %.5f\", sigma, sigma_unc);\n", " res = new TLatex(0.325,0.825,resstr);\n", " res->SetNDC();\n", " res->SetTextSize(0.05);\n", " res->SetTextAlign(13);\n", " res->Draw();\n", " }\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " TPaveText *pt = new TPaveText(.05,.1,.95,.8);\n", " pt->AddText(\"Cuts: MVTX hits>=2, INTT hits>=1,\");\n", " pt->AddText(\"TPC hits>=20\");\n", " pt->Draw();\n", "\n", " // SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "}" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:49.624594Z", "iopub.status.busy": "2025-03-29T01:47:49.624177Z", "iopub.status.idle": "2025-03-29T01:47:49.865269Z", "shell.execute_reply": "2025-03-29T01:47:49.863843Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning in : Deleting canvas with same name: QA_Draw_Tracking_SigmalizedDCArPhi_QAG4SimulationTracking\n" ] }, { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " \n", " \n", " \n", " TH2 *h_new = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCArPhi_pT\"), \"TH2\");\n", " assert(h_new);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCArPhi_pT\"), \"TH2\");\n", " assert(h_ref);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref->Sumw2();\n", " h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_SigmalizedDCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_SigmalizedDCArPhi\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(4, 2);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " vector> gpt_ranges{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f1 = nullptr;\n", " TF1 *fit = nullptr;\n", " Double_t sigma = 0;\n", " Double_t sigma_unc = 0;\n", " char resstr[500];\n", " TLatex *res = nullptr;\n", " for (auto pt_range : gpt_ranges)\n", " {\n", " // cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new = h_new->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " h_proj_new->GetXaxis()->SetRangeUser(-5.,5.);\n", " h_proj_new->Rebin(5);\n", " h_proj_new->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new->GetXaxis()->SetTitle(TString::Format(\n", " \"Sigmalized DCA (r #phi)\"));\n", " h_proj_new->GetXaxis()->SetNdivisions(5,5);\n", "\n", " f1 = new TF1(\"f1\",\"gaus\",-4.,4.);\n", " h_proj_new->Fit(f1, \"mq\");\n", " sigma = f1->GetParameter(2);\n", " sigma_unc = f1->GetParError(2);\n", " \n", " TH1 *h_proj_ref = nullptr;\n", " if (h_ref)\n", " {\n", " h_proj_ref =\n", " h_ref->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " //h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_ref->Rebin(5);\n", " }\n", " \n", " DrawReference(h_proj_new, h_proj_ref);\n", " sprintf(resstr,\"#sigma = %.5f #pm %.5f\", sigma, sigma_unc);\n", " res = new TLatex(0.325,0.825,resstr);\n", " res->SetNDC();\n", " res->SetTextSize(0.05);\n", " res->SetTextAlign(13);\n", " res->Draw();\n", " }\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " TPaveText *pt = new TPaveText(.05,.1,.95,.8);\n", " pt->AddText(\"Cuts: MVTX hits>=2, INTT hits>=1,\");\n", " pt->AddText(\"TPC hits>=20\");\n", " pt->Draw();\n", "\n", " // SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Longitudinal DCA, $DCA_z/\\sigma[DCA_z]$" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:49.869756Z", "iopub.status.busy": "2025-03-29T01:47:49.869299Z", "iopub.status.idle": "2025-03-29T01:47:50.108996Z", "shell.execute_reply": "2025-03-29T01:47:50.107667Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "{\n", " \n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", "\n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Truth Track\"));\n", " }\n", " \n", " TH2 *h_new2 = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCAZ_pT\"), \"TH2\");\n", " assert(h_new2);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new2->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref2 = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref2 = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"SigmalizedDCAZ_pT\"), \"TH2\");\n", " assert(h_ref2);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref2->Sumw2();\n", " h_ref2->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c2 = new TCanvas(TString(\"QA_Draw_Tracking_SigmalizedDCAZ\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_SigmalizedDCAZ\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c2->Divide(4, 2);\n", " int idx2 = 1;\n", " TPad *p2;\n", "\n", " vector> gpt_ranges2{\n", " {0, 0.5},\n", " {0.5, 1},\n", " {1, 1.5},\n", " {1.5, 2},\n", " {2, 4},\n", " {4, 16},\n", " {16, 40}};\n", " TF1 *f2 = nullptr;\n", " TF1 *fit2 = nullptr;\n", " Double_t sigma2 = 0;\n", " Double_t sigma_unc2 = 0;\n", " char resstr2[500];\n", " TLatex *res2 = nullptr;\n", " for (auto pt_range : gpt_ranges2)\n", " {\n", " // cout << __PRETTY_FUNCTION__ << \" process \" << pt_range.first << \" - \" << pt_range.second << \" GeV/c\";\n", "\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " p2->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new2->GetXaxis()->FindBin(pt_range.first + epsilon);\n", " const int bin_end = h_new2->GetXaxis()->FindBin(pt_range.second - epsilon);\n", "\n", " TH1 *h_proj_new2 = h_new2->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " h_proj_new2->GetXaxis()->SetRangeUser(-5.,5.);\n", " h_proj_new2->Rebin(5);\n", " h_proj_new2->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f GeV/c\", pt_range.first, pt_range.second));\n", " h_proj_new2->GetXaxis()->SetTitle(TString::Format(\n", " \"Sigmalized DCA (Z)\"));\n", " h_proj_new2->GetXaxis()->SetNdivisions(5,5);\n", " \n", " f2 = new TF1(\"f2\",\"gaus\",-4.,4.);\n", " h_proj_new2->Fit(f2, \"mq\");\n", " sigma2 = f2->GetParameter(2);\n", " sigma_unc2 = f2->GetParError(2);\n", "\n", " TH1 *h_proj_ref2 = nullptr;\n", " if (h_ref2)\n", " {\n", " h_proj_ref2 =\n", " h_ref2->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " //h_proj_ref->GetXaxis()->SetRangeUser(-.05,.05);\n", " h_proj_ref2->Rebin(5);\n", " }\n", " DrawReference(h_proj_new2, h_proj_ref2);\n", " sprintf(resstr2,\"#sigma = %.5f #pm %.5f\", sigma2, sigma_unc2);\n", " res2 = new TLatex(0.325,0.825,resstr2);\n", " res2->SetNDC();\n", " res2->SetTextSize(0.05);\n", " res2->SetTextAlign(13);\n", " res2->Draw();\n", " }\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " TPaveText *pt2 = new TPaveText(.05,.1,.95,.8);\n", " pt2->AddText(\"Cuts: MVTX hits>=2, INTT hits>=1,\");\n", " pt2->AddText(\"TPC hits>=20\");\n", " pt2->Draw();\n", "\n", " //SaveCanvas(c2, TString(qa_file_name_new) + TString(\"_\") + TString(c2->GetName()), true);\n", " c2->Draw();\n", "}" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sigmalized DCA summaries\n", "\n", "With tracker hit cuts (>=2MVTX, >=1INTT, >=20TPC)\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:50.113576Z", "iopub.status.busy": "2025-03-29T01:47:50.113160Z", "iopub.status.idle": "2025-03-29T01:47:50.220291Z", "shell.execute_reply": "2025-03-29T01:47:50.219100Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:50.223324Z", "iopub.status.busy": "2025-03-29T01:47:50.223001Z", "iopub.status.idle": "2025-03-29T01:47:50.562614Z", "shell.execute_reply": "2025-03-29T01:47:50.561411Z" } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", " \n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationTracking\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", " \n", " \n", " // obtain normalization\n", " double Nevent_new = 1;\n", " double Nevent_ref = 1;\n", "\n", " if (qa_file_new)\n", " {\n", "\n", " TH1 *h_norm = (TH1 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_new = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", " if (qa_file_ref)\n", " {\n", " TH1 *h_norm = (TH1 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"Normalization\"), \"TH1\");\n", " assert(h_norm);\n", "\n", " Nevent_ref = h_norm->GetBinContent(h_norm->GetXaxis()->FindBin(\"Event\"));\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Tracking_SigmalizedDCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Tracking_SigmalizedDCA_Resolution\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(2, 1);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -2, 50, 2,\n", " \";Truth p_{T} [GeV/c]; #pm #sigma(Sigmalized DCA (r #phi))\");\n", " gPad->SetLeftMargin(.2);\n", " frame->GetYaxis()->SetTitleOffset(2);\n", " TLine *l = new TLine(0.1, 0, 50, 0);\n", " l->SetLineColor(kGray);\n", " l->Draw();\n", " HorizontalLine(gPad, 1)->Draw();\n", " HorizontalLine(gPad, -1)->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"SigmalizedDCArPhi_pT\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " // h_QAG4SimulationTracking_DCArPhi->Draw(\"colz\");\n", " TGraphErrors *ge_QAG4SimulationTracking_DCArPhi = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCArPhi = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"SigmalizedDCArPhi_pT\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCArPhi);\n", "\n", " h_QAG4SimulationTracking_DCArPhi->Rebin2D(20, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCArPhi);\n", " ge_QAG4SimulationTracking_DCArPhi->Draw(\"pe\");\n", " }\n", "\n", " ge_QAG4SimulationTracking_DCArPhi->SetTitle(\"DCA_{r#phi}/#sigma[DCA_{r#phi}]\");\n", " DrawReference(ge_QAG4SimulationTracking_DCArPhi, h_ratio_ref, true);\n", " }\n", "\n", " {\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " p->SetLogx();\n", " TH1 *frame = p->DrawFrame(0.1, -2, 50, 2,\n", " \"DCA_z/#sigma[DCA_z];Truth p_{T} [GeV/c]; #pm #sigma(Sigmalized DCA (Z))\");\n", " // gPad->SetLeftMargin(.2);\n", " gPad->SetTopMargin(-1);\n", " frame->GetYaxis()->SetTitleOffset(1.7);\n", " TLine *l = new TLine(0.1, 0, 50, 0);\n", " l->SetLineColor(kGray);\n", " l->Draw();\n", " HorizontalLine(gPad, 1)->Draw();\n", " HorizontalLine(gPad, -1)->Draw();\n", "\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + \"SigmalizedDCAZ_pT\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " TGraphErrors *ge_QAG4SimulationTracking_DCAZ = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " ge_QAG4SimulationTracking_DCAZ->SetTitle(\"DCA_z/#sigma[DCA_z]\");\n", "\n", " TGraphErrors *h_ratio_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " TH2 *h_QAG4SimulationTracking_DCAZ = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + \"SigmalizedDCAZ_pT\", \"TH2\");\n", " assert(h_QAG4SimulationTracking_DCAZ);\n", "\n", " h_QAG4SimulationTracking_DCAZ->Rebin2D(40, 1);\n", "\n", " h_ratio_ref = FitProfile(h_QAG4SimulationTracking_DCAZ);\n", " ge_QAG4SimulationTracking_DCAZ->Draw(\"pe\");\n", " }\n", "\n", " DrawReference(ge_QAG4SimulationTracking_DCAZ, h_ratio_ref, true);\n", " }\n", "\n", " //SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Vertexing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Number of tracks associated\n", "\n", "Tracks assocaition with vertex. `gntrack` are truth tracks associated with the vertex and `ntrack` are reconstructed tracks" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:50.566343Z", "iopub.status.busy": "2025-03-29T01:47:50.566138Z", "iopub.status.idle": "2025-03-29T01:47:50.672812Z", "shell.execute_reply": "2025-03-29T01:47:50.671834Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:50.675943Z", "iopub.status.busy": "2025-03-29T01:47:50.675543Z", "iopub.status.idle": "2025-03-29T01:47:50.857995Z", "shell.execute_reply": "2025-03-29T01:47:50.856682Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KSTestSummary::PushKSTest - Warning - received pValue = 0. Reset to an arbitary small non-zero value (e^(-15))\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Error in : Histogram1 h_QAG4SimulationVertex_SvtxVertexMap_ntracks_cuts integral is zero\n", "\n" ] }, { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationVertex_SvtxVertexMap\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", " \n", " \n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Vertex_nVertex\") +\n", " TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Vertex_nVertex\") +\n", " TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(2, 2);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " {\n", " static const int nrebin = 1;\n", "\n", " p = (TPad *)c1->cd(idx++);\n", " c1->Update();\n", " // p->SetLogx();\n", " p->SetGridy();\n", "\n", " TH1 *h_pass =\n", " (TH1 *)qa_file_new->GetObjectChecked(prefix + \"gntracks\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_pass->Rebin(nrebin);\n", "\n", " // h_ratio->GetXaxis()->SetRangeUser(min_Et, max_Et);\n", " h_pass->GetYaxis()->SetTitle(\"Counts\");\n", " // h_pass->GetYaxis()->SetRangeUser(-0, 1.);\n", "\n", " TH1 *h_ref = NULL;\n", " if (qa_file_ref) {\n", " h_ref =\n", " (TH1 *)qa_file_ref->GetObjectChecked(prefix + \"gntracks\", \"TH1\");\n", " assert(h_ref);\n", "\n", " h_ref->Rebin(nrebin);\n", " }\n", "\n", " h_pass->SetTitle(TString(hist_name_prefix) + \": gntracks\");\n", "\n", " DrawReference(h_pass, h_ref, false);\n", " }\n", "\n", " {\n", " static const int nrebin = 1;\n", " \n", " p = (TPad *)c1->cd(idx++);\n", " c1->Update();\n", " // p->SetLogx();\n", " p->SetGridy();\n", "\n", " TH1 *h_pass =\n", " (TH1 *)qa_file_new->GetObjectChecked(prefix + \"gntracksmaps\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_pass->Rebin(nrebin);\n", "\n", " // h_ratio->GetXaxis()->SetRangeUser(min_Et, max_Et);\n", " h_pass->GetYaxis()->SetTitle(\"Counts\");\n", " // h_pass->GetYaxis()->SetRangeUser(-0, 1.);\n", "\n", " TH1 *h_ref = NULL;\n", " if (qa_file_ref) {\n", " h_ref =\n", " (TH1 *)qa_file_ref->GetObjectChecked(prefix + \"gntracksmaps\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_ref->Rebin(nrebin);\n", " }\n", "\n", " h_pass->SetTitle(TString(hist_name_prefix) + \": gntracksmaps\");\n", "\n", " DrawReference(h_pass, h_ref, false);\n", " }\n", "\n", " {\n", " static const int nrebin = 1;\n", " \n", " p = (TPad *)c1->cd(idx++);\n", " c1->Update();\n", " // p->SetLogx();\n", " p->SetGridy();\n", "\n", " TH1 *h_pass =\n", " (TH1 *)qa_file_new->GetObjectChecked(prefix + \"ntracks\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_pass->Rebin(nrebin);\n", "\n", " // h_ratio->GetXaxis()->SetRangeUser(min_Et, max_Et);\n", " h_pass->GetYaxis()->SetTitle(\"Counts\");\n", " // h_pass->GetYaxis()->SetRangeUser(-0, 1.);\n", "\n", " TH1 *h_ref = NULL;\n", " if (qa_file_ref) {\n", " h_ref =\n", " (TH1 *)qa_file_ref->GetObjectChecked(prefix + \"ntracks\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_ref->Rebin(nrebin);\n", " }\n", "\n", " h_pass->SetTitle(TString(hist_name_prefix) + \": ntracks\");\n", "\n", " DrawReference(h_pass, h_ref, false);\n", " }\n", "\n", " {\n", " static const int nrebin = 1;\n", " \n", " p = (TPad *)c1->cd(idx++);\n", " c1->Update();\n", " // p->SetLogx();\n", " p->SetGridy();\n", "\n", " TH1 *h_pass =\n", " (TH1 *)qa_file_new->GetObjectChecked(prefix + \"ntracks_cuts\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_pass->Rebin(nrebin);\n", "\n", " // h_ratio->GetXaxis()->SetRangeUser(min_Et, max_Et);\n", " h_pass->GetYaxis()->SetTitle(\"Counts\");\n", " // h_pass->GetYaxis()->SetRangeUser(-0, 1.);\n", "\n", " TH1 *h_ref = NULL;\n", " if (qa_file_ref) {\n", " h_ref =\n", " (TH1 *)qa_file_ref->GetObjectChecked(prefix + \"ntracks_cuts\", \"TH1\");\n", " assert(h_pass);\n", "\n", " h_ref->Rebin(nrebin);\n", " }\n", "\n", " h_pass->SetTitle(TString(hist_name_prefix) + \": ntracks (#geq 2 MVTX)\");\n", "\n", " DrawReference(h_pass, h_ref, false);\n", " }\n", "\n", " // SaveCanvas(c1,\n", " // TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()),\n", " // true);\n", " \n", " c1->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vertex resolution" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:50.861893Z", "iopub.status.busy": "2025-03-29T01:47:50.861483Z", "iopub.status.idle": "2025-03-29T01:47:51.241353Z", "shell.execute_reply": "2025-03-29T01:47:51.240279Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Warning in : ufirst < fXmin, fXmin is used\n", "Warning in : ulast > fXmax, fXmax is used\n" ] }, { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "{\n", " const char *hist_name_prefix = \"QAG4SimulationVertex_SvtxVertexMap\";\n", " TString prefix = TString(\"h_\") + hist_name_prefix + TString(\"_\");\n", " \n", " \n", " // X-direction\n", "\n", " TH2 *h_new = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"vxRes_gvz\"), \"TH2\");\n", " assert(h_new);\n", "\n", " // h_new->Rebin2D(1, 5);\n", " //h_new->Sumw2();\n", " // h_new->GetXaxis()->SetRangeUser(-15,15);\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"vxRes_gvz\"), \"TH2\");\n", " assert(h_ref);\n", "\n", " // h_ref->Rebin2D(1, 5);\n", " //h_ref->Sumw2();\n", " // h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c1 = new TCanvas(TString(\"QA_Draw_Vertex_Resolution_x\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Vertex_Resolution_x\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c1->Divide(2,1);\n", " int idx = 1;\n", " TPad *p;\n", "\n", " vector> gvz_ranges{\n", " {-10.0, 10.0}};\n", " TF1 *f1 = nullptr;\n", " TF1 *fit = nullptr;\n", " Double_t sigma = 0;\n", " Double_t sigma_unc = 0;\n", " char resstr[500];\n", " TLatex *res = nullptr;\n", " for (auto gvz_range : gvz_ranges)\n", " {\n", " // cout << __PRETTY_FUNCTION__ << \" process \" << gvz_range.first << \" - \" << gvz_range.second << \" cm\";\n", "\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " // p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new->GetXaxis()->FindBin(gvz_range.first + epsilon);\n", " const int bin_end = h_new->GetXaxis()->FindBin(gvz_range.second - epsilon);\n", "\n", " TH1 *h_proj_new = h_new->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end));\n", "\t// bin_start, bin_end);\n", "\n", " h_proj_new->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f cm - gvz\", gvz_range.first, gvz_range.second));\n", " h_proj_new->GetXaxis()->SetTitle(TString::Format(\n", " \"Vertex Resolution (x) [cm]\"));\n", " h_proj_new->GetXaxis()->SetNdivisions(5,5);\n", " h_proj_new->GetXaxis()->SetRangeUser(-0.002,0.002);\n", "\n", " f1 = new TF1(\"f1\",\"gaus\",-.002,.002);\n", " h_proj_new->Fit(f1, \"qm\");\n", " sigma = f1->GetParameter(2);\n", " sigma_unc = f1->GetParError(2);\n", "\n", "\n", " TH1 *h_proj_ref = nullptr;\n", " if (h_ref)\n", " {\n", " h_proj_ref =\n", " h_ref->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new->GetName(), bin_start, bin_end));\n", " // bin_start, bin_end);\n", " h_proj_ref->GetXaxis()->SetRangeUser(-10,10);\n", " }\n", " \n", " DrawReference(h_proj_new, h_proj_ref);\n", " sprintf(resstr,\"#sigma = %.5f #pm %.5f cm\", sigma, sigma_unc);\n", " res = new TLatex(0.325,0.825,resstr);\n", " res->SetNDC();\n", " res->SetTextSize(0.05);\n", " res->SetTextAlign(13);\n", " res->Draw();\n", " }\n", " p = (TPad *) c1->cd(idx++);\n", " c1->Update();\n", " gPad->SetLeftMargin(.2);\n", " //h_new->GetYaxis()->SetTitleOffset(2);\n", " h_new->Draw(\"colz\");\n", " \n", "\n", "// SaveCanvas(c1, TString(qa_file_name_new) + TString(\"_\") + TString(c1->GetName()), true);\n", " c1->Draw();\n", "\n", " // Y-direction\n", "\n", " TH2 *h_new2 = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"vyRes_gvz\"), \"TH2\");\n", " assert(h_new2);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new2->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref2 = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref2 = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"vyRes_gvz\"), \"TH2\");\n", " assert(h_ref2);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref2->Sumw2();\n", " // h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c2 = new TCanvas(TString(\"QA_Draw_Vertex_Resolution_y\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Vertex_Resolution_y\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c2->Divide(2,1);\n", " int idx2 = 1;\n", " TPad *p2;\n", "\n", " vector> gvz_ranges2{\n", " {-10.0, 10.0}};\n", " TF1 *f2 = nullptr;\n", " TF1 *fit2 = nullptr;\n", " Double_t sigma2 = 0;\n", " Double_t sigma_unc2 = 0;\n", " char resstr2[500];\n", " TLatex *res2 = nullptr;\n", " for (auto gvz_range : gvz_ranges2)\n", " {\n", " //cout << __PRETTY_FUNCTION__ << \" process \" << gvz_range.first << \" - \" << gvz_range.second << \" cm\";\n", "\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " // p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new2->GetXaxis()->FindBin(gvz_range.first + epsilon);\n", " const int bin_end = h_new2->GetXaxis()->FindBin(gvz_range.second - epsilon);\n", "\n", " TH1 *h_proj_new2 = h_new2->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", "\n", " h_proj_new2->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f cm - gvz\", gvz_range.first, gvz_range.second));\n", " h_proj_new2->GetXaxis()->SetTitle(TString::Format(\n", " \"Vertex Resolution (y) [cm]\"));\n", " h_proj_new2->GetXaxis()->SetNdivisions(5,5);\n", " h_proj_new2->GetXaxis()->SetRangeUser(-0.002,0.002);\n", " \n", " f2 = new TF1(\"f2\",\"gaus\",-.002,.002);\n", " h_proj_new2->Fit(f2, \"qm\");\n", " sigma2 = f2->GetParameter(2);\n", " sigma_unc2 = f2->GetParError(2);\n", "\n", " TH1 *h_proj_ref2 = nullptr;\n", " if (h_ref2)\n", " {\n", " h_proj_ref2 =\n", " h_ref2->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new2->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " }\n", " \n", " DrawReference(h_proj_new2, h_proj_ref2);\n", " sprintf(resstr2,\"#sigma = %.5f #pm %.5f cm\", sigma2, sigma_unc2);\n", " res2 = new TLatex(0.325,0.825,resstr2);\n", " res2->SetNDC();\n", " res2->SetTextSize(0.05);\n", " res2->SetTextAlign(13);\n", " res2->Draw();\n", " }\n", " p2 = (TPad *) c2->cd(idx2++);\n", " c2->Update();\n", " gPad->SetLeftMargin(.2);\n", " //h_new2->GetYaxis()->SetTitleOffset(2);\n", " h_new2->Draw(\"colz\");\n", "\n", " //SaveCanvas(c2, TString(qa_file_name_new) + TString(\"_\") + TString(c2->GetName()), true);\n", " c2->Draw();\n", " \n", " // Z-direction\n", "\n", " TH2 *h_new3 = (TH2 *) qa_file_new->GetObjectChecked(\n", " prefix + TString(\"vzRes_gvz\"), \"TH2\");\n", " assert(h_new3);\n", "\n", " // h_new->Rebin(1, 2);\n", " //h_new3->Sumw2();\n", " // h_new->Scale(1. / Nevent_new);\n", "\n", " TH2 *h_ref3 = NULL;\n", " if (qa_file_ref)\n", " {\n", " h_ref3 = (TH2 *) qa_file_ref->GetObjectChecked(\n", " prefix + TString(\"vzRes_gvz\"), \"TH2\");\n", " assert(h_ref3);\n", "\n", " // h_ref->Rebin(1, 2);\n", " //h_ref3->Sumw2();\n", " // h_ref->Scale(Nevent_new / Nevent_ref);\n", " }\n", "\n", " TCanvas *c3 = new TCanvas(TString(\"QA_Draw_Vertex_Resolution_z\") + TString(\"_\") + hist_name_prefix,\n", " TString(\"QA_Draw_Vertex_Resolution_z\") + TString(\"_\") + hist_name_prefix,\n", " 950, 600);\n", " c3->Divide(2,1);\n", " int idx3 = 1;\n", " TPad *p3;\n", "\n", " vector> gvz_ranges3{\n", " {-10.0, 10.0}};\n", " TF1 *f3 = nullptr;\n", " TF1 *fit3 = nullptr;\n", " Double_t sigma3 = 0;\n", " Double_t sigma_unc3 = 0;\n", " char resstr3[500];\n", " TLatex *res3 = nullptr;\n", " for (auto gvz_range : gvz_ranges3)\n", " {\n", " // cout << __PRETTY_FUNCTION__ << \" process \" << gvz_range.first << \" - \" << gvz_range.second << \" cm\";\n", "\n", " p3 = (TPad *) c3->cd(idx3++);\n", " c3->Update();\n", " // p->SetLogy();\n", "\n", " const double epsilon = 1e-6;\n", " const int bin_start = h_new3->GetXaxis()->FindBin(gvz_range.first + epsilon);\n", " const int bin_end = h_new3->GetXaxis()->FindBin(gvz_range.second - epsilon);\n", "\n", " TH1 *h_proj_new3 = h_new3->ProjectionY(\n", " TString::Format(\n", " \"%s_New_ProjX_%d_%d\",\n", " h_new3->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", "\n", " h_proj_new3->SetTitle(TString(hist_name_prefix) + TString::Format(\n", " \": %.1f - %.1f cm -gvz\", gvz_range.first, gvz_range.second));\n", " h_proj_new3->GetXaxis()->SetTitle(TString::Format(\n", " \"Vertex Resolution (z) [cm]\"));\n", " h_proj_new3->GetXaxis()->SetNdivisions(5,5);\n", " h_proj_new3->GetXaxis()->SetRangeUser(-0.002,0.002);\n", " \n", " f3 = new TF1(\"f3\",\"gaus\",-.002,.002);\n", " h_proj_new3->Fit(f3, \"qm\");\n", " sigma3 = f3->GetParameter(2);\n", " sigma_unc3 = f3->GetParError(2);\n", "\n", " TH1 *h_proj_ref3 = nullptr;\n", " if (h_ref3)\n", " {\n", " h_proj_ref3 =\n", " h_ref3->ProjectionY(\n", " TString::Format(\n", " \"%s_Ref_ProjX_%d_%d\",\n", " h_new3->GetName(), bin_start, bin_end),\n", " bin_start, bin_end);\n", " }\n", " \n", " DrawReference(h_proj_new3, h_proj_ref3);\n", " sprintf(resstr3,\"#sigma = %.5f #pm %.5f cm\", sigma3, sigma_unc3);\n", " res3 = new TLatex(0.325,0.825,resstr3);\n", " res3->SetNDC();\n", " res3->SetTextSize(0.05);\n", " res3->SetTextAlign(13);\n", " res3->Draw();\n", " }\n", " p3 = (TPad *) c3->cd(idx3++);\n", " c3->Update();\n", " gPad->SetLeftMargin(.2);\n", " //h_new3->GetYaxis()->SetTitleOffset(2);\n", " h_new3->Draw(\"colz\");\n", "\n", "// SaveCanvas(c3, TString(qa_file_name_new) + TString(\"_\") + TString(c3->GetName()), true);\n", " c3->Draw();\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Vertex resolution w/ multiplicity dependence\n", "\n", "To be completed" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Summary statistics" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:51.244056Z", "iopub.status.busy": "2025-03-29T01:47:51.243414Z", "iopub.status.idle": "2025-03-29T01:47:51.390252Z", "shell.execute_reply": "2025-03-29T01:47:51.389203Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This notebook contains 56 KSTets: combined Chi2/nDoF = 30 / 112, and combined __p-Value = 1__\n" ] } ], "source": [ "%%cpp\n", "\n", "KSTestSummary::getInstance()->make_summary_txt(\"QA-vertexing.txt\");" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "execution": { "iopub.execute_input": "2025-03-29T01:47:51.392644Z", "iopub.status.busy": "2025-03-29T01:47:51.392206Z", "iopub.status.idle": "2025-03-29T01:47:51.525344Z", "shell.execute_reply": "2025-03-29T01:47:51.524271Z" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "
\n", "
\n", "\n", "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%cpp\n", "\n", "KSTestSummary::getInstance()->make_summary_TCanvas() -> Draw();" ] } ], "metadata": { "kernelspec": { "display_name": "Python (sPHENIX)", "language": "python", "name": "sphenix-env" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.0" } }, "nbformat": 4, "nbformat_minor": 4 }