{ "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-24T22:23:15.178603Z", "iopub.status.busy": "2025-03-24T22:23:15.177597Z", "iopub.status.idle": "2025-03-24T22:23:15.184286Z", "shell.execute_reply": "2025-03-24T22:23:15.183181Z" } }, "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-24T22:23:15.188234Z", "iopub.status.busy": "2025-03-24T22:23:15.187780Z", "iopub.status.idle": "2025-03-24T22:23:15.201568Z", "shell.execute_reply": "2025-03-24T22:23:15.200693Z" } }, "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-24T22:23:15.246209Z", "iopub.status.busy": "2025-03-24T22:23:15.245981Z", "iopub.status.idle": "2025-03-24T22:23:15.252755Z", "shell.execute_reply": "2025-03-24T22:23:15.251768Z" } }, "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-24T22:23:15.255184Z", "iopub.status.busy": "2025-03-24T22:23:15.254853Z", "iopub.status.idle": "2025-03-24T22:23:24.107253Z", "shell.execute_reply": "2025-03-24T22:23:24.105307Z" } }, "outputs": [ { "data": { "text/markdown": [ "via sPHENIX software distribution at `/var/lib/jenkins/workspace/sPHENIX/Build-Master-gcc14/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-24T22:23:24.112820Z", "iopub.status.busy": "2025-03-24T22:23:24.112484Z", "iopub.status.idle": "2025-03-24T22:23:24.241840Z", "shell.execute_reply": "2025-03-24T22:23:24.240823Z" } }, "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-24T22:23:24.247512Z", "iopub.status.busy": "2025-03-24T22:23:24.246527Z", "iopub.status.idle": "2025-03-24T22:23:24.368210Z", "shell.execute_reply": "2025-03-24T22:23:24.367253Z" } }, "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/a31efaeddc6c0746d9d331f2948fb8ec821d73ac" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "* Link to the pull request: https://github.com/sPHENIX-Collaboration/coresoftware/pull/3493" ], "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/5340/" ], "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/5340/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-24T22:23:24.372323Z", "iopub.status.busy": "2025-03-24T22:23:24.371772Z", "iopub.status.idle": "2025-03-24T22:23:25.011687Z", "shell.execute_reply": "2025-03-24T22:23:25.010275Z" }, "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-24T22:23:25.015940Z", "iopub.status.busy": "2025-03-24T22:23:25.015481Z", "iopub.status.idle": "2025-03-24T22:23:25.852579Z", "shell.execute_reply": "2025-03-24T22:23:25.851159Z" } }, "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-24T22:23:25.857102Z", "iopub.status.busy": "2025-03-24T22:23:25.856167Z", "iopub.status.idle": "2025-03-24T22:23:26.006457Z", "shell.execute_reply": "2025-03-24T22:23:26.005312Z" } }, "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-24T22:23:26.010801Z", "iopub.status.busy": "2025-03-24T22:23:26.010408Z", "iopub.status.idle": "2025-03-24T22:23:26.118482Z", "shell.execute_reply": "2025-03-24T22:23:26.117391Z" } }, "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-24T22:23:26.122762Z", "iopub.status.busy": "2025-03-24T22:23:26.122416Z", "iopub.status.idle": "2025-03-24T22:23:26.295763Z", "shell.execute_reply": "2025-03-24T22:23:26.294670Z" } }, "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-24T22:23:26.298998Z", "iopub.status.busy": "2025-03-24T22:23:26.298287Z", "iopub.status.idle": "2025-03-24T22:23:26.421368Z", "shell.execute_reply": "2025-03-24T22:23:26.420065Z" }, "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-24T22:23:27.095619Z", "iopub.status.busy": "2025-03-24T22:23:27.095405Z", "iopub.status.idle": "2025-03-24T22:23:27.336404Z", "shell.execute_reply": "2025-03-24T22:23:27.335385Z" } }, "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-24T22:23:27.340207Z", "iopub.status.busy": "2025-03-24T22:23:27.339794Z", "iopub.status.idle": "2025-03-24T22:23:27.573594Z", "shell.execute_reply": "2025-03-24T22:23:27.572713Z" } }, "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-24T22:23:27.577355Z", "iopub.status.busy": "2025-03-24T22:23:27.576950Z", "iopub.status.idle": "2025-03-24T22:23:27.836266Z", "shell.execute_reply": "2025-03-24T22:23:27.834595Z" } }, "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-24T22:23:27.841174Z", "iopub.status.busy": "2025-03-24T22:23:27.840603Z", "iopub.status.idle": "2025-03-24T22:23:27.950209Z", "shell.execute_reply": "2025-03-24T22:23:27.948810Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2025-03-24T22:23:27.953492Z", "iopub.status.busy": "2025-03-24T22:23:27.953232Z", "iopub.status.idle": "2025-03-24T22:23:28.532068Z", "shell.execute_reply": "2025-03-24T22:23:28.530327Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAI8CAIAAABDLwC/AAAABmJLR0QAAAAAAAD5Q7t/AAAgAElEQVR4nOzdTa/lxpng+YgpQdmS4LKVQC8sq7+DAOVSEoMLFSArrUVr5+rZ1GDuVVVtemWkDAkkIcFSuTa9a2cu2gN0jVZWz8IpqyAtSEpepgB9gkYvLK9mKl1lWFktYMBePMpI3uBbkIcvQZ7/DwnpXh4yyMNDPue5wXjRVVUpAAAA4Lz9b1sfAAAAALA90mIAAACAtBgAAAAgLQYAAAAUaTEAAACgSIsBAAAARVoMAAAAKNJiAAAAQJEWAwAAAIq0GAAAAFCkxQAAAIAiLQYAAAAUaTEAAACgSIsBAAAARVoMAAAAKNJiAAAAQJEWAwAAAEqpxwbXKIqiudAYM7iVkJWFz14GS25uOHaTw/M5mfajaf21a+XWi8EhhXgWOFja5qadKNVx4zhGndJdG3vltL7UU3h/tPGMEvVdB3jO9xKKBz9ru1ogH0rgnzuAVVVDujaMoqhrkyiKRq2f57n/8dQlSTJ2k7HyPF+0/GmSJLEnuXliB0+mnDelVJIk9U261pdX8zy3G/aQMp3y6+TIe66H9ckV2Fwu77f+Lvov5vppHDxRckp9Vpv/DY/Xf8k560RRVL9xfC4bW2b/6Wru1CfaRFHkc73Viwrwxh88dU2bhOLWnTY/R9URH3re9ahD8rfCLgDsxXBtsah/sRVFUZZlWZZa66oRrLXWNvbZWoE4jrvWV1f/WB9V+5tlmWdiMVkcx63HvCF7hoWcWHu269I0TdO0WUKWZc6SKIrKsuxaXzTLlyshiqL6S/JzVVVa6yzLnNop2UT5VR+upuddtyrLcvBCdXJBOefOQmPM4GohVF/5XHLGGPlkZYU4jpMkkRPrnF57DfS8zdbTEsexs1M5sCiK0jR1ok29Jr4oCq21Z2yRkBLCaW8VfihO07T17rafuz2qOI49b71F47wUnqZp/fAAnKnBxLlrtdY6PwnZrbURUk5r9YB9qWvbVitUFVdVtdAumtWQozasnyX7hWGX2A+3v1KzfgBSSOv6PZ9L/7uw39/NXc9YFTf5TIo8z23llk/h/fdOzz3lc7s1P8oZLXrJOev0v5Gei60aE3B6Hjs0LzNZuf0djllnQ3sPxc39+uxluTvCEfinD2Ad09Piqu27Z8J3YX35qAjY/x0/V+K1XKC0qcOo5gStp0gCutMioivK2/SoNeHr2mPr+RzMtJwDW6j5xLQzWTVqy5or9DSiaH3jgzdL//EsmhZXy19y9RV6ro1paXHXn3+thXSl8v1hoT8xGgwpzRXyPJ/xL8CdhmLRk7sPFr7Oh0JaDKA6MS12vnsG6xiSJGlGz/r3q/zs80XSjKeypL/ybxTblDZJkuUaGtoDdppjdml9a/J95uQozkKnhOarE1I9nwpIu7sVcr5RZ7J6eEG21mrbFVrT4qrjr4XA02K7l3kvua40qz/BHZsWOy8NXnvNaNMfnaqOxKj5+N7JPuuXkD1CZ6vJTzOc499FKO5ap3U1zwDSVaBo/fun3sRZVnC2ct4daTGA6sS02Pl6m/aUtvlV5985pr7Ebiv/PfF7yCbZ9TJPKbCff6bSWtXhnHl7Sls/O/Uw0Xc+rNZkpf8z9fnE+7+KZjchOa66vxF70uLWFLbnZul5qX7wPqvNYsZLrusy6Hov09JiJzj4523WYN7TXMF+InLLNNM7e2HLCvVUrGuTyfYSiluPrevDGtxL813bU+qcc2d36upf4z2beL4RAOfgpLTYeXXCF1XzC9LzK6QZTG2sPD3xqtd/yA9dNanzqmcqo7Zq/aquuv94sN8Wzeq01q+KrlPq+e1rv4SWPoHW2DM5IS2u2q6KnqvX58JeMy22ezz9klsiLc6vspeQvRQnnCh78Xet0LwMmiGl609QZ5Pmc5jT49JeQnHrgXXd+4PJaNcZbhYi77fn79W8t5EJaTGAqqrmnM5DuvGO6sHd7Kguscmne3LrjqKroyJM0xyoQY6nuXxedtAG/w7RaZrGcaw6emo3T6+8ha5TJF/59fUnfKZNdvPVevdPOJMTSHf7pa+KRc14yTU/3HrV6VjxVXbkilMuoQkD8apGSEnT1HlfrW+zfhOtP6hFCKG4/lIURV3ljD05Uo7zDKr5oTgrNPd1ysUJ4MDmTIsl0IwaeMt+Gdsx530GhO959fRvIPtd2FrscsOKGWNkRLOkNu5vDxlzSnKyvG10NvXwsJ28rfULo3X91m+gsYqisAVKOrW0sWfyFHJygh3Mq98Sl1zdKX+TJA1VVY0dR6/V2Fu4dVzCWY5kOSGEYlUb8mzwSE78UGQwvp3ehgCC4jtucSsng5SBS3vCk4xnaUcYtV8tzWxpw/Ej1x9P1w746pNqOJskD4eG7RJFkT2ZsuZg1Y4lp+LEDMDWLEp+bPzmdZtmwpk8UZqmWZb5DGMclCUuuXnPwOBVJxf2YLQ55WILamjtfgGGYvv3cOuDrMl29KEA2KOTaouLtolwe8KWJBBOzWuzWkheDbw+5nTypSVD7kujN8+sQmstk2j41J/Vn432t6AQ9XYUp/9xYh+hGmNsmbN/spPP5CzkW3+divATLXTJbfL3wGBdpkSb03exCwGGYvv38LyncUcfCoBdGmx93LNa8yVZ0trVo6dn2OCarbt2+nBM63w9uPf6Dz6na9ReRo2WIHw6/3Wd5/qGrV3u6uv7jzLRtU7zc1yiS9nkM1k3rcuds1pr9/b+DR2Ldrlb85KrevvVTRuJYtSarQMp5ENDFzuXQddxRlFkFzZXaB7VYFc/T3sJxbZAn36cgyfHOYCe/p1JbbhAz87E/UsAnKGJtcXSylA12uBKzIrjuFlRIZUHTg1Ea78Hz/qAhZ6m9TQjrreyPfH5rFKqqqoJz52lAmxU/Y2cZNmRz+5kfalaPqVmt9kxyxhTPxhrkzM5o7kq1/uFfMk1G7O2Tvs8L7kfnYmpVe3xfXPS6VHlm4edEesbFkVRr2fdXICheFRPjNZ67h6tvZ8P/2gRwHoGE2dZLaqx27ZWBthoG0WRPImzmzRH/+mqJBisoOoaemyWIcDqdSTy3+TqkPXrD6Tl7LdV16BR9a2cha2nq5799x9PzznvGfbLOdqtTmbdibXFVcdJrvN5j/2nov+WWYjnJWdXS2rjwnZVFs5VW1zVxv7rjzb1lQdLax6qfV/21qgf7cq1xYGH4voFE3VwBkrrr1TuOp/OxWbXobYYwCl802JH/6PY1q/SwTjVWkLXCk6eWs2aFldtwX3U4Q1KhoZ3mLBVV1pcNTLRqjctbl2/53iaq/WfH+fVE0/mtDPpOD0trmopWuurPgezaFq86CVXNe76nlxnxrS46wi7Wgf1Z2Ctl0EzmvVndc3jnzctdoQWin062Dk31Nj2OVXjQ69/BKTFAE6hq8VGsKo/QVvimaPWOhkah2GWvXSdop6XMBYn04f0XAznCX6rTRq02GjTteuiKOI47u8BJgM4dF2H+xpspC7YUCwDufTf+NJEpHWdsQ0w+vV/+gDOxI5zkXWiGGnxCmSsKIZeGsQlN5lPuCAxmmbyedNaR1HUf+P3pMXz4tMHoOadzmNlEky3yqW01j6PCzFIqvHoNDNI6uS2Poq9KsvS84blz7OxpoXiWYZFB4B5nTSdx+aSJInjeJO/76lUmIsxhpPpg7M0mUwO7Pm0faEBd49tQihO0zTxns170Trj5mAmAM7WvtPiFWoaqJ8DDsCnLrPekoeceJQJodhO8dNvhQhMkAdg0VQRAAAA2HPbYgAAAGAupMUAAAAAaTEAAABAWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAANTYyZ/1F/PMHV89z9R6ADARoRgAlkBtMQAAAKB0VXnVFsxVOWFRSwEAYxGKAWA51BYDAAAAI9sWi8m1C7PXc2A1Wl8qparq9tYHAuBbhOIzRCgGFkVtMQAAAEBaDAAAAJAWAwAAAGpa2+KFFEXRutwYc2KZp5SAQPR/lHzQwFwIxehBKMaxBZQWx3Hc82qe52PvNGNMWZbTtkVQ0jTNskx1fJRFUcRxnCQJnzJwOkIxuhCKcXgBpcUiSRJnidyEcRx7DrEsiqIgEB/P2MsAwDSEYvQgFOOogkuL0zRtLtFayw/NV/vxZ+usggiCEy4DAGMRigNGKAaWso8ud1Jv0drirSiKrpZwPXy2aq7gua/B1QZfnfCOlvO73/3TT3/6/0ggfvrp//jmm//td7/7p02ORC6DLMv8z09oJxPYNULxhgjFwAr2kRa3kqqLOI7jONZa16siZLlSKssyrbW9G4ui0FrXt6rfqPKq/AVsSxjcl6pVohhjugp39t4sZHAvm/jd7/7p8vL/vn//a6W0UvoPf3jwz//84OLiH7YKx3meq6G2j6L/8pDPy1lSr/mQzakLAQYRildAKJ7pwIEhlR91T9l/npuMLaTneKIoUkrlee4siaIoSZIkSeRXu3me5/UV7EJZJ0mSPM9tyzlbrKxgi4qiSJbbNVv3ZVeQ5VJ41zo9K9glXXvZxJtv/rc33vgHpS7q//76r//h1q0P1zwMOXvyUdrzbF+VD66+pP/yaF5Ozifeug4QAkIxoZhQDCwnuLQ4v8reSPX7xAbN+ubOLdq8P53IW9Wis/Nrfauq7UvCBt/6r846zs3cv4LPOxrLCaBT//2fI5eP/ufzXuqxuHkync968GQ669e7FtXO3vZfhEATobi+hFBMKAbmFVwjiviqLMvKsoyiqP4UTJ6nNJ+LNRc6r0ZRVH+CY4yRW9TZynmCox4+MHIWSvdqy+m4Xd+RlO+skKap/dN5wjtaRX/Hjs26fciZ7HqyOXgyZUPpVq+ufjr11eynA5whQrHnO1oFoRhYSXAjUbSOClSWpTHG3l0SBFsbGznxsWmwiZJzB9qbczAm9rQ/q4eA+vqzvKMuVXV72oZ1Tz/9H//whwfN5d/97pN/+MN/Or38aWTszLIsi6JonnafkxlFkf1ZvuyNMdKDxH4uITQoBLZCKHYQipsIxTie4NLirlGBmiHJ/onpQ+6usixbQ1vrLS1k/VH76tr7oBP3soQ33njpn//5wX/+z5/VF/7N30Tf+c6/2eqQRJ7nUolVdYyd2X8yZX4B+7kbY+SHehUFnTxwzgjFQSEUA+sIrhFFq9bna13tQlpLkDutq3FY/a5zgrLsetS+uvY+6MS9LOFv/9b8j//x//31X79kl/zN30T//b//v3/7t2a7g1JKKWNM//O7/pMpn3iapvXaCFtvMblaCDg2QvFWCMXAOvaRFrfGx6bB52vNVwc3qf/lOmpDn73bcWcmv6OlPfvs9Tt3/sN3v/uEUpVS1Xe/+8R3vvNv7tz5D//u313f8KiEbVbonCL/k1mWpRRiKypssc0nyAAIxVshFAPr2EdaLOyNVL9zrDRN4zjuilyycvNPT3n607NT2dBZpyiKOI79n+zIms6zpGZvklHvaDXPPnv9vff+vVJaKfWHP/yn99//9yEEYiH9b5wT63l5SMiW1mz1DaU0WrMBXQjFmyAUA2voesDhPu/YdLBMZxQeu7KMhtg69mRzVCDPwTKbT/fqw1jWN3QOzxlY0Vk4OFjm4Dvalv8IPktwRgWqq386dqHPyWwdBGrsfQGsjFBMKCYUA8vZR1psb5u8MYy85QyO2BpYncF9VNvYma03vPMcJ4qi+oY+sbi1EGcv/e9oW8HG4urhleO86nMyuy6qoM48UEcoJhQTioHl6MqvG4H+4tEMjdXzE3sezFKIY9oALmtuNbaQMIek0fpSzTTS0JrCPJnAZITiyVuNLSTM6EEoBha1+7QY69hpLAYOhlB85gjFwKL21OUOAAAAWMiU6TzqNQ0AgE0QigFgXsHNcocw8cwOADZHKAYWRSMKAAAAwLvL3bdrz/TMjk4eADAZoRgAljAuLQYAAAAOiUYUAAAAAGkxAAAAQFoMAAAAqF0P0Ka1Vko5baOLoojjOIoimWrSkaZplmV5njtTUBpjyrJsNrOW9ZMkyX6UnXSsNy6UUurenTGbnLRDYGP3Tts8yFvm8D0x1gyqaZraPYbhQiml1JhLDgjWiRF4XhPi+ZDlugtPTIslUE7b1gbEcJRlufUhuOTrROtT+0SOLcFn/f51el5tfcln4ennYaxZ9jiqEM+Vp538yWfe/8DcclafaeKUC8bzsp94ZHPYXcj1D6qb/LHRdp1fTjiYJa40n9VG3eldy+e62U+3frwdtcm8X3ldy+f9OJjrZ7KTaoujKBq7ydIJqNRnOPUWzXX6V+g34W8UrS59NuQ6xiGNvWVsAsot49gk5K4QVAEsZ0IEnvevFN8UaPCvwVUC/klpcZqmY0PhtjUuxpgsO605BABsJMCQS1AFcCQ77nInFSdOczf5teuJoXyjOEFcNplQDQMAR0JQBXDmJqbFxpiqqiY8Nauqaq5WblJOvbSiKMqydGKxE+Kbcb9ZDgAEZZ2QS1AFcOZ2XFtsjImiqCxLY0xRFGmaSpeUeiyWhfXvEnk1juM0TaU9nAR9GsYBOHMEVQBnbp4B2gZ7SS/UudWGYLv35jhBDmNMnudxHGdZJg/+ugYeAoAwLRdyCaoAztk8o7HYXh1djcmWDpHT+kH7b1Xv/zhlJIpvh/65veheDmyrYYOg5hig7Ri3TFAX4Qohd+mgKsI5q56X3LGF83FAzTdA2+bpxFw31zpvaobaYtu7YsPqgWlP63jGB2B31gm5BFUAZ2i2tsXn07tC12x9LACWoq/a+nBchwm5gZ9nANtaOTjMkBZL9cD5tCSrarY+FgBLqa7a+nAeOVjIDfY8AwjBysFhntriJEmyLDtMmAaAkBFyAWAJ86TFdoAe3WGWvQAAFCEXAJYxT1pMNwssikerG+LkB4iQiyVwsweFj2MT84xbXJal4iMEgFUQcgFgCbMN0Jbn+elFAQD6HSrk3rsyFummLpSa82A2HywWwASzjUQBAFgBIRcAFjJP2+IoivpnIgUAzOUAIVd/oYOpJ17Esd8dcFTztC1O01T6RCdJ0rXCLDsCABByAWAJ80yAPjge0N67hlz5u//Gox8935fnhOBBTWIOnOLEizmEW6YZ1sKJYwcIuScG1dl5XnLD5RDGEYCgrsMTb65H4e7eo4XLval5aosP0vnDT/jfNwBO59zpQQ0GfLCQS1AF0MXGh3UaJs2TFtMFBABWQ8gFgCXM0+VOFEVRn4w0TVPatwHAQgi5ADCveWqL1cMnjFEU2TCdZZn8lwdk65irbRyA8BFyAWB2c07+HEVRva6iqirpJc3zPgCYESEXAJYw2+TP9UoLK03ToihknlIAwCwIuQCwhBlqiyU0d7Vpk+XN8A0AmICQCwALmW3y564oTHQGgNkRcgFgdnNO59FaVM9LO7KLuQnocodw7OKWGXlI80TLWRwg5AY13YBiOg8cS1DX4b5urnm63MnY8lpradkm0jSVAN01PelO6ZqtjwXAUvRVWx/OFRJUDxNygz3PADa3cnCYbTqPJEmyh+ovJUlysKE0w6+GAXC6kGe5k6B6mJBLUAXQZeVZ7mabziNN06qq8jxPkiSKoiRJkiSpqmpCgC6KwhijtTbG+G+epqndqqt1ndSmSBXLYCG7+2oBcD4k5EqkHQy5BFUA8BFQazlRFEUcx87CwYM0xjhjEjlVJj7FNgux6+yioSRtixGOXdwyIw8puGjp6ZBBdXb7av4I9AvqOtzXzTWxtrgoCq31hC7PPZUKQuJsnudVVVVVFUWRGhqdPk1TGcVTNpGGzs6DRadY2zKvqxAGxgcQjl//+tda61//+tdjN9Ra/+M//qMiqAKAh9kaUcxCMuYkSWzclMy7f3R6CdY2R5eGzqo2rqe8FEWRLTZNU/lusGSdeqIvmzMwPoC9I6gCgI+T0uI4jvVI/QVKLHaqkyXU9g/S6YRj2x+l/qtTrERzu5BIDSBwr7322rSQS1AFAB9h1Ra38pkuxOepnLOOU6xTF9KzRwDYNYIqALSamBYbY6qpxnZGPr0hWmulhVOsPAHMskx6TBtjpOXcTjvZADiSH/3oR9PirVLq7/7u75zSCKoA0GoHtcWiv5qhGeWdJ4Bd6sHdFlKWpSxvLWRyExEAITulAdgeEVQBBGjbaLCbtHgsz2ZtNkanaZplWRRF9Y7VZVk2P4n+ihkAOzVY7XrmCKoAVrBtNNhBWuzT0K2/2qO1fsLZxPa8bnasZgh6AEdCUAWAVjtIi/v5N5JrjfL1PiLNQC+xm24iAM4HQRXA2QorLW4dNkh+7apdkBDsjDPvROTWbtdSoE99CYPPA9gpgioAjNDfnG5lMpdSfVak5hJZWP9VInV9YXNJ8806S1rPhizM81zdU/bfhPel1IVSF8OrrbIXYAW7uGVGHlJY0dLTUYPq7OaKn6G9L5ynoK7Dfd1cYdUWG2OiKCrL0hhTFEWapjKgT71WQxbWKxvk1TiO0zSVdmwy42h9HTsxqRQrfT5kobNC+pCs45QDADtCUAWAEebNsvOrphXiNEdzypFQ26zqqG/ivFrf0EqSpHnwzsmx6+yi6ovaYoRjF7fMyEPavtKllU/IPV5Qnd2+KrSAfkFdh/u6uXQ1x5gXUqPQNXxPkiQT+h3X+y/PuJV/F+z6OvqLRyMKVc+PPmNaXyqlqur2wGqr7AVYwS5umZGHNE+0nEVPyJW62NaQe6SgOru54mdo7wvnKajrcF8316mBXh6uyc/20Zg8rVNK1QN3FEVpmu702dkuvuNJixGOXdwyIw8piLS4NeRaOwq5QX1tq719cwP9groO93VzPTZ5SxmqXXVUBjdnAS2KIo7jaTXHQamPRR/C1ySAJYQ2xVp/yG1deS8hl6AKoMuj+HBvjd1N7HJXFEWWZdJAzSfmSlqc57l0zpi200BcaekC4KDcZm2bmhByq6raS8gN5zwDCM3KwWFibbExZsIh2sYVAAB/hFwAWEFYA7QBAAAAm5jetriVUzMRbG8PADiGetQl5ALAKeZJi5cYoA0A0GraAG0AgH6npsU+A7RlWZZlWeCjBQFA+HwGaJOoS8gFgLEYoA3ACAyPvZUDD9AGAIFggDYACN2xB2gDgEAwQBsAhI6QCwArmHkkClXrFn3UNm3rTMhUn+TQ28WoDTefEBIIWWiz3EloHYyrRVHsroaYWe4AdNnHLHet0jTVWscPaa33FZo9MSETcA5Cm+VO4qpnq+JVDmo24ZxnAKFZOTjMlhYbY5qxOMuy0GpcYE2qkAawpSzLjvogDgA2N09aLKMCRVEkPULqkiQhiAPA6aIoUkqVZam1ptEwAMxutuk8oihqDdMMnDnNhIa/Wl36bEglMbBT0oVOhi5m8DUAmN302uKiKPRDMoC87uC8RBwHgMmKokiSRNGgAgDmNj0tlgGDbEuJZvOJeivp+q+kxQBwijRN8zxXNKgAgFnN07bYGBPHcXO51CjPsgsAgCUVE9LaOI5jMmMAON1saXGSJNJGwjwkg7UppaRWAwAwL9ugIo5jGlQAwIlmm85DmkZkWVaWZX15nucEawBYiHRrjuNYGlRsfTgAsGNzznKXpmmapjLHklJK6oxnLD8QTMgEnIMdpZjSoGJHB+wgqALosvIsd/NP/nzUbNgiagPnwLnTN086oyjqD61VVcnYbWsd0WwIqgC62PiwzvCy86fFAIB5yYjFg6vZh3UAgAlmm/x5RjJevfTe8x/NTRrYyVZdXwxpmvaPnWx3LeVMOHgA2FDr8zqCKgB46RpseCutw1YMbiWjFNUlSTK22NZ1ZDxmdU/ZfxPelFIXSl0Mr7aHveDMne3FvG20vHv3rlLq7t27E7a6devW8YLq7DwvueFyAntfOE9BXYf7urmCqy22Y7rJ8Ulo7q9jSNO0LMsoimQTCcRZlvUUK0MaOY0FnXWknNbxmAFgTa+++uqtW7du3ryptX7zzTcH13/zzTe11jdv3rx169b777+vCKoA4CGstFgewyVJYkO2PLnr70Qiwdo+45NBlG1p9qV6h5U0TZ26kOaujTHN+hIA2MR7771XVZWkudIm4cUXX3zzqhdffFFeev/991944YWqqq5du6YIqgDgaalq6ElaD0nCaNfk0lL9YGs1WotqLUGivH0s2H82dvFEOMDnzjies72Yg4qWt27deuGFF1pD+gsvvHDr1i275lGD6uz29ZwX6BfUdbivmyus2uJWUtPQ1eHDjpHsWc6oYgEgQO+9997nn38uQfzuQ/Lr559//t577/VvTlAFgFa7SYtP0fq4sFlsFEVFUcgjyDiOe/pWA0AgXn3IfxOCKgC02kFaLPprGlrDsU+x9eBelmUcx1EUJUkiTwOzLGuWrLv57BFAmHpu7UPe3QRVAAHaNhocdjoPz6meJNDbr4ckSWxlhozHWZZlURTqO482qZiQCTii/lubFI2gCmAFXQFhnVnudlBb7NPQrb/ao7WSo75JvTN1fR2p3qBJHIAjIagCQKsdpMX9/BvJtQbi/s37e5AAwPEQVAGcrbDSYufpm5BfuzpqSJB1xpm3Y2rW13GKlQJ96kuYsBTAThFUAcBfWGmxRNV6sC6KQiZbqq/mxOJm3HfKkR+cKC/t5Gx0dgarF7IJERzAThFUAcBfWGmxzIFUlqUxpiiKNE1lmtB6YJWF9agqr8ZxnKZpURTGGAn69XXsxKRSrPSekYX1QqSXdJqm9XWI4AD2wsYuQVAFgBGWmylkMqcao3UiJWcGJpmWyWrOz2Q3tOxUTD27fjRd0x6m7ApwYjAcz9lezGFGS8uJb86rxwuqs9vXRFxAv6Cuw33dXLoKdWQcqaKYfSv/Ltj1derDglTPjz5jWl8qparq9sBqe9gLztzZXsxahxgtpTa3PnRaFEVpmraGuCMF1dl5XnLD5QT2vnCegroO93VzzTBucVEUcRzXB6ecxbSnbINbTZjR1FF/QBng1ySAWYQ8ULG0W3AGEs7z3GcUiLEIqgA29Cg+3Ftjd7O1LT6fAbBLdO4AACAASURBVHeuVOkDOCj3+V0ApOJWJlKWnFgmkFM7b7Ab2nkGEI6Vg8MMabHt0nE+mTEArKkoimY2XFXVtHYRAIBW80z+LL2M4zh2uirXV5hlRwBwzmZvrgYAsOZJi2XEH6VUWZZOczdBHAeA02VZJjXEBFUAmN08abEzTA8AYEbGmDzPi6LIskxqH7Isk0Entj40ADiO2RpRzFIOAKCVMUYqie0wFGVZ2id1AIDThTXLHQCgn8xXV1VVnud2sowsy7TW8tKmRwcATbsZZGZiWizdosfGX9mKqmUAOJ3Nj5MkkfxY6o9DHnEZwPm4e/fLZ5/9ieTEWl/84Ac/uXv3y60PasDEtNgYkySJxF+fNDdNUxldiG7UADAvaVlRNWZjBoCt3L375euv3/n662+U0vLvwYNvXn/9TuCZ8anTmaZpmmWZ/Nwcna0+K2kURft9ulefclDdePSj59k72/lycTznczE361yZbGJGJwbV2e1rflqgXwjX4bPP/uTrr7+5f/9BfeHTTz/xxBOPf/XVz/3LaZ3lLtzJn9OHJANujs4mufKRaoj5agTOgXOnh9wyYe+TehBUgUXcuFBKaXW50e4rpdywef/+g/v3v5a/Qr1dfPt/+/fzvTunHlq3+UeisFXCuw7TABAgqYNw6hpkYArFZB8AQtH/t25LxhyIedLiOrJhAFiCrbF2wqwxRtJimexjv83VAMzp3h21XSMKrS+6XqqqKdW9V1peLYYB2gBgB2wqnOe5UyWcpqmM16aUKsuSCmMAm3vmme89/fQTzsLr15/8/ve/u8nxeCItBoDQSeeNKIqqqup6ImeMkUa6ths0AGzl9u0f/+lP39Qz4+vXn/zjH//1F7/4yw2PahBpMQCETtpF+FQD2wk+AGBDN28+9+GHF0888bhSlfy7du2xX/3q8rXXntv60PqQFgNA6CQt9um5IevQvBjA5m7efO6rr34uveuq6s7vf//3gefEirQYAAAASwp03Ikm0mIACJ1/HTD1xAAw2eJpsUz7vPRe1qRrtj4WAEvRV217MJIWx3Hcv5qdWHRfA2WGc54BhGbl4LBUWizZsNb6eH2iq5qtjwXAUqqrtj0YY4z0pevJd4uikLxZRmrbkXDOM4DQrBwcZp7Ow84CbZdEUcQgmgBwoqIotNZlWWqtoygyDxUP2Ynu9lVVDADhmKe2WCYjlbphmxPneV5Vlbw0rTRngtN+aZrarbpa19k6bJ9iPVfbNf2FXuHf1u8SOIiqqpIkUUqVZZllWRzHWus4jm3g7Zr8maAKAD70KfXSRVGkaerUDRtjsizris4+ZTbbzw0epJ371HIOYGyx0ooliiL5MqjndhPmUdT6UilVVbcHVlt9L+vYauZJLCHYi3npy0zrk6LlvCS42Tk+pOqhK+QeMqjOzvOSGy4nsPeF8xTUdbivm2tibbE8zovjWOJmFEVJkkyrG3bYtnHSlGSwOZ1SSlJzmf/JzoDqtGl2ipUal64W3NRnzIsKY2BeaZpKizWJuvJr18oEVQDwdGojCpsNzxL1pJB62zipV3AqLRwSrO0zPmOMBGh7SPKSrVORl7rmgiqK4njdBAGcJ4IqAPg7NS3OsmxUY7XB0lSjXkFCbVfLNhud6wulBBuI5Ven2K7Hjjvtyj1N9Xy13L+t3xxwTPJQTlr9ip4gTFAFAH8T02JjTJ7n9c4f/d0yTtE/jv3YOVH7i5WF4bQgDJDWl9JOCMD6jDHSeq1e3VsPwp6FKIIqADRMry2W+glpdib1CmVZxnE8OOD8hB2dWELr48JmsdKcTnJ9AAiNDNCmlEqSxDbqlSBsKykmpLMTEFQBHNIMA7RJJXE9P1ZKzV5/3F9OMxx3tXJz1IN7lmU+oyzrbj57BBCmnls7hLtbopx0g5Oh0+ovSSWFUqosS8+oS1AFEKBto8Gcs9zZ/DhJknr98Sahrb9DiWUDvRykz9dJ1e2E4wWwsZ5bO4S7W2Jaf4yS9rsLDftAUAWwgm2jwcyz3AkblNM0Pb0Dsk9Dt/6B4aIoagb0erC2nbXtQveH74w4YACYV2s3uCYJg4P5K0EVAFotkhZb/aNpzkJmD/FZszXK15dkWeYUJbXdSil177SjBICT+bQJbk1Yx+6FoDqLQw7ZzihDOLZF0uLJk3pIQHc2l6qFrvRa1syyzJl+SdVqVmS6JqdYWV+WNI9Wpo9SD8f7jNXM/QgBYAUE1bN240Ippe7d2fo4gN04dTpTmWnJGTXTPJw1dOwU0DKbqJ0dtHWJaqTdsrs8z+3C5hJp5VZ/s80lPUeyi5lsg9rL6TtCmIK6zM5n8meJSD4RVaKfPdSjBtXZLTE/7faWSYtD+LzQL6j76ywmfxZa6yzLmg/sbNyUyT78CzTGSN2G9N5L01Qet9W/CWRhs4oijmObo8u0pfV17MSkUqyEb4YNAnBsBFUA8De9EYWNj/X6AyFNiqVuoCzLUS2MbQi24x83y28eSZ7ncRzbdmxORYiqTdFkix1bkw0cyQl1WhenbY7pmk11fRBUt7J9LZ26nOswuOVxJiY+Fmx9DNe+g97Hav27mNBAeXAr/wmc6nbxRDiovZy+Iyxq+pfc+MeywV7MIw9p+0YU/uu3HuqRgurs9vWc19Ncb0oF9r4wKKjPa18318Ta4v4eG3WTu0VP67Q3uNW0YoHDoNZnj4wxpyflBFUA6DexbbF/9YCsM9dcdyFgBibgHDDd2mo4zwC6rBwclh23+JCYeAmHMaV5g19rxQPUSTt3OhnbcgiqALrY+LDO18rE2mL/OuAj1RMDwCYmDwbvjJ4JAOhxUlo82AXEjt9O4zMAmMwYY4zRWss4a4PrSxotNdykxQDgaWIjCmcszNZ1bNfpPM8nHx8AQCmVpqlU/UpctaMI20oHCcW2MkJ5DMQGAKib3ra4KAqtdVmWWmsJ0KJ4qD7P52zHCwDnylZDpGlqp1JqjmQcRZHk0KsfIADs20ld7qqqstG5LMtmdGZ0dwCYnZ0jSeogZKFUTGx3UACwe6eORJE+pB4+vLOP9kiIAWBRpMIAMKN5BmgjAwaA1UybWA4A0I9xi7GG0cMNrjLDMLBTRVFkWUaPOgCY18QB2upkJCAZDEgce6RMJmQCzsFeZrmT3s829m59OFPs4jwD2MTKweHUtNgYE8exdLmzC6X73X5jdL+qZutjwSMHmFYNQamu2vpw2tnx2oQMDbTh8UwT/nkGsJWVg8NJabEM0KaUSpIkz3N76HmeJ0milJKBjWc5UABAnTSlqIdfGSSeqAsA00xvWyyRN4qi5nQe0qYiTVPJmydPW4rDGNvwV6tLz62oJMbZajYvNsZUVbXHCmMACMH02mKpJ+6fhlSqLg7czhgAttLV5a61tgIAMGhiWiwxN4qi/tUkZNebHQMATiShtSv3JeQCwDQntS32aRoxmDoDAEbpSYvl6Rzt1gBgAsYtBoD9iaKoLEs7yagwxshUo9sdF47vkD06Qhj5XutLpVRV3d76QM4aaTEA7I8MV5xlWZZlzZe2OCJgx8LI9S9UKEdyvmaYzuPcMPI8cA7Cn85D+jTXJUmyx6F/Az/PADa0cnA4qba4taLi8Pb4rQNgLOdODzBjk+HYbN3wftsTE1Qxzo0LpZS6d2fr48AabHxYpx6dRhQAsGP7zYaxU5s3w/Uf2H64KFos4KqJjSiklsLfqMJl+g+ZO9p/zOM0Te1WXU3rZIYRrXVXsbaQo85cDeAMEVSBQdXz1bb/ZjyMbc/krunQnl4VRRHHsbNw8CCl/3V9SZIk9TDtU2yzEPVwwPz6H5QTLjjP7qVH2suJO1pnL+fpSJfZmp++1sFFS0+HDKqzm2sQgKDe14wjG/C+VsD7GihnlTcVXJc7ibN5nks1s4w01F/HkKapjEkkm0g3FKfRs1NskiTqamNBpxBbTjPuI1j6C730v63fIjAaQRUAPE2f5W7a47D+R3jyUpIktnB5ctc/aZME63q/EwnQdkd2Tj5bbJqmztCeTiGt5QDAvhBUAcDf9LbFg23O6mzLNtUbECWMOitIqO3aS+s01FKCrduQX51iJZr3R2dawsFBhTH2haAKAP6mj0QhHSnSNJUnYrbawKmTKIrCVktIk7KxO5LWaV3107IXn2KddYwxWZbZL4bmCKCKUfEPj1F+cJYIqgDQ6qQB2mxVcZqmWZZJ+tscyTiKIsmhJ+/lxNGRWx8XNgO6s0JRFLaiJfvi7IZn3qPRHfu8R/mhkhhHQlAFgFbzjFucpqk8OCuKot4cbcbnZf11DM0dRVHU33hOdK0jib5qq/DoGdV/px3VAaggJ+xYFEEVQIA6A8K9NfY+83Qe86bCp/AJ36rRfk5dHXWotdUHYfrMrVBzvPl4Ouep/9Y+t6S5iaAKYAVdAWFPs9z5t0VbqPD+kTFaKzlaa0rsKJvOCJ3AmmizgUURVAGg1TzjFktlwCZ9Kfxz8a6QbX/WWttRNgnfmM2Ni2/79gF7QFAFcLbmn86jKAr90Nj649Zhg2yvvtZNZBdO9xFngCFZxylWCqwPuqmUSpKEjtIADoOgCgD+Zk6L7XhtoizLUQ3ymmNhyvhuTmM1J8g2475TjjPipj02VYvgraN7Ak3LTXO/7fvCIRFUAcDfnGmxDL6TJImdDlR6HPvXGRtjpMmaDP1mk+x6YJWF9TLl1TiO0zSV9nAS9Ovr2IlJpVhJ1mWhqkV/3YawjvWNTb7Hpuk4EwRVAPA350gUWZY5vYyNMVVVjaowtiG4v+dynTEmz/M4jrMsk/qJKIpan+5lWWaLpf8HgHNAUAUAT3PWFneF2mY87VcUhdQ0S5WzU2aaplVVOQVK/m23at2dbJjnuaxTD99281YEegC7RlAFAB/zpMWt3S8sz9EuW8ucfatwRlYG5qX1pdaXWx8FwkVQBYB+i6fFTt/kA6i3kNv6WAAsxWkOu/XhtOiqidjdyA+Bn2cAG1o5OMzWiEJ6dTiPxowxWZY1Jz3atfqjwK2PBcBSnOf+Wx9Oi67R4uvDAe1C4OcZwIZWDg6zpcUSnbMsq//dL80ndld1AQAAgHMzc5c7Z0mSJPz1DwAAgPDNOUCbdD22dcNHak8MAACAY5szLRZkwwCwhGaDtOaoamsdCwAc0PxpMQBgCWmaOuNd2uk2xOA8HQCAHqTFALAPTt2w1po8GABmNGeXOwAAdosO4sC5Iy0GAJyvu3e/fPbZn0hOrPXFD37wk7t3v9z6oABsg7R4NCZkAs5B+LPcHcaG5/nu3S9ff/3O119/o5SWfw8efPP663fIjIFA7HWWu/PBhEzAOQh/lrvDTCC64Xl+440Pnnrq8fv3H9gl9+8/eOqpxy8vP1j5SAC0Wjk40OUOAHapawLRMJP4djculFJaXW53BJVSbi3U/fsP7t//WutpR3Xx7f/v3TnpuABsgdpiAMB56v/7YT9/XQCYCbXFAICN3LujlKqe3ywB1fqi66WqmlLdq7+gGTqwY6TFB0P1BgD4euaZ7z148E29bbFS6vr1J69d48sROEc0ojgCBhgCgAlu3/7xn/70zdNPP2GXXL/+5B//+K+/+MVfbnhUALZCWrx7DDAEANPcvPnchx9ePPHE40pV8u/atcd+9avL1157butDA7ABnhPtXusAQ08//cTl5QdffUVkB4A+N28+99VXz2l9qVQ1rT0xgMMgLQ7P6BGLxg4wxPhBANBEbzng3NGIYrTAJr5igCFgEcxytxrOM4AuKwcHaotHW3yo/JEjFo0dYIjxgwAfzp1OxracPc0/AmBdNj6sk71QW3xFURTGGK21MSZN060Px8szz3yv3o1aXL/+5Pe//91Njmc+fFMCu7fHoArgbM2ZFnfNRNq1PDRFUcRxXJalUqosyyzLdlE/dLABhhhsDjiMnQZVAGdrzrQ4juPWDDiO4xn3shw5zjzPq6qqqiqKIqWUMWbjwxpypAGGGGwOOJKdBtVj4bEbMAKNKL4lT/eSJLEhW1J8qecI3M2bz3311c+lG3VV3fn97/9+4Zx4qTjbOtjcU089fnn5wUJ7XAvfTDg7uw6qe3cGj92OGlSP+r52gy5338qyTD2M41YURWVZFkWhvrPNUY234APKu3e/fOOND2ycfeaZ792+/eObN4fy73HjzY0dbE6dPN7cgjFo4hkDDuEoQXV/5LHbU089bsOpPHb78MOLvcefowbVo76vPaK2uI9UcuylbfSiVmnesN5gcytUpdAgBGgiqK7gqI/djhpUj/q+duqk2uJmaHOW7L0NmTFGKjwwfS69MePNjR1sTk0asWWdqhRmHwSaziWojp6VaV4THrsN2n4eqKMG1aO+r506KS1O09RpJZZlWT3k5Xm+98xYSa7/o0e/fvHFF9PKGbXh4ntZfC49VQ+jnkf1b//tk//zf/7///Iv39QX/vmfP/7443/mU4LnXv7qr/7h2rU/c2LQn//543/1V//Xxx//731brtggJOzLrArrYj5tL57u3bu3aPlnxQmqPcNTMKTxeIOP3U5ra3fj4pjpPn/GBKMzIKwSg+esLdZaHyMP7vf8888vtWHta32dvXg7Nc56vp3/8l/+7PXX7zz99BM2Z5XB5v7rf/0/nn++449meTs3LpRSN5Tn/d9ywP/yL98oVd240VVCZzV29y7GHYBj6gVQLXeZ1Vu/3bhxe6D12+oX8+S9eNJaB5uiGWN2PSpwsCd2upGzMs1rwmO34TLludyNsZFwRgun+5s56vuarisgrDOdB13u+kjeb4wp1eG6Ti88l56adAXLYHOXlx/cv/+1LLl27bFf/nLeweZOi0H37gTVIESs0F3jwJ149k5qVsqylOR468MZcOSgGoxnnvnegwff1B+IKaWuX3/y2rWTv/GPmu5LIQd9XxiFtBheFoyzV928+dxXXz2n9aVS1YiIEF4L5tXOGE2lz5nkwXmep2kax/E5PK/DoNu3f9z62O2Xv9yqkcA8VguqKzvq+9opRqL4lowz7zQLkV/3+2hyRlvMpbfUH7vrTJe92hmb2Ov8xoW6caH1pee/r776gxO1ZUe///0fWteX8jd95Hp8xpiyLCUVlmAV1NxJBNWtHGmOp7qDTelqHfV97dScf4tIENwpqWtJ09QG8aIoyrLc9Zua0SrNG1ayTlXK9DO2eG/ICakqrd+CIz2e65NlVFWltQ6nDTRBdUMTH7uF7UhfQ3VHfV87NWda3DUUZSAxup8xRsaZl54rRVG0jkV/zg4TZ1eLQaucsRMSVu920mp8yxNati1KAlQURU6ACiozJqiG4VB34mG+hhxHfV97RMuVR4qikIeS9kEkDfU67D7Orh6DxpyxhXtDTktYaf0WjqIo4jiOoqi1JiLP8ziObbOKbRFUsZjdfw11OOr72g2+0q6QLxIJ5RsfClay+xi0TsJ61E48O9WTXBpj8jxf93D6EFQB7Ahd7loQvrEj63TXOGonnj0aHIgtwJHaQjseAGhFWjyartn6WID1EtabN5/76qufS/16Vd35/e///tg5sb5q68M5Ms4zgC4rBwcaUYwWQl8WoC7optK75dzpZGzLIagC6GLjA7PcARiL1O2MFEXhtNwNsPkEAOwIaTEA7ElRFDJocX2h/CojoMnAbeTHADAWbYsBYB+KotBax3Esk2IkSZLnefVQnud5nstQwXEca60ZIRgARqG2GAB2QAYAlmntWmuCZaEdrjhN0yzLsiyj5S4AeKK2GABCJ62Hq6rybx2RpmlVVUmSUGcMAJ6oLQaA0E3uS0dODAD+qC1eDc8xAUwktcU+OS6d7QBgMtLiZd29++Wzz/5EcmKtL37wg5/cvfvl1gcFYH/KssyybHD45KIonEEqAACeSItH85+Q6e7dL19//c7XX3+jlJZ/Dx588/rrd8iMgfAFO8ud1tr2qzuGMM8zgBCsHBxIi0eravrXfOOND5566vH79x/YJffvP3jqqccvLz9Y+BgBnKq6auvDUUqpJEmiKFJKxXF8pEbDoZ1nAOFYOTjQ5W6MGxdKKa0uvTeomrOO3b//4P79r7VuLeTi2//fW2H+XgD7I3N5yMhrdpY7AMAsqC1eTv9fNlSKAJgiTdM8z5VSZVker0EFAGxokdpi6Qp9wN7Q9+4oparnfTNarS+6Xqqqlvpg/QXt6gAMkzGMZYKPOI4ZnBgAZjF/bbExJsuyOI5nL3l3nnnme08//YSz8Pr1J7///e9ucjwAjqQoiiRJlFJZlh2wGgIAVjdzWpymqUxPqpSiT/Ht2z/+05++qWfG168/+cc//usvfvGXGx4VgMNwGlRsfTgAsG9zpsVFUWRZJo/zpM/gmYfpmzef+/DDiyeeeFypSv5du/bYr351+dprz219aAAOQhpUyM9aawYtBoDJZkuLi6KI4ziKItvETeowzvzR3s2bz3311c9lPIqquvP73/89OTGA2VVVJWO3AQAmmyctlpxYfrALjTF5npdleeaZ8UNnXXEO4BTGmCRJ+mOpbWoMAJhmnrRYcuLmYMsSysuyPFIvaSZkAs5BaLPcyQg/g+vscVKMoM4zgKDsb5a7NE2jKOoKxGmaJklypJE1mZAJOAcBznI3zaeffrr1IQw4xnkGsISVg8M8aXF/1ju4AgCgx6effqq1Htt6+O2336b+FQD8hTjLXVEUxhittTHGv/WFPGGUrbqy8DRNpSq+q1hbiJQz4eABYHYvv/zyJ5988tlnn0ly/Pbbb/fUAb/99ttRFGmt33333U8++eTll18mqAKADx3aQyvbe69u8CBltqf6EmfaJ59im4UopfI8N8bU55/zn+XO0vpSKVVVtwdWO9BeTtxRyHsZ7caFUt9Okehv7xfALvYy8pCCiJaffvrpu++++9lnn9klL730kvxQX6iUkoRYHTSozs4/GgyUE9L7mutNKd7XKnhfA+Ws8qZmri0urppQgsTZPM+lKYk8NOyvY5A5RKR9c1VVMjBclmU9xTYnHHEKseUwXR+AcLz88stlWVZV9dZbb0lC/NlDSqmXXnrprbfe+uSTT6qqkpxYEVQBwNs8abF9TBZf1f9wrbUcpVR9HCLJrfsHqJdgbbNwGf7ClmZfiqLIFivdBHsKaS0HAALxzjvvSH5cV5blO++8YxNiRVAFgDFOTYslG86yTGoFkiRJkiTPc/lBomSWZf2t0ywJo07ElEK6trXRub5QSrB1G/KrU6xE8/7oTEs4ALtGUAUAf49N3jJNUwmRToMz4cQ+GYwijuPWlftJ6zTpMtJ8VSK4T6h11jHGZFlmvxjk6V5r4UDd6BbM6tJzq3rDqUmtmS+mbojzQlAFgFYTa4uLosiyTFqV+aS5khbneV4UxYS0eNIxPtL6uLAZ0J0l8h4Vz/twmqq6PUsXCmAuBFUAaDUxLTbGVFU1NrZKO4ppAbG/jqF5JJ4DfHY1sEvT1HYocV7S3Xz2CCBMPbf2Ie9ugiqAAG0bDaY3ouhiR9Osd/tQ40Pwifo7lFjNQF8fdUgGEnJWCGGQJhySNLSgFcRW+m/tAFM0giqA4+kKCOt8Oc6ZFr/99tvvvvtufclbb731zjvvqI7RK+taY6XwaejW1UhORFHU3HvrN4o9zgltoLG58fdMiI1xJw/H6NmIObT3i2kIqgAwu9nGLY6iyMmJlVLvvvuuVLEURVH1mlyx4b9hV8i2P2ut7SibhG/sDo2YzwpBFQBmN09a/Omnn3722WcvvfSSDCNf99Zbb3m2SFMdwwbJr10hVUKwM868M8CQrOMUKwXWB91USiVJQkdpADtlp2K2SwiqAOBvnrT43Xfffemll8qydNoTK6WkEYWn5liYRVFIZUN9NSfINuO+U44z4qaQ53o2gtM/Gj42n0UTaJIGDzKEvPMSQRUA/E1Piz/99FPbPVCmHu3qPOi89Pbbb3eVaYyRJmt2zArpqFEPrLKw/pxOXo3jWIaBk6Zs9emXlFJ2YlIpVmpTZKGqRf/W4yes70X1fDXuX3W7qm6P2mTrtwg8YrPhOI4lJZU5leodVgiqAOBvepe7l19+2Qbft99++6WXXmpWFQuttX9HYxuC+3su1xlj8jyP4zjLMqmfiKKo9elelmW2WPp/ANgjSUOdHm/NoFdfn6CKGQXQbXeR3tJHfV8YZUTC2uPTTz/9i7/4i2ZRslxNGn+nvx/05K38J3Cqq1+mE6oMtb5USg12hzrSXk7c0Tp7OU9HuszW/PRH/Xm/hKIo7HQYVpIkxhjPCUSPFFRn5x9zBsoJ6X3N9aZUaLnajQullLp3Z+vjmNsy7+sw1+E6N9c8A7S9/PLLb731ljxEe+mll2ThZ599Jj988sknE8qc1o16cKvTx/Ksd2dhuE3gqIIaqLg+9K+6Wi/r36GNoApgdx7Fh3tr7G62cYula927775rs2HxySefdDWu2CmiNnAOnDs9kCz5kA0VCKoY53j1xOhm48P+pvN455133nnnHRmsTSnV09oYADCBNPaNoihN09nnsQN8bP5Q/qg8p2TyKiqoRi+7Mv/kzy+//DLZMADMyBhTVZXtbGf7zzmjQwAATjHbLHcAgEXJIGtVVeV5LkMLl2UpnfCkQ97GxwcAO0daDAA7Y/PjJElsfhzHsQwJTH4M7JEMpb/1UZy7+RtRAE3j2zkxfCMwrD7tnFQbS+NjOrEBwATUFgPA7qVpKo0r7DxzAICxSIsRpHt3GIIHGMsYI/nx1gcCALtEWoyDYMwgnC362wHALGhbPBoTMk1AzordCWT+DocxpixLZ1IPGbVNKRVF0R7zY4IqgC4rz3JHbfFoVc3WxwJgKdVVWx+OKopCay3przNWcZqmdjyKMLP5fkGdZwBBWTk4kBYDwA7I/B1JklRV5aTFdrw2SY6Z4AMApiEtBoDQSZMJmfO5ZzVpQSE1ygCAsUiLAWAf+nNiIQO07bGFMQBsjrQYAEInaS6tIwBgUaTFALAP1AEDwKJIiwEgdFJP7JMWU68MAJMxbjFwvvQXEIFIngAAHF9JREFUEwbzupi6IaZL0zTLsizL+psX2wGMAQATUFsMADsgfem01l11xpI6K2bEAICpqC0ejQmZgHMQ2rwYaZoWRVGWpQxgHEWRbSkhy+XnPM+3OsLJCKoAuqw8yx1p8WhEbeyaTMRNK4hBzp0eQpZcFEVRFNJSQtRf3enMz4qgCqCbjQ/rfG3NkBYXRRHH8X4jMnCGJDmeQKtLn81JuxciE9qphymyXUgfOwA43QxtiyUcz9jPoygKY4zW2hjjM3y9SNPUbtXT9k5rrbX2KdZzNQBYn4RHMZgTE1QBwIee5emVVBgnSXJ6yJOinIWDB2mMcfJy52DGFisPTG0VeL3qa0I1m9aXSqmquj2w2oH2cvqOEKagLrM1rzGt54mW8/roo49effXV/nUOGVRn5x/ZBsoJ6jnJjQullLp3Z95SQ/i80C+o+2uJm2u5NzXPSBRFUURRlGWZ1Cs0+RclcTbP86qqqqqKokgNjcEpLe2iKJJNpMeJ9MjuKtb26e4q0P+AAWBNb775pn7o5s2b9uePPvqodX2CKgB4mictzrLM1iuUbTzLkdCZJEm9h7UaaqEhwbrezE4CtA3E8lK943aapvLd0FQUhRP9ASAEH330kdb6/ffft0teeOEF+7OkyM4mBFUA8DdPWlwN8SxHQqdTryChtqtlm43O9YVSgg3E8qtTrETzZh2GrQLxPGYAWMFHH3108+ZNpdQLL7xgQ+vnn38uP9y9e1dSZCczJqietXt3aEEBjLKDAdqkiZt0GWm+6j/TqbOOMSbLMueLQdapqopRNQAERXLiW7duvffee81XX3311VdfffXFF1/87W9/++abb7auYxFU10EGCezOBrPcffzxx6PWP33godbHhc1ipTmdPCs8E/oLPfaf/4bbvjXgkPrz3c8//1wpVW9l0YqgCgCtJqbFH3/8sdb6xRdfHLXVT3/608lD4vfXNDTDcVcrN0c9uGdZFkXRYNcQ3c1njwDC1HNrb353S3e6W7duzVgmQRVAgLaNBhMbUbzyyiu/+c1vfvjDH2qtX3jhhRdffPHFF1985ZVXWlf+6U9/+vnnn//2t79VSv3mN7954oknmuF49rHoPfv52UAvZ9znMV+AgzQBOF3/rR1gitYar1544YXf/va3XQ0kTkFQBbCCroAQ+ix3r7zySlVVH3/88c9+9rP33nvPPtqzPaMlD7Ykjf7hD3/YWlqe511B3KehW/93QBRFzYBeD9a2s7Zd6P7wnZ6dYwAN7IDZNccVFhKB4zgmqALAWKd2uXvllVekkthWCdezYacieYkqAenk4bNma5SvL8myzCmqLMtvx6u/d9pRhmpKwvrtFqeOyw3gFF21sNK27ZRgS1AFcLZmG4niZz/72emFSA2EE2ol+ne1TpM1syxzpl9StWd5rd2uZX1Z0ozsRVFIXYiM9xkrdzInAAgfQRUARhgccnhNMrClnVqpdYksrP8qkbq+sLmk+Wb7376zX3VP2X8j35Ps60Kpi+HV9rAXnLmzvZi3jZZ3796dFtiPGlRn53nJDZcT2PvCeQrqOtzXzbXBAG09jDFSt2GMKYoiTVN53FavtJCFzSqKOI7TNJXaC5m2tL6OnZhUipW+IAwbBODYCKoA4C+46TxsCP62/VlvbzxhjMnzPI5j244tiiKn4Z2doskWmyTJ4LBBABCCV199tZraXJigCgCe9ORQu7RpAwwNbuU/gVNdfViQCd3UtL5USlXVQDe1XewFZ+5sL2atw42Wno4UVGfneckNlxPY+8J5Cuo63NfNFVxtsTVt0M3BrWYfyxMAdoGgCgD9wmpbvAvMwAScA6ZbWw3nGUCXlYMDafFoV/pFAjgotxN0MKSL2ykrhCbM8wwgBCsHh2XTYumeTAUAAMwoy7KeGeziOPaZchkA4FgkLZYuGlprz6mSAACeZJgIGXPNeUly4uaoEQAAH3OmxTYbjuNYZjOKoihJEp6LAcCMjDFJkpRl6TSWkLHSyIkBYJoZRqKQdmySB1tUVwDAcuywwfZnaa5GNQQATDa9ttjObGTrhpVSSZLIDJ8M2QMAi0rTNIqiLMvs0MISfgEA00ysLZYWbPbX+uRGVBIDwDokIZZoPDh3HQCg36lti6Xp8L4GAwKAwyiKIooicmIAON2paXGWZVprY8z5VBIz8jxwDnY0nce0WZ3DsZfzDGB9+5jOwxhTVVWe51EUKaXKsozj+EzyY0aeB85BsNN5HA/nGUCXPU3nIUmwkx9Lz+iiKA6fHwMAAOAw5hm32ObHSZI49cdpmpIfAwAAIHAzz3InSbDkx7Iky7L6mBUAAABAgBaZ/FkplaapNK6w+TEAAAAQrKXSYmGMkfx40b0AAAAAJ1okLaa/HQAAAPbl1LTYGCP96uoL0zS147WdWD4AAACwgulpcVEUWuuyLJVSTvqbpqkdj4Lh2QEAABC+6WmxjC8hkz87abEdr02S44PVGTMhE3AOdjTL3d5xngF02ccsd9JqIooip/mEQ1oYS43yYTAhE3AOmOVuNZxnAF32NMtdf04sZIA2euABAAAgZBPTYklzF2odURSF9OST8d08t0rT1G7VlYWnaSpV8V3F2l3TXxDAYRBUAcBLNYk0Gs7zfHBNqS32WVPkeT7hIOV46qTR86hiW9eRI1f3lP3n+UbqlLpQ6mJ4tT3sBWfubC/mydFyc4cMqrPzvOSGywnsfeE8BXUd7uvmmlhbLH/0+zSNGFuvLD35bBrt02kvTdOyLKMokk0kEGdZ1lOsJOtOC25nHSmHmasB7BpBFQA8ndTlzomSrauN6m8nxSZJYkO2T6c9OQyboxtjJEDbh3ryUhRFtlg7hFzPro0xzfoSANgRgioAjDC5nlmipOpuIGFX8C+zdf3+BhtS/WBrNVqLai1BDs8+Fuw/1F08EQ7wuTOO52wv5lOi5YaOGlRnt6/nvEC/oK7Dfd1c00eisHUDdkK79CHpYCH1Da1ty0bpb7Dh30ijObjyYLEAcDwEVQBoddIAbUVR5HluJ7TLHpLHc1LZcHrX49NLaH1c2Cw2iiKZuk9rLbm+f5dtANgLgioAtHrsxO3twD1FUdQbos0+EE9/TUNrOPZp1lxfpyzLOI5tazlJ8evvS/RMtVIxFj2wW+c2xRpBFUCAOgPCvTX2fmpabA2mwmND8Ik8u/pJVbc9tiRJbGWGjMdZlmVRFOo7jzYhTAOH1H9rB5g0E1QBHE9XQNBfrBGEZ0uLhYzc3lxujOkPqXmedwVxn4ZuXfsVrZUc9W+Uemfq+jpJkkjdhvpRz84BYG0EVQCY3Ulti4Wd5ci2HhP1EFkURX/Xv8kVG/4bttas9G/uPzwzAKyJoAoAszu1y50dcULUx6SUFHlUgc7TN7sX1ahysGyTteYm9mBaA7EU6NPwgwlLAewUQRUA/E1Pi4uikMmK6sNb2goMO0LFqMxYomo9WBdFIZMtObuu/9qM+045rZOPyBNAG52dweqFbEIEB7BTBFUAGGHacMe2QbQdub2VxNb+dVo3iaIoz/PWGUNkYT0Xt0MjJ0li03FnLPp6UfZn58BkYRRFSZI46+xiboIAZ0DA8ZztxXxKtNzWIYPq7PY14wDQL6jrcF8316lp8Vyr1TnVGK0TKTkB2pk0pDk/U1UL4j0JvbPrR9M17eE7PsBMAsdzthfzftPi6ohBdXb7+uYG+gV1He7r5tLVpJFxpAVFfeSdLtKIYsJe+vtBT97Kswu2s059WJDq+dHvRetLpVRV3R5YbQ97wZk724tZ64nRMhxHCqqz87zkhssJ7H3hPAV1He7r5pp5gLYmzxHgm6Y1PhvcasKMpgBwAARVAOg3wwBt50bXbH0swIFtXsOhudnXwXkG0GXl4EBaPNqVli4AZnX37pfPPvsTyYm1vvjBD35y9+6XmxyJ26wNi+E8A+iycnAgLQYQirt3v3z99Ttff/2NUlr+PXjwzeuv39kqMwYAnJWT0uIsy/SQaQ2LAZyhN9744KmnHr9//4Fdcv/+g6eeevzy8oMNjwoAcCYW73IH4HzduFBKaXXpvUGllNuA7P79B/fvfy19mRsuvv3/vTvTDhAAAGtiWmyMoREYgFn1h5SWjBkAgBlRWwxgMffuqDEDTGp90fVSVbXUB9eHsQQA4ESkxQBC8cwz33vw4Jt622Kl1PXrT167RqQCACyOkSgAhOL27R//6U/fPP30E3bJ9etP/vGP//qLX/zlhkcFADgTM9TBFEVRFEXPLNCDK6Bp0tPhi6kbAkG4efO5Dz+8uLz84P79r2XJtWuP/fKXl6+99ty2BwYAOAfzPJrMskxy3+ZLRVHEcRxF0Sw7CkF9qhX6HQLzunnzua++ek7rS6Wq1vbEq2HGtdUQVAF0eRQf7q2xuxkaURhj8jwvy7I5673NiVsz5p1iQiZgFRtnpcxytxrOM4Auu5zlzhiTJElZlk5LiTiOlVJHyomPxH98AAAAgMObrX+3JMRZltmfpd6bv/6nmZCzyqQJJLsAAAATzDkSRZqmURRJO2NpUJHn+YzlAwAAAAuZeTRQSYil7USe583WxgAAAECA5h+3uCiKKIrIiQEAALAji8wdRR87AAAA7Auz3AEAAACkxQAAAABp8QS6ZutjAbAUfdXWh3NknGcAXVYODqTFozEhE3AOmOVuNZxnAF12OcvdvGSUN621McaZNq9HmqZ2q64+f2mayt8cXcXWC/HfNXA+qup2Vd3e+igwDkEVAHzo0P46L4pChj2uGzxIY0xZlvUlSZLUQ7BPsc1C7Dr6i0e191Pmn9OXSqnBZGKdvQAr2MUtM/KQgouWng4ZVGc3V/wM7X3hPAV1He7r5gqutthOBSJ15lEUKaX6h0BO07QsyyiKZBOZWk+moe4qNkkS9XB66tZC7DqMvgxg1wiqAOCrCokEzSRJ6gsHj7O5glOOxPR6dK4efjd0/eqUrO4p+2/ke5JyLpS6GF5tlb0AK9jFLTPykMKKlp6OGlRnN1f8DO194TwFdR3u6+YKq7ZYaiOc9mcSW7tatslyWceSEmzdhvzqFCs1FnZh80kfAOwdQRUA/IWVFreSUNsfwX2eyjnrOMVKXYjTcm7cgW6NvlAAfBBUAaDVbtLiU7RWWjjFpmkaRVGWZdJj2hgjLeeqfXayAYAuBFUAaLWDtFj0VzM0o7zzBLBLPbjbQsqylOWthehuPnsEEKaeW/uQdzdBFUCAto0Gj62zGzU+BJ/Is1mbjdFpmmZZFkWRjLJplzRHZaKqAzik/ls7wBSNoArgeLoCQn2AtuWslBa3jl5Zl+d5VxD3aegmg9V3vRpFUXPvzjeKdCWpL0zTtCiKsizTNFU/6tk5AKyNoAoAs1upEUVRFP0jYkyu2PDfsLVmpd5HpPl0TzqL0E0EQGgIqgAwu7DaFrcOGyS/ds0aKiHYGWfeicit3a6lwMH6ksF1ACBYBFUAGOH0oY9n1BwivnXQeDuvkpBIXV/YXNJ8s86S1rMhC/M8P97cBMCijnfLhBYtPR01qM5uXzMOAP2Cug73dXOFVVtsjJEma8aYoijSNJUBfeq1GrKwXtkgr8ZxLA3XpMldFEX1dezEpFKs9J6Rhc4K6UOyjlMOAOwIQRUA/Lk9gkPgdCVxOo7Y3s3153dFUUisF86r9Q3tr0mSOM8QnULq69T7P1bPjz5jWl8qpQbn2jhxL0A4jnfLNMdP2JHAg2oQblwopdS9OzMWSRjHVoJKJzzj+XA5q7ypcAN9fz/oyVt5dsF21jnedzywqOPdMrtOi0WwQTUIpMU4kKDSiX2lxeuNWzzWtKdsg1tNmNEUAA6AoAoA/cJqW7wLzMAEnAOmW1tU9Xy1eSXWoo797oDVHHaWu8PY+4NUAD6cO53MeBE3gomo3x7Fqc95AczLhoh1Wl5RWwwAAACQFgMAAACkxQAAAIAiLQYAAAAUaTEAAACgSIsBAAAARVoMAAAAKNJiAAAAQJEWT8DEV8A5YJa7dXCeAfRYOTiQFo9W1Wx9LACWUl219eEcFucZQI+VgwNpMQAAAEBaDAAAAJAWAwAAAIq0GAAAAFCkxQAAQCnFSCBB4ePYBGkxdoDosCFOPgDgTJAWAwAAAKTFAAAAAGnxBEzIBJwDZl9bB+cZQA9muQsdEzIB54DZ19bBeQbQg1nuAAAAgLXtPi0uisIYo7U2xqRp6rlVmqZ2q6IoetbUWvsXO7vTnxqMLcFn/f51el5tfcl/4ZpmOYBRhXiuPO3k7+jMz3IMS1z25+PYQdUewyblzHKb96xwegTYxPrxdtQm837ldS3n4wjkDOw7LS6KIo7jsiyVUmVZZlnmc1qNMVmW2a3iOO6K0f3BHQAOhqAK4JztOy2O41gplee5tDuJokgpZYzp2SRN07IsoyiSTfI8V0plWda6ppQPAGeCoArgnO04LZbaiCRJbMiWegipsegiwdrWWBhjkiSxpdmFWuvWsA4AR0VQBXDmdpwWS4R1HtVJ3UbXczpZLutYUkI9XqdpmiRJkiTOmgBwYARVAGfusa0PYGbGmLIspctI81WJ4P0PBGUFWUceDjqv6i8mtAq/mLohsHujr/x7St2YtCEWsEJQBbCcCRF4hth7pRC/FGiW/Z5sx7XFrQajMwDAH0EVwPk4Wm2x6O/s3IzyURSFVoFhe3+HOVjV+mO0rT90C2O0jT2wK+6N3uJEJ14wgYwNFKzlgupWZ54x2loX7vrjON4YbdNPy+oR+DACTYvHhuATDYbv6vlKnfJI996dUatXz1eKyZ6wf9wy4QgtqAqmtQOWE0KbBKVGx/NBkpItJMS0WJqy9ayQ53lXEPdp6NbVSG7Qop8EcDzcMoEINqgCWA4ReIIQ2xYXRVH1mhx/CdwAzhBBFQB8hJgWe2odNkh+7ZpgSSK4M3Zm6wBDAHBuCKoAztyO02IJ0/VgXRSFTLZUX80J8c243ywHAM4QQRXAmdtxWmyMkc7OxpiiKOy0ovVYLAvrj/nk1TiO0zSV9nAS9HkUCODMEVQBnLkQu9z5syFYYrfq7TgijDF5nsdxnGWZPPiLoqi/jzYAnAmCKoBzpo8xPs60ftD0ngaAVgRVAGfoIGkxAAAAcIodty0GAAAA5kJaDAAAAJAWAwAAAKTFAAAAgCItBgAAABRpMQAAAKBIixeltd76EADgOAiqABZFWrwUxrQHgBkRVAEsjbR4fmmaaq3Lstz6QADgCAiqANZBWjy/NE2rqkqSZOsDAYAjIKgCWAdp8be01kVRtL6UpqkxRmttjOlaByvo+YwwF24EzIVraaeItJvgfgkEabFSSqVp2vWSMSbLMnl4V5ZlHMc9K2M5nPYVcCNgLlxLO8VnsQnul3A8tvUBbC9N0yzLul6Sa7GqKlmitc6yzBhjjEnTtPl3m/xVt+DhnqWezwhzmXwjrHaE2AuC6k4RaTdB7A3KWafFg2P9SIC2l6NSKs9z+VutKAr+YlsB4zGt4MQbYclDw84QVHeKSLsJYm+AzjotzvNcLqyiKFr7ODcXyt9ndIhezeBnhNNxI2AuXEs7RaTdBPdLgM46LbaPIexzijq5WKMocpZHUcQVuZr+zwiz4EbAXLiWdopIuwnulwDR5W5AV/OdwecXMqLQ7McDbGLyjQA4CKqAP2LvykiLO3HNAYobAfPhWgL8cb9sgrS4E908AcWNgPlwLQH+uF82QVo8oOvPNa5XnBVuBMyFawnwx/2yMtLiTl3XHE3dcVa4ETAXriXAH/fLJkiLB3D9AYobAfPhWgL8cb+sjLS4T5Ik6uqsjPKzLAfOBDcC5sK1BPjjflnfWY9bPEimZJRZGY0xRVHIz0zFhLPCjYC5cC0B/rhf1kdaPKCqKpmC3E5ZzsCZOEPcCJgL1xLgj/tlZZrz66koCjp+AtwImAvXEuCP+2UdpMUAAAAAXe4AAAAA0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAABRpMQAAAKBIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUEo9tvUBAGehKIrBdYwxS+x09mLHHoBoHkbxkLwqpu2iZ8PWFTzPjD3+Dc8hgBkRignFAyoAy0uSZPBmTJJkxj3meT57mWN1hRo5tqYoivI8H7ULObFRFPUfg7MwiqLBM1P/yLY9jQDmQiiuLycUN1FbDKyh+SdyWZZRFNWXn/h3sDGmLMvqagQMgRN5i6KI41gpFUVRmqbyrouiSNO0LMs4jke9hTRNsywry7LrVdmRs7wsy8FKIzm2oiiyLPM/HgAhIxRbhOJ2S+fdAJrkz995//CViGN/DaeKonVh64HJW+ipb2glW/UU6FR7yMn3LDyE0whgIYRiQrGDLndAuHyawfkXNaG0GQ9A2DoD+aF1d131DV1vQYpqfUmKatYPNR+kTjs/AM4Bodh59ciheOm8G0BTTxWFrWmQO1TWab1b7cJm+7Cq9re1E3f6/9pWD1uV1TcZW2fQPMKeJY48z5tt2pxHb83jaS22q62bs6Zzfpz1Q6jpAbAQQnGXsw3FpMXABgZjsf2vBKb+WFzVAkqSJLJJPZ7KQrtOT1+Kekiqx/Fp4XhCLO4qpP94Wh/etT62k9Nif62ftyRJmo8OSYuBAyMUjy3k8KGYtBjYwGAs9glhzsLWBm1OMBpsSNca6QYjeH9pziGNCuutB9wMsvbN9uzdblsvrblOgO0CASyEUOzpfEIxbYuBEHWNmzPBhB7WTtMuCYjLtffSDfY4peux0/pNfq0vbL4vebXZcK0sS7ty6zppmkZRRDtjAIpQfH6hmAHagBDNNWh5c0CcCWTkneXCU5Ik9cKb/TxaO4U0C8myLE3TereP/qHj5VencBkJyPvYARwZodg5AJ9Cdh2KSYuBI5txTqCuXsmnl1OPhnYozbrW4SqdcuQLQ8Kx6uj4nKZps9ICAJZGKHbWCTYU04gCgJfTazucuoFWrS91NQLrKsHnsR0A7BGheFGkxQAGzPgkS+JjsxLC8pzHqHVsS9vwrvWRXPNZnp3VyVlNa007CgChIRSvgLQY2CWfNl6TOX/HS+icZY+2kNaqguZCCa/NNmet0VxW65qAtCgKp5ZFducUteiJBXAwhOKuwncaikmLgR2QkCR/OhdFYYzp+lN+lm4K8oRL+kxorZVSURTN9cxLenaXZSndnGUvxhitdVmWzc7ISqksy2RNee9lWXYdj422zcd2tq2bZYyR9bXWPoUDOHOE4uOH4mXGfQPQx2dqpdblVp7nXaNjqqtTK9ULGRz6US08tVLX21FXB8xvHSLe53haR82sGkPH1wUytRKA9RGKCcUOXXW0lQYQIPkzernytdZ2qMiegXUcXYck1Rs9QcaW5vOmWo/H0+C2XStId+wkSWhcAcAiFB81FDNAG7Anaz5Rau5LHmw118zzfNqBjdrqlPc+uC2tJgD4IxRPE34oJi0G4MvWKMgf7jxrAoD1EYqXQ5c7AMuSSUT/V3t3cAIgDARAcPuv2oegD0EiSKIwU4GvY4nmXP0Uj+13XG4WGAH8iFE8wmkxcHr35u9n/2M04rpWE2AOo/gweRS7cgc85s0dwHJG8et8RAEAALIYAABkMQAAJIsBACBZDAAA2UQBAAA5LQYAgGQxAAAkiwEAIFkMAADJYgAASBYDAECyGAAAksUAAJAsBgCAZDEAACSLAQAgWQwAAMliAABIFgMAQLIYAACSxQAAkCwGAIBkMQAAVBue5YFv2B0GNQAAAABJRU5ErkJggg==", "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-24T22:23:28.536019Z", "iopub.status.busy": "2025-03-24T22:23:28.535280Z", "iopub.status.idle": "2025-03-24T22:23:28.890938Z", "shell.execute_reply": "2025-03-24T22:23:28.889347Z" } }, "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-24T22:23:28.893845Z", "iopub.status.busy": "2025-03-24T22:23:28.893452Z", "iopub.status.idle": "2025-03-24T22:23:29.005112Z", "shell.execute_reply": "2025-03-24T22:23:29.003441Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2025-03-24T22:23:29.009547Z", "iopub.status.busy": "2025-03-24T22:23:29.009008Z", "iopub.status.idle": "2025-03-24T22:23:29.267113Z", "shell.execute_reply": "2025-03-24T22:23:29.265889Z" } }, "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-24T22:23:29.270237Z", "iopub.status.busy": "2025-03-24T22:23:29.270019Z", "iopub.status.idle": "2025-03-24T22:23:29.488355Z", "shell.execute_reply": "2025-03-24T22:23:29.487185Z" } }, "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-24T22:23:29.492466Z", "iopub.status.busy": "2025-03-24T22:23:29.491979Z", "iopub.status.idle": "2025-03-24T22:23:29.728555Z", "shell.execute_reply": "2025-03-24T22:23:29.727309Z" } }, "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-24T22:23:29.733782Z", "iopub.status.busy": "2025-03-24T22:23:29.733559Z", "iopub.status.idle": "2025-03-24T22:23:29.839788Z", "shell.execute_reply": "2025-03-24T22:23:29.838721Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2025-03-24T22:23:29.843092Z", "iopub.status.busy": "2025-03-24T22:23:29.842736Z", "iopub.status.idle": "2025-03-24T22:23:30.152869Z", "shell.execute_reply": "2025-03-24T22:23:30.151680Z" } }, "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-24T22:23:30.156629Z", "iopub.status.busy": "2025-03-24T22:23:30.156369Z", "iopub.status.idle": "2025-03-24T22:23:30.263984Z", "shell.execute_reply": "2025-03-24T22:23:30.262782Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2025-03-24T22:23:30.267651Z", "iopub.status.busy": "2025-03-24T22:23:30.267159Z", "iopub.status.idle": "2025-03-24T22:23:30.448931Z", "shell.execute_reply": "2025-03-24T22:23:30.447601Z" } }, "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-24T22:23:30.453845Z", "iopub.status.busy": "2025-03-24T22:23:30.452917Z", "iopub.status.idle": "2025-03-24T22:23:30.856950Z", "shell.execute_reply": "2025-03-24T22:23:30.855506Z" } }, "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-24T22:23:30.861168Z", "iopub.status.busy": "2025-03-24T22:23:30.860334Z", "iopub.status.idle": "2025-03-24T22:23:31.011012Z", "shell.execute_reply": "2025-03-24T22:23:31.009848Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This notebook contains 56 KSTets: combined Chi2/nDoF = 176.351 / 112, and combined __p-Value = 0.000100517__\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-24T22:23:31.015433Z", "iopub.status.busy": "2025-03-24T22:23:31.014492Z", "iopub.status.idle": "2025-03-24T22:23:31.146948Z", "shell.execute_reply": "2025-03-24T22:23:31.145671Z" } }, "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 }