{ "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-25T17:00:54.520157Z", "iopub.status.busy": "2025-03-25T17:00:54.519491Z", "iopub.status.idle": "2025-03-25T17:00:54.526661Z", "shell.execute_reply": "2025-03-25T17:00:54.525686Z" } }, "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-25T17:00:54.531119Z", "iopub.status.busy": "2025-03-25T17:00:54.530537Z", "iopub.status.idle": "2025-03-25T17:00:54.546447Z", "shell.execute_reply": "2025-03-25T17:00:54.545586Z" } }, "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-25T17:00:54.618313Z", "iopub.status.busy": "2025-03-25T17:00:54.617711Z", "iopub.status.idle": "2025-03-25T17:00:54.628077Z", "shell.execute_reply": "2025-03-25T17:00:54.627030Z" } }, "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-low-occupancy)\n", "\n", "## Tracking QA at low occupancy\n", "\n", "Low occupancy tracking QA concists full tracker + reconstruction of events with 20 $\\pi^+$, 20 $\\pi^-$ and one $\\Upsilon(1S) \\rightarrow e^+ e^-$. Please note the calorimeters are disabled to improve execution speed, which also removed some of the correlated albedo background for the tracker. \n", "\n", "The source code of the macro can be found at https://github.com/sPHENIX-Collaboration/macros/tree/QA-tracking-low-occupancy or [comparing it to the master branch](https://github.com/sPHENIX-Collaboration/macros/compare/QA-tracking-low-occupancy?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-25T17:00:54.632277Z", "iopub.status.busy": "2025-03-25T17:00:54.631453Z", "iopub.status.idle": "2025-03-25T17:01:00.886148Z", "shell.execute_reply": "2025-03-25T17:01:00.884682Z" } }, "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-25T17:01:00.889979Z", "iopub.status.busy": "2025-03-25T17:01:00.889656Z", "iopub.status.idle": "2025-03-25T17:01:01.016750Z", "shell.execute_reply": "2025-03-25T17:01:01.015244Z" } }, "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-25T17:01:01.021862Z", "iopub.status.busy": "2025-03-25T17:01:01.021301Z", "iopub.status.idle": "2025-03-25T17:01:01.149289Z", "shell.execute_reply": "2025-03-25T17:01:01.147971Z" } }, "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/cdd9aff0a42f7fc7812a7e49161bae9e18b1bfb3" ], "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-low-occupancy-qa/7018/" ], "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-low-occupancy-qa/7018/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-25T17:01:01.154498Z", "iopub.status.busy": "2025-03-25T17:01:01.153840Z", "iopub.status.idle": "2025-03-25T17:01:01.749857Z", "shell.execute_reply": "2025-03-25T17:01:01.748930Z" }, "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-25T17:01:01.754032Z", "iopub.status.busy": "2025-03-25T17:01:01.753626Z", "iopub.status.idle": "2025-03-25T17:01:02.473625Z", "shell.execute_reply": "2025-03-25T17:01:02.472546Z" } }, "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-25T17:01:02.478044Z", "iopub.status.busy": "2025-03-25T17:01:02.477471Z", "iopub.status.idle": "2025-03-25T17:01:02.636699Z", "shell.execute_reply": "2025-03-25T17:01:02.635567Z" } }, "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-25T17:01:02.641869Z", "iopub.status.busy": "2025-03-25T17:01:02.641286Z", "iopub.status.idle": "2025-03-25T17:01:02.753070Z", "shell.execute_reply": "2025-03-25T17:01:02.751599Z" } }, "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-25T17:01:02.758075Z", "iopub.status.busy": "2025-03-25T17:01:02.757500Z", "iopub.status.idle": "2025-03-25T17:01:02.946683Z", "shell.execute_reply": "2025-03-25T17:01:02.945566Z" } }, "outputs": [ { "data": { "text/markdown": [ "Openning QA file at `G4sPHENIX_test-tracking_Event400_Sum28_qa.root`" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Openning QA reference file at `reference/G4sPHENIX_test-tracking_Event400_Sum28_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-25T17:01:02.951727Z", "iopub.status.busy": "2025-03-25T17:01:02.951167Z", "iopub.status.idle": "2025-03-25T17:01:03.077975Z", "shell.execute_reply": "2025-03-25T17:01:03.076869Z" }, "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-25T17:01:03.768371Z", "iopub.status.busy": "2025-03-25T17:01:03.767578Z", "iopub.status.idle": "2025-03-25T17:01:04.020006Z", "shell.execute_reply": "2025-03-25T17:01:04.019056Z" } }, "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-25T17:01:04.029176Z", "iopub.status.busy": "2025-03-25T17:01:04.028667Z", "iopub.status.idle": "2025-03-25T17:01:04.303357Z", "shell.execute_reply": "2025-03-25T17:01:04.302364Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KSTestSummary::PushKSTest - Warning - received pValue = 0. Reset to an arbitary small non-zero value (e^(-15))\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", " \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-25T17:01:04.311486Z", "iopub.status.busy": "2025-03-25T17:01:04.311005Z", "iopub.status.idle": "2025-03-25T17:01:04.566605Z", "shell.execute_reply": "2025-03-25T17:01:04.565817Z" } }, "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-25T17:01:04.575576Z", "iopub.status.busy": "2025-03-25T17:01:04.575119Z", "iopub.status.idle": "2025-03-25T17:01:04.684452Z", "shell.execute_reply": "2025-03-25T17:01:04.682986Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "execution": { "iopub.execute_input": "2025-03-25T17:01:04.689240Z", "iopub.status.busy": "2025-03-25T17:01:04.688610Z", "iopub.status.idle": "2025-03-25T17:01:05.153415Z", "shell.execute_reply": "2025-03-25T17:01:05.152649Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAI8CAIAAABDLwC/AAAABmJLR0QAAAAAAAD5Q7t/AAAgAElEQVR4nO3dz8/txpnY+eLEsCMbjlvate38DwakpSwWF2pA1rUX8a6TWQ3mve7uTVaGZEggCQuWO0GA7NK6i2TRPV61Mwtf2w1pQVLy8grwXxBkYXk103Kn0VZiYMBZPHpLdYu/imSRLPJ8PxDs9/KQxR/n8DnPKdaPpG1bBQAAANy2/+3oAwAAAACOR1oMAAAAkBYDAAAApMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAECRFgMAAACKtBgAAABQpMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAEAp9bnJNeq67i7UWk9uJWRl4bOXyZK7G87d5PJ8LqZ5a3r/ObRy74fBIYV4FjhZ2uGWXSg1cOM4Zl3SU5v7yel9aaTw8WjjGSXsXUd4zc8Siiffa7NaJG9K5O87gF21U4Y2TNN0aJM0TWetX1WV//HY8jyfu8lcVVVtWv4yeZ6bi9y9sJMXU66bUirPc3uTofXl1aqqzIYjpEynfJsc+cjnYX/yCewul/O1z2L8w2xfxskLJZfUZ7XwJzzf+EfOWSdNU/vG8fnYmDLHL1d3pz7RJk1Tn8+bXVSEN/7kpes6JBT37rT7PqqB+DBy1rMOyd8OuwBwFtO1xcL+YqvrummapmmSJGk7wTpJEhP7TK1AlmVD66unf6zPqv0ty9IzsVgsy7LeYz6QucJCLqy52raiKIqi6JZQlqWzJE3TpmmG1hfd8uWTkKap/ZL83bZtkiRlWTq1U7KJ8qs+3M3IWfdqmmbyg+rkgnLNnYVa68nVYqi+8vnIaa3lnZUVsizL81wurHN5zWdg5DR7L0uWZc5O5cDSNC2Kwok2dk18XddJknjGFgkpMVz2XvGH4qIoeu9u876bo8qyzPPW2zTOS+FFUdiHB+BGTSbOQ6v11vlJyO6tjZByeqsHzEtD2/baoaq4bduNdtGthpy1oX2VzBeGWWLe3PFKTfsApJDe9Ufel/GzMN/f3V0HrIpbfCVFVVWmcsun8PF7Z+Se8rndum9lQJt+5Jx1xk9k5MPWzgk4I48duh8zWbn/DOesc6Czh+Lufn32st0d4Yj83Qewj+Vpcdv33bPgu9BePisCjn/Hh0q8tguUJnWY1Zyg9xJJQHdaRAxFeZMe9SZ8Q3vsvZ6TmZZzYBs1n1h2JdtObVl3hZFGFL0nPnmzjB/Ppmlxu/1Hzl5h5LOxLC0e+vnXW8hQKj8eFsYTo8mQ0l2hqqqAvwBPGorFSO4+Wfg+bwppMYB2ZVrsfPdM1jHked6Nnvb3q/zt80XSjaeyZLzybxbTlDbP8+0aGpoDdppjDuk9Nfk+c3IUZ6FTQvfVBameTwWk2d0OOd+sK9nefyB7a7XNCr1pcTvwayHytNjsJexHbijNGk9w56bFzkuTn71utBmPTu1AYtR9fO9kn/ZHyByhs9XipxnO8Z8iFA+t07uaZwAZKlD0/v6xmzjLCs5WztmRFgNoV6bFztfbsqe03a86/84x9hKzrfzvyu8hk2TbZa4pcJx/ptJb1eFceXNJe987dZ/oO29Wb7Iy/p76vOPjX0XBLUiO2+FvxJG0uDeFHblZRl6yD95ntSACfuSGPgZD57IsLXaCg3/eZkzmPd0VzDsit0w3vTMfbFnBTsWGNlnsLKG499iG3qzJvXTP2lxS55o7u1NP/xof2cTzRADcglVpsfPqgi+q7hek51dIN5iaWLk+8bLrP+SPoZrUsOxMZdZWvV/V7fCPB/Nt0a1O6/2qGLqknt++5kto6wtozL2SC9Litu9TMfLp9flg75kWmz2u/8htkRZXTzMfIfNRXHChzId/aIXux6AbUoZ+gjqbdJ/DrI9LZwnFvQc2dO9PJqNDV7hbiJzvyO/VarSRCWkxgLZtQ07nId14Z/Xg7nZUl9jk0z25d0fp06MiLNMdqEGOp7s8LDNog3+H6KIosixTAz21u5dXTmHoEslXvr3+gve0y2y+W+/+BVdyAeluv/WnYlMBP3LdN9euOp0re5oZuWLNR2jBQLyqE1KKonDOq/c07Zto/0EtYgjF9ktpmg6VM/fiSDnOM6jum+Ks0N3Xmg8ngAsLmRZLoJk18Jb5MjZjzvsMCD/y6vpvIPNd2FvsdsOKaa1lRLPcGvd3hIw5JTlZ1Tc6m7o/bCdv6/3C6F2/9xtorrquTYGSTm1t7pVcQy5OtIN5jdviI2db85sk72jbdu44er3m3sK94xIGOZLtxBCKlTXk2eSRrHxTZDC+k96GAKLiO25xLyeDlIFLR8KTjGdpRhg1Xy3dbOnA8SP3H0/XDPjqk2o4m+T3Q8MOSdPUXExZc7Jqx5BLsTIDMDWLkh9rv3ndlllwJVcqiqIsS59hjKOyxUcu7BWY/NTJB3sy2qz5sEU1tPa4CEOx+T3c+yBrsRO9KQDOaFVtcd03Ee5I2JIEwql57VYLyauR18esJ19aMuS+NHrzzCqSJJFJNHzqz+xno+MtKITdjmL9jxPzCFVrbcoM/s4uvpJByLf+PhXhK230kTvk98BkXaZEm/W7OIUIQ7H5PRz2Mp7oTQFwSpOtj0dW674kS3q7eoz0DJtcs3fXTh+OZZ2vJ/du/+FzuWbtZdZoCcKn89/QdbY37O1yZ6/vP8rE0Drd93GLLmWLr6RtWZc7Z7Xe7u3jGzo27XK350euHe1Xt2wkillr9g6kUE0NXex8DIaOM01Ts7C7QveoJrv6eTpLKDYF+vTjnLw4zgGM9O/MreECPTsTjy8BcIMW1hZLK0PVaYMrMSvLsm5FhVQeODUQvf0ePOsDNnqaNtKM2G5lu/L5rFKqbdsFz52lAmxW/Y1cZNmRz+5kfalaXlOz2+2YpbW2D8Y45EoGFKpyfVzMH7luY9beaZ/DkvvRmZhaWY/vu5NOzypf33dGtDes69quZz1chKF4Vk+M3nruEb29ny//aBHAfiYTZ1kttZhteysDTLRN01SexJlNuqP/DFUSTFZQDQ09FmQIMLuORP43f3rI+v0H0nL222to0Ch7K2dh7+Wys//x4xm55iPDfjlHe9TFtK2sLW4HLrLN5xzHL8X4LbMRz4+cWS23xoUdqiwMVVvcWmP/jUcbe+XJ0rqHas7L3Br20e5cWxx5KLY/MOkAZ6C08UrloevpfNjMOtQWA1jDNy12jD+K7f0qnYxTvSUMreDkqW3QtLjtC+6zDm9SPjW8w4KthtLitpOJtqNpce/6I8fTXW38+jivrryYy66kY31a3FopWu+rPgezaVq86Ueu7dz1I7lOwLR46AiHWgeNZ2C9H4NuNBvP6rrHHzYtdsQWin062Dk31Nz2OW3nTbffAtJiAGsk7WYjWNlP0LZ45pgkST41DkOQvQxdopGXMBcX04f0XIznCX6vQxq0mGgztOu6rrMsG+8BJgM4DH0OzzXYiC3aUCwDuYzf+NJEpHeduQ0wxo2/+wBuxIlzkX2iGGnxDmSsKIZemsRHbjGfcEFitMzi65YkSZqm4zf+SFocFu8+ABV2Oo+dSTA9KpdKksTncSEmSTUenWYmSZ3c0UdxVk3TeN6w/Dyba1koDjIsOgCEtWo6j8PleZ5l2SG/76lUCEVrzcX0wVVaTCYH9nzavtGAu9e2IBQXRZF7z+a9aZ1xdzATADfr3GnxDjUN1M8BF+BTl2m35CEnnmVBKDZT/IzbIQIT5AEYNFUEAAAAzty2GAAAAAiFtBgAAAAgLQYAAABIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgJo7+XPyYZi549vnmVoPABYiFAPAFqgtBgAAAFTStl61BaEqJwxqKQBgLkIxAGyH2mIAAABgZttisbh2IXg9B3aTJA+VUm37ztEHAuBThOIbRCgGNkVtMQAAAEBaDAAAAJAWAwAAAGpZ2+KN1HXdu1xrvbLMNSUgEuNvJW80EAqhGCMIxbi2iNLiLMtGXq2qau6dprVummbZtohKURRlWaqBt7Ku6yzL8jznXQbWIxRjCKEYlxdRWizyPHeWyE2YZZnnEMuirmsC8fXM/RgAWIZQjBGEYlxVdGlxURTdJUmSyB/dV8fxszWoKILggo8BgLkIxREjFANbOUeXO6m36G3xVtf1UEu4ET5bdVfw3NfkapOvLjij7fzmN3//gx/83xKIn332377++n/9zW/+/pAjkY9BWZb+1ye2iwmcGqH4QIRiYAfnSIt7SdVFlmVZliVJYldFyHKlVFmWSZKYu7Gu6yRJ7K3sG1VelV/ApoTJfSmrEkVrPVS4s/duIZN7OcRvfvP3Dx/+Xx9//HulEqWS3/3uk3/4h0/u7v7mqHBcVZWaavsoxj8e8n45S+yaD9mcuhBgEqF4B4TiQAcOTGn9qCfK/Oe5ydxCRo4nTVOlVFVVzpI0TfM8z/Nc/mk2r6rKXsEslHXyPK+qyrScM8XKCqaoNE1luVmzd19mBVkuhQ+tM7KCWTK0l0O8/vp//d73/kapO/u/P/uzv3nttZ/ueRhy9eStNNfZvCpvnL1k/OPR/Tg573jvOkAMCMWEYkIxsJ3o0uLqaeZGsu8TEzTtzZ1btHt/OpG3taKz8097q7bvS8IEX/ufzjrOzTy+gs8ZzeUE0KX//Z8zl8/+z+dc7FjcvZjOez15MZ317a5F1tU7/osQ6CIU20sIxYRiIKzoGlFkTyvLsmmaNE3tp2DyPKX7XKy70Hk1TVP7CY7WWm5RZyvnCY66f2DkLJTu1YbTcdvekZTvrFAUhfnpvOCMdjHeseOwbh9yJYeebE5eTNlQutWrp98dezXz7gA3iFDseUa7IBQDO4luJIreUYGaptFam7tLgmBvYyMnPnZNNlFy7kBzc07GxJH2Z3YIsNcPckZD2vadZRvann323/7ud590l3/lK1/83e/+4/ryl5GxM5umqeu6e9l9LmaapuZv+bLXWksPEvO+xNCgEDgKodhBKO4iFON6okuLh0YF6oYk8xPTh9xdTdP0hrbeW1rI+rP2NbT3SSv3soXvfe+lf/iHT/7Tf3rfXvjnf55++cv//KhDElVVSSVWOzB25vjFlPkFzPuutZY/7CoKOnnglhGKo0IoBvYRXSOKXr3P14bahfSWIHfaUOMw+65zgrLseta+hvY+aeVetvAXf6H/+3//f//sz14yS/78z9P/9t/+n7/4C33cQSmllNZ6/Pnd+MWUd7woCrs2wtRbLK4WAq6NUHwUQjGwj3Okxb3xsWvy+Vr31clN7F+uszb02bsZd2bxGW3t619/7tGjf/OVrzyjVKtU+5WvPPPlL//zR4/+zb/8l88deFTCNCt0LpH/xWyaRgoxFRWm2O4TZACE4qMQioF9nCMtFuZGsu8coyiKLMuGIpes3P3pKU9/RnYqGzrr1HWdZZn/kx1Z03mW1O1NMuuMdvP1rz/39tv/SqlEKfW73/3HH//4X8UQiIX0v3EurOfHQ0K2tGazN5TSaM0GDCEUH4JQDOxh6AGH+7zj0MEynVF4zMoyGmLv2JPdUYE8B8vsPt2zh7G0N3QOzxlY0Vk4OVjm5Bkdy38Eny04owLZ7HfHLPS5mL2DQM29L4CdEYoJxYRiYDvnSIvNbVN1hpE3nMERewOrM7iP6hs7s/eGd57jpGlqb+gTi3sLcfYyfkbHijYWt/efHOdVn4s59KGK6soDNkIxoZhQDGwnaf26ESQffjZDY/v8wp4HQQpxLBvAZc+t5hYS55A0SfJQBRppaE9xXkxgMULx4q3mFhJn9CAUA5s6fVqMfZw0FgMXQyi+cYRiYFNn6nIHAAAAbGTJdB52TQMA4BCEYgAIK7pZ7hAnntkBwOEIxcCmaEQBAAAAeHe5+3TtQM/s6OQBAIsRigFgC/PSYgAAAOCSaEQBAAAAkBYDAAAApMUAAACAUgMT359C7/FXVaWGJ1KX+dztideFTL8+tH6e5+qJWvWfulPqbuYmAOISIGzFrfc0Nwqq9h4BwN+6ODdh4bjFdV1nWbZs2zzPi6JYtu1GmqY5+hBc8oWRJGv7RM4twWf98XVGXu19yWfh+uswV5A9zirEc+VlF3/xlfc/sICi/divOaSVThdy/YPqIclxqE/1Fp80n9Vm3elDy2O42QPud0Ehm0bdkZd4O9ZssnUoXjWdh9QHzLJ1AlrXtVJKaz2+zvgK4xYMaZSohz4bMmcVgBGHhNwdgioARGJVWlwUxdxQeGyNi9a6LMsDDwAAFosw5BJUAVzJibvcScWJ1GQY8s+hJ4byjeIEcdlkQTUMAFwJQRXAjVuYFmut27Zd8NSsbdtQrdykHLu0uq6bpnFisRPiu3G/Ww4ARGWfkEtQBXDjTlxbrLVO07RpGq11XddFUUiXFDsWy0L7u0RezbKsKAppDydBn4ZxAG4cQRXAjVvVttiY7CW9UW9KE4LN3quqGo/FWuuqqrIsK8tSHvylaepUfgBAzLYLuQRVALcs2CA18sdQY7KtQ+SyftD+W9ljRCwZiSJ5qJRq23c23cuFHTVODRQX/15U12GHkLt1UBVRXVXwdkSFt6PX1pclQG2x6V1xYPXAsqd1POMDcDr7hFyCKoAbFKYRhbql3hX2gEf8kgOu6tjRJCddJuQ615mgCsC2cygO0OVOqgdupyWZPUng0ccCYCvOjKBHH85nLhZyo73OAGKwc4gIMxJFnudlWV4mTANAzAi5ALCFYC2Xx2u5z14HQJe7Y9Hz4EBcfBHbdbhGyI3tqt443o6o8Hb02vqyhKktppsFNkVoOBAXP0KEXGyBmz0qvB2HCNPlrmkaxVsIALsg5ALAFgLUFkv7tqqq1hcFABhHyAWAjQQbiQIAsANCLgBsJEzb4jRNx2ciBQCEQsgFgC2EaVtcFEWWZUmS5Hk+tEKQHQEACLkAsIUw41xMzkFy9q4h9tBp6oXP/vQ8LwZoA06nG9biiWOXCbkxX2QAMdg5SoSpLb6pzh9EbeAWOHd6VHNBXynkElEBjNg5FIdJi+kCAgC7IeQCwBbCpMVChg0y8Voat9HEDQC2cIWQ++TpJmoXQkM44IwCT/6cpqlEamVVdF/gGRmTPwM3LraJWK8Rcq+aEytiOLCNM03+nKapXVHRtq30kuZ5HwAEdIGQm3yYxJUTv3CnXrgLWF5cZwfAT7CRKOxKC5vWummaE9Ve9KK2GLhxUdUWXyDkRpc1Sk785FHAIgnjQHBbh+IAbYslNA81aJPxNeu6PkUFBgBE7nohN4b0MVEPgxxJdOk+gDmCTf7cW28xshwAsBghFwCCCzmdR29RIy+dCI0ogBsXWyMKdfKQG1u484zS0+VEdl7AxZyjy52MLZ8kSVEU9b2iKCRAD01PelKJ5ehjAbCV5GlHH85TJKheJuRGe50BHG7nUBws6S6KoizL7vI8z082jmYfaouBGxdVbbE6f8iNLdxRWwycwjlqi5VSRVG0bVtVVZ7naZrmeZ7nedu2CwK0dBZJkkRr7b95URRmq6HWdVKbIlUsk4Wc4qsFwG2SkCuRdjLkElQBwEdc9R9KqbqusyxzFk4epIxJZC9xqkx8iu0WYtahthi4cbHVFvu7ZFANjtpi4BQirS2u6zpJkgVdnkcqFYTE2aqq2rZt2zZNUzU1On1RFE3TpGkqm0hDZ+fxolOsaZk3VMi5BsYHcG0/+9nPkiT52c9+NnfDJEn+7u/+ThFUAcBDsEYUQUjGnOe5iZuSeXfrG2wSrE2OrrWW4Gvyb3kpTVNTbFEU8t1gyDp2oi+bj+8aAOJHUAUAH6vS4izLkpnGC5RY7FQnS6gdH6TTCcdSgqnbkH86xUo0NwuJ1AAi953vfGdZyCWoAoCPuGqLe/lMF+LzVM5ZxynWqQsZ2SMAnBpBFQB6LUyLtdbtUnM7I69viNZbaeEUK08Ay7KUHtNaa2k5d9JONgCu5Nvf/vayeKuU+su//EunNIIqAPQ6QW2xGK9m6EZ55wngEDu4m0KappHlvYUsbiICIGZrGoCdEUEVQISODcWnSYvn8mzWZmK0jI2fpqndsbppmu57MF4xA+CkJqtdbxxBFcAOjg3FJ0iLfRq6jVd79NZPOJuYntfdjtUMQQ/gSgiqANDrBGnxOP9Gcr1R3u4j0g30ErvpJgLgdhBUAdysuNLi3mGD5J9DtQsSgp1x5p2I3NvtWgr0qS85ZPD55MNk6//2PykAOyOoAoC/uKYzldlE0zQ10ba7RD39VE7dzy9aVZVZ2F0irdnsk3WWdFcwC6uqyr782Ryn+0z+vAMmJgX8Jeec/PmqQTU4Jn8GTmHrUBxXbbHWOk3Tpmm01nVdF0UhA/rYtRqy0I7g8mqWZUVRSHCXGUftdczEpFKshGZZ6KxQ3JN1nHKuhApj4PIIqgDgL3DS7TxTWxb7JASbf9r1E8rq3exUdUisF86r9obmn3meO88QnULsdVZWAMRZW6yozAC8RVtbbMe6oZB7vaAaHLXFwClsHYrDlC41CkPD93RjpQ/noV6orfy7YNvr7J8WbxdPidrAAlGlxSMhV+pie0PulYJqcKTFwCnEnhbblRDm0Zg8rVNK2YE7TdOiKE767Iy0GLhxkaTFvSHXOFHIjS0QkRYDp7B1KP7c4i3N47PeyuDuLKDyNG1ZzXFU7LHoY/iaBLCF2KZYGw+5vSufJeQSVAEM2TkUL0y6Jcd1Gqj5bCW1F/GHaccpaoujqpMGLubY2uLrhdzYAhG1xcApRFpbrLVecFimcQUAwB8hFwB2ENcAbQAAAMAhlrct7hVkgDYAgCefAdoAAD7CpMVbDNAGAOi1bIA2AMA4BmjzcorOcHS5A7bDAG1hxRaI6HIHnEKkXe7UDQ/QBgD7u/AAbQAQiYVd7uq6Lsuyqqq2bX1irqTFVVXJgEHLdgoAt2lByG3blpALALMwQBsAxI6QCwA7CDwShbK6RUfbpm0lJmQCbkFss9xJaJ2Mq3Vdn66GmKAKYMjOoTjkuMVFUSRJkt1LkuRcodlTazn6WABspX3asQcjfTOyLPNsVbzLQQUTz3UGEJudQ3GwtFhr3Y3FZVnGVuMCAOdVluVVH8QBwOHCpMUyKlCaptIjxJbnOUEcANZL01Qp1TRNkiQ0GgaA4MKkxUVRpGla13U3A75kOwoA2J90vJPk2KdBBQBgluVpcV3Xyb2maaQCo5fzEqEcABar6zrPc0WDCgAIbXlaLPUWpqVEt/mE3T7a/idpMQCsURRFVVWKBhUAEFSYRhRa6yzLusulRjnILgAAhtOggswYANYLlhbneS5tJPQ9GaxNKSW1GgCAsEyDiizLaFABACsFm85DmkaUZdk0jb28qiqCNQBspCgKeV4nDSqOPhwAOLGQs9wVRVEUhcyxpJSSOuOA5UeCCZmAW3CiFFMaVJzogB0EVQBDdo5s4Sd/vmo2bBC1gVvg3OmHJ51pmo6H1rZttdbO87pTIKgCGLJzKA6fFgMAwtJa+3SqMw/rAAALBJv8OSCZFkR67/mP5iYN7GSroS+GoijGx042u5ZyFhw8AByo93kdQRUAvAwNNnyU3mErJreSUYpseZ7PLbZ3HRmPWT1R5r8FJ6XUnVJ306udYS/AbTo2Wj5+/Fgp9fjx4wVbvfbaa9cLqsF5xs/pciI7L+Bitg7F0dUWmzHd5PgkNI/XMRRF0TRNmqayiQTisixHipUhjZwWKs46Uk7veMwAsKdXX331tddee/DgQZIkr7/++uT6r7/+epIkDx48eO2113784x8rgioA+Ngu415AAqtTJzF5nN0VnHIkFpsQL+S7YXzXZp1T1ONSWwxsJ5JoaVf9vvjii6897cUXX7Rfba8bVIOjthg4ha1DcVz3bW+wljA6NLl0b3R2iuotwQnZ498Tp0hYSYuB7USSFgsnA7ZJrmzWvGpQDY60GDiFrUNxdI0ouuRh31CHDzNGsmc5s4oFgAi9/fbbH3zwgQTxx/fknx988MHbb789vjlBFQB6nSYtXqN3IM9usWma1nUtPaazLBvpWw0AkXj1nv8mBFUA6HWCtFiM1zT0hmOfYu3g3jRNlmVpmuZ5Lk8Dy7LslpwM89kjgDiN3NqXvLsJqgAidGwovux0Hp5TPUmgN18PeZ6bygwZj7Npmrqu1Zc/26RlQibgisZvbVI0giqAHRwbik9QW+zT0G282qO3ksPexBTuPOCT6g2axAG4EoIqAPQ6QVo8zr+RXG8gHt98vAcJAFwPQRXAzYorLXaevgn551BHDQmyzjjzsompz+gNxFKgT30JE5YCOCmCKgDMsOnwb3N1x8vsHUHTGSyzO4Jmd0n3ZJ0lI4PeV1V1ihGFGbcY2E5s0dLTVYNqcIxbDJzC1qE4uvtWgm+aplVVSVR1YrEs7EZ5ib9VVZkS7GLtoszfvfHa7jRt1jlFwkpaDGznLGmxxC57ySWDanCkxcAp3Fxa3N4HcaN3IqVuVYe9SXd+ptYK4r3hu3fXn03XdIaElbQY2E7kabET35xXrxdUgyMtBk5h61CctLGOjFPX9YL2Z5Nb+XfBttdJPvxsQJD2+dlXLEkeKqXa9p2J1c6wF+A2JUmM0bIoirqu7aHT0jQtiqI3xF0pqAbnGT+ny4nsvICL2ToUByi9russy+zBKa/HjnTqhc/+9Lx6SfJQqbZtH/nvhbQYOFZ3dMx40uK6rouicAYSrqrqRF3ZVgbV4EiLgTjtHIqDjURxOwPuOJX54x4//vXXv/59pVqlVJLcfe1r33/8+NfbHyOAtbpP7g4nFbcykbLkxNJsVymV5/mJcmJHbNcZQDx2DsUB0mKtdZqmn05cBMvjx7/+7ncf/f73f1Aqkf8++eQP3/3uIzJjALPUdd3Nhtu2XdYuAgDQK8zkz0VRFEWRZVmapr0x+sLtK0Z873s/+dKXPv/xx5+YJR9//Mmzzz7z8OFPPvroGwceGICTunZzNQA4Vpi0OMsy+aNpGqe5m7hIHH/hTimVqIfeG7RKuW1iPtEh8t0AACAASURBVP74k48//r20Y+u4+/T/n0y0QgZwm8qylBriiwRVAIhJmLTYGaYHSilpTzz6qpsxA0AvrXVVVXVdl2UptQ9lWcqgE0cfGgBcR4xDDkVoWefiJLkbyH37R6VgJAogWvEM0NY7DMXpGlfEFogYiQI4ha1DcbCRKND11a/+0bPPPuMsfO65L/7xH3/lkOMBcAFa67qu27Y1888ppcqyTJJEXjr06ADgxBamxdItem78la3OVaWxxjvv/Ok//dMf7Mz4uee++I//+D//6q/+9YFHBeAaTH6c57nkx03TZFnWHeYTAOBjYVqstc7zXOKvT5pbFIWMLnS6J31rPHjwjZ/+9O6ZZz6vVCv/feELn/vbv334ne8wDAWAYGSuu7YzGzMAYJa1TTSKoijLUv7ujs5mz0qapul5n+4xyx1wa2Ke5e4CmOUOgI+dQ/HakSiKe5IBd0dnk1z5SjXES98PHmsCZ+Lc6TG3TDj7pB783gAwZOdQHGw6D/O3qRI+dZgGgAhJHYRT12AGpripVmoAEFyYtNhGNgwAWzDVJE6Y1VpLWiyTfZy3uRoAHIsB2gDgBEwqXFWVUyVcFIWM16aUapqGCmMAWIa0GABiJ5030jRt23boiZzWWhrhmW7QAIBZSIsBIHbSLsKnGthM8AEAmIu0GABiJ2mxT88NWYfmxQCwAGkxAAAAsMFIFDiRp0bU3wxj2gMryVgTPuMTU08MAIttXlss0z5vvZc9JZajjwXAVpKnHXswkg1nWTa+mplY9FwDZcZznQHEZudQvFVaLNlwkiTX6xPdWo4+lnPYp04aCKt92rEHo7WWvnQj+W5d15I3y0htJxLPdQYQm51DceBGFGYWaLMkTVMG0QSAleq6TpKkaZokSdI01ffqe2aiu3NVFQNARNoQqqrqjgpUVdXK0tI0zfPcc6s8z81WQ7vO81yOzadYezX1RJn/PI/n6aLulLqbXu1Ce1m/IyAqoaLlSiaI9RqKbNcLqsH5R7aJciI7L+Bitg7FSbuiRrqu66IonLphrXVZlnmeL6skNs8BbZMHaeY+NZwDmFustF9J01T6r9jNABZ0IEuSh0qptn1nYrUL7WX9joCoJMmqaBmWBDczx4dUDw+F3EsG1eD8I9tEOZGdF3AxW4fihW2L5XFelmUSN00NhE9H6XGmbZyk7ZPN6ZRSkprL/E/t/QyoTptmp1ip4Rhqu02rDwAxK4pCWqxJ1JV/Dq1MUAUAT2u73JlsOEjUk0LstnFSr+BUWjgkWJthibTWEqDNIclLpk5FXhqaC6qu6+t1EwRwmwiqAOBvbVpclqXWOlRNgIROpzQJtUODcZrobC+UEkwgln86xQ49djxpV24AN0IeymmtzYhFI0GYoAoA/hamxVrrqqqk/qBpmrIsJTRvMZL8+Fymc+dEHS9WFsbTghAAbFprab1mV/faQdizEEVQBYCO5bXFUj/RWn2cm6bJsmxywPkFO1pZQu/jwm6x0pxuvKM3ABxFBmhTSuV5bg8NYVdSLEhnFyCoArikANN5SCVx+/QwbcHrj8fL6YbjoVZuDju4l2XpM8pyMsxnjwDiNHJrx3B3S5STbnBFUdhBz1RSKKVkjmifAgmqACJ0bCgOOcudyY/NaJdSf3xIaBvvUGKYQC8H6fN1MjLc3YrjBXCw8cEsjz66T2PaeIyS9rsbDftAUAWwg2NDceBZ7oQJykVRrO+A7NPQbXxguDRNuwHdDtams7ZZ6P7x5RkHDABh9XaD65IwOJm/ElQBoFfI2uIuea63aXbv30iut9LC3rwsy+yeZPMbtZYGgAV8wp1nU4eVexEEVQAXs0lt8eJJPaQGwtlcIu/QY0FZsyxLZ/olZX09yHRNTrGyvizpHq1MH6Xux/vMFEEcwPkQVAFghvE2HJOkGbGZ5l6Y0OksnyQN48zUSr1LZGF3d/bC7pLuyY6fvrPfldPcK3Wn1N30ahfay/odAVFZHy3XkIjkE1El+jkbXi+oBucf2SbKiey8gIvZOhSvqi02fem6o1dKrUBZlnVd+w9GobWWug3pWG3mRrIrLaS9cpqmptiiKOSpnFRCmGlL7aPK81wGx6iqyhTLsEEAro2geqDkwwuOpNE+Tz9IXNnytNjEx6qqnLS4KAqJvzLsvPzTs1h5Kiftz4bK7x5JVVXSdk1Csx3fzSGp+4ZusiTP8436awPAFkyIm4WgCgCeknZRfzhJebuBsmcHSaIWTXG0rIHy5Fb+EzjZ7B/9C34rJ8lDpVTbvnM7e1m/IyAqSbIwWgYhIdd//d5DvVJQDc4/sk2UE1UN8Qt3Sin15FHYUmN4v3Cztg7FC2uLx3ts2HrH8fGxrNPe5Fbrp3cCgJ1prdd/ExBUAWDcqrTYc5bRboflU7NnJzmw9gjApphibTdXDaqH16om6mGow4irFhy3ZOdQvMkAbdd2pagNYIhzp5Mlb4egCmDIzqF44XQeUvXrM8SE/zAUAIBeix+4yTgSgY8GAC5qVVo82QXEjN9+mRYUALA/rbXWOkkSrbVnfYSsr/w6gQAA1OJGFPZYmEMx2nSdllHcAQCLFUUhVb8SV80owqbSQUKxqYxQHgOxAQBsy9sW13WdJEnTNEmSSIAW9T17ns9gxwsAt8pUQ8gEHGbWJGe1NE0lh979AAHg3FZ1uWvb1kTnpmm60ZnR3QEgODNHkj2NqFRMHHdQAHB6a0eiKO6p+4d35tEeCTEAbIpUGAACCjNAGxkwAOxm2cRyAIBxC0eiAAAcRTo0M/wlAIQVIC2WkYBkMCBx7ZEyE8vRxwJgK8nTjj6cQdL72cTeow9niVNcZwCH2DkUr02LtdZZlkmXO7NQut+dN0aPay1HHwuArbRPO/pw+pnx2oQMDXTg8SwT/3UGcJSdQ/GqtsUm/soobPbwmXVdywgVnoPP49qSDzf/qm6f5wsVt0XCrB1+pXEFURcAllmeFksUTtO0G38lRhdFIQMbL562FAAwpCxLZ8IOrXXbtmesMAaAGCxvRCGtJsbrJGR+uwu3M8ZWXrhTL9zN2mKHCmkgKkOT2PXWVgAAJi1MiyXmpmk6vpqEbLvZMQBgJdNkovdVQi4ALLOqbbFP04g0TYnRmNvwN1EPPbeikhg3aCQtlqdztFsDgAUYtxgAzkdqHJwmalrrsiwnn+MBAHqRFgPA+UhVsQyFafh0+QAADCEtno2R54FbEP90HtKn2Zbn+RmH/o38OgM40M6heFXb4rIsy7IMdShnccZvHQBzOXd6hBmbDMdm6obP256YoApgyM6heFVaDAA41nmzYQCIzcJGFFJL4W9W4TL9h8wd7T/mcVEUZquhpnUyw0iSJEPFmkKuOnM1gBtEUEVAyYfJ9f47+qIiFklsT69k8lJn4eRBaq2dYeDyPLfDtE+x3ULU/YD59j2zYJLhJHmolGrbdyZWu9BeVu5on70A/pIkumjp6ZJBNTj/mDNRTkznFeqk1A0MhXn4mwVPW4fi6LrcSZytqkqqmWWkofE6hqIomqZJ01Q2kW4oTqNnp9g8z9XTLVScQkw53bgPACdCUMXVzJ8GddLl8354Wj7L3bLHYeOP8OSlPM9N4fLkbnxCEAnWdr8TCdBmR2ZOPlNsURTO0J5OIb3lAMC5EFQBYIZZTYRtEt3SNDW1BSOqqpKIadccdPUekmw4tBepfugWaxfVW4Icv4xnNLRrKTzPc/VEmf9Gjn+IUndK3U2vdqG9rNzRPnsB/K2Jlge6alANzj/mTJQT03mFOqmW80I0tg7Fy0eikI4URVHIEzFTbeDUSdR1baolpEnZ3B1J67Sh+mnZi0+xzjoyHZSpyeiOAKoYFR/AFRFUAaDXqgHaTPfkoijKspT0tzuScZqmkkMv3svK0ZF7Hxd2A7qzQl3Xst+iKMoPb254ZgBXRVAFgF5hxi0uikLaitV1bTdHCzgcz3gdQ3dHaZqON54TQ+tIoq/6KjxGhpJuz9lR/TJ26DNBb+ULi3DCjk0RVAFE6NhQHHg6j7Cp8Bo+4Vsp5fQRUU+POtTb6oMwDVzS+K19a0lzF0EVwA6ODcVhBmizK4mD82noNr73bpge2kRrLeFbeo1EkuJjK/NH+WEQH1wAQRUAegVLi7MsO6QvhX+QHQrZ5u8kScwom4wfBOA2EVQB3Kzw03nUdZ3cm1sxIDUQTqg1vfp6N5FdON1HzJia9jpOsVKgPeimUirPczpKn1f7fDvrP/+tjj0vYDGCKgD4C5wWm/HaRNM0s1qBSBh15heVygZ7NSfIduO+U4784UR5aSdnIrjpH+1/tAAQOYIqAPgLmRbL4Dt5npsx3qXHsX+dsdZaOjvL0G8mybYDqyy0y5RXsywrikJG4pSgb69jJiaVYiVZl4XKiv5JH8I6gJMiqAKAv5AjUZRl6fQy1lq3bTurwtiE4PGeyzatdVVVWZaVZSn1E2ma9j7dK8vSFJvnOaEZwOURVAHAUxJkZBwZkHIo1MpkeHPbGQ/NwLRyK/8JnGz2+AMLWpomyUOlVNu+czt7WbmjK+0F15AkYaLlga4UVIPzjwYT5cR0XqFOSnFeiMbWoThMbbGZ87M3MnqOdtktc4utGB4IKzFpCE6KoAoA44KlxWpgsB6nb/IF2G1Czl57BGBI/PN3DNVELKsVPhBBFTG45LD0F6hk2TkUB+tyJ706nIZlUovcO/D7ebWWo48FZ8CkIefUPu3ow+kxNFq8PRzQKUR+nQEcaOdQHCwtluhclqXd3ViaTzBoJQAAwJj5dSiTqGSZK+RIFNJz2V5Cx2Rcz+yOfeqh51bELwAADhQyLZbh2Ezd8LkatwEAgJt1eDNc/zqU6aKoZFkqZFosyIYBYAvdBmnOEsIvAKwRPi0GAGyhKApnvEsz3YaYnKcDADCCtBiIEaMjo8upG06ShDwYAAIKNhIFgINt0IsZAIDbQW0xcKOSDxMqjAHg2q7W/e7JtsWTFs/GhEy4DJpqjIh/lrvLIKgCVyaPMZ88Ovo4vJAWz0bUxg4WZJOeg/vsXHOwz+62SL6dOz3CLPkyE4gSVAH42/RRJ2kxgDmi/N2/R/K98ZO7BYYmECXLBIBlSIsBxGef5DvKFB8AAjq8JVuoaUr2efZIWgzcrss01dgHnRQB4NpIiwFsi+QbAHAKpMUAroDkGwCwEtN5AAAAAKTFAAAAAGkxAAAAoEiLF0gsRx8LgK1wm++GoApgyM7BgbR4ttZy9LEA2Aq3+W6iCaq810B0dg4OpMVPqetaa50kida6KIqjD2cBwjqAiMQfVB8//vXXv/59CZ5Jcve1r33/8eNfH31QAI4RMi0emol0aHls6rrOsqxpGqVU0zRlWZ7liR5hHUCE4g+qjx//+rvfffT73/9BqUT+++STP3z3u48IocBtCpkWZ1nWmwFnWRZwL9uR46yqSqrr0zRVSmmtDz6sKdcN6/vUfFO/Dmwl/qD6ve/95Etf+vzHH39ilnz88Sdf+tLnHz78yYFHFdRVQ9xVz+uqTvN+MZ3Hp+TpXp7nJmTXdZ0kidRzxKw3rD/77DMPH/7ko4++sc0+N/x8P3786+997yem5vurX/2jd9750wcPAp/IPnux7BYRrvRb4kp7uUVeQfWFO3U/r8pBWqXcCuyPP/7k449/nyTLjuru0/9/8mjVca2ze4jbyVXPy3KpiHTG94u2xZ8qy1Ldx3FD6jb2bgTywp164S5JHnr+99FHv7NzYvHxx5/89re/611fypdvo1l2aKqxT833bvXruzVu2WdH7AWzRBRUB42nIGdNUK76CPGq56UuGpFO+n5RWzxGa900TV3X6ttHH8qgybAepiWffL6/9KXPmwLl8/3Tn94F/OW3T833PnvZ54rttiP2giDcoPrkkVo0cXcoSTJYQdC2S6p7Y5gq/IhHiHu46nldNSKd9P1K1ox54fziz7LMfl6m7tuQJcmqvexDOoI4xyn9RfI8L79dmoULIrg8jGvbdyZWs+Kp/16S5G4g9217w/qyvXz969///e//4FRLP/vsM8888/mPPvp3/QcmO5pXLT2UxwfL79fu5ckjz4u2/IrJoWz21rCXffaCTYNqKF/72vc/+cT9MDz33Be/8IXP/fa3/35BgYviXnD7BNL9bXle3rE9uAVfFpMu/jnc8s1albDK7/6RFaqqkqF5Tp0Wp2na/IfPTvOJejK38BdeeKSUevJk4gP6gnphwV5eeeWv/9f/+v/+x//4g73wX/yLz3/+8//s7/7ufx/cy+y7ZYc4Kxd/aC9DL8W5F7XjN1P0vyUus5fjvjjPyD+oWpHPtfV3h6moM0nJc8998R//8X/+7d8+/M53llRoRZCO7BbidnbV81IX/Rmz5fu1ZShe1YjCqS1OkkTy4DVlxu/555/fasMPl+zlP//nf/bd7z569tlnnLD+13/9fzz/fF9Y/7Bn2ZR1TTW8P8ELHmguqMlbvpcZX3U7NW7Za0fsJWpa62hHBfZxYL3Jgwff+OlP7x4+/MnHH/9elnzhC5/7L/9lYU78mUMbhwRvGaLieGay4Xkd/zNm5NV4K1bHnbSFEm2Lx0jer7VuVLzjUSwM6zOj9sqE1dNXv/pHQw805xa1yV7mXLR9UvwFO2Iva/YSIamUbZpGkuOjD2dChEH1wYNvfPTRN5Lk4VDDs9PZJ5Dub8PzuvTPmKOc9HPISBRX8ODBNz766N/Jb8q2ffTb3/77tVUdHV/96h89++wzzsLnnvviH//xVwLu5Z13/vSf/ukP9o6k5vuv/upfn24v+1yx3XbEXuIkeXBVVWmaDo0cD2/HZxJB7BPi9nfV87pSRLKd9P0iLf5U77BB8s9TPZrcKqzv8/mWmu9nnvm8Uq3894UvfG5xI79j97JbRLjSb4kr7WUH0rtDmq5JsIpq7qSrBNXz2SfE7e+q53WZiOQ46fsVMi2WIHhSEqbtYF3XddM0pz6pgHb7fO9Q873PXva8Ypf5LXGlvWytKIqmaezBf6SFbjyzKxNUD7RPIN3fJc/rGhGp1xnfr5AtPIae38U/DIVSSmudpqm0zyuKoq7r3rHob9nuLfD2+XbfcC+7XbF9dsRe4iEBKk1TJ0C1bZskSSSD/xBU4xDLz6TQLnVeZ49IHk7zfkXd8HlndV3LQ0nzIPIWBtZY5DSf72jsdsVO/1vionsJyYxx1lsTUVVVlmWmWcWxCKrATOeLSBdDWvwU+SKRUH7woQDAgJHkUmtdVdW+hzOGoArgREiLexC+AURrMkBFGMEiPCQA6GIkitkSy9HHAmAr3Oa7IagCGLJzcCAtnq21HH0sALbCbb4bgiqAITsHBxpRAMAp1XXttNw9xUR3ABAt0mIAOJO6rmXQYnuh/FNGQJOB28iPAWAu0mIAV5B8uKDl2d3SDY8hQ7PJ32ma6nvmVXU/zYesluc5gwQDgD/SYgDbuoWEdQcyALBMa9dbEywLzXDFRVGUZVmWJQ12AcATaTFwu0hYz0JaD8+aoaN42lZHBgAXQloMAF7a5w+rdl3cl46EGLhxEdRinKkyhbQYwOktTFg/3egdn3WTJFHHNUaQbnZa68k0tygKM0IFAGAW0mIAG9ohYb0RTdM0TTPZVriua2eQCgCAJ9Li2eypVujLgo3s0+p3Sc56MwlrtDOuJUlSVdWVxl8jqALwt2l7NtLi2YjawC1w7vQYsuQ8z6UyOMuyKw2+RlAFtnNgp4j7I5D/C1OZsnV7NiZ/BoDTqOs6z3OlVFmWV6owBoAYkBYDN+r4KgQsUhRFVVVKqaZpkiShdx0AhLJJIwrpMU1NBrAYrX4xQmvdtq1M8HGxBhUAcKDwtcVa67IszQylAIAt0KACAMIKXFtcFIVMT1qWZZIkdKTA9cwfI+JMI5njXOTRXJZl0qCCkAssFkGU5svieCFri+u6LstSHudJdI6h7zYAXJg0qJC/kyRh0GIAWCxYWlzXdZZlaZqaJm7SKYRHewCwtbZt0zQ9+igA4NzCpMWSE8sfZqHWuqqqpmnIjIFZGCMCDq11nufjsdQ0NQZwSk8eqSePwhbJt8lcYdoWS07cbdYmobwsy6IoLtNRmgmZbtzsKMMAEecUWxswnxB60khLUEUMyCDjtHMoDpAWF0WRpunQ2JkSo680siZRG7gFEc5yt8x777338ssvH30UYwiqAIbsHIoDNKIoimI8651cAQAw4r333kuSZG7r4TfffPO82TwA7C/GWe7qutZaJ0mitfZ/ICgDFclWI1XXSZIkSTJUrClEyllw8AAQ3Msvv/zuu+++//77khy/+eab77333tDKb775ZpqmSZK89dZb77777ssvv0xQBQAf0Y1zaXrv2SYPUmZ7spc40z75FNstRClVVZXW2h5HcEHzoyR5qJRq24nWpVfay8odXWkvuIZIRgV+77333nrrrffff98seemll+QPe6FSShJiddGgGpx/NJgoJ6bzCnVSivNCNLYOxYFri+unLShB4mxVVW3bmiGHxusYZA6RNE1lExkYrizLkWKlv7b9eNEpxJTDdH0A4vHyyy83TdO27RtvvCEJ8fv3lFIvvfTSG2+88e6777Zta9oTE1QBwFcbQp7nI43e8jz3L6e7/uRxdldwypFYbEfn9v67YXwvphz1RJn/PM/l6SO8U+puerUL7WXljpbtZfZ/6k6pu7lbzT0XXEOoaLmzqwbV4PxjzkQ5MZ1XqJNqOS9EY+tQvLa2WBqNlWUptQJ5nud5XlWV/CFRUiaCHmmdZkhthNNGTQoZ2laWO0m5lGDqNuSfTrFSWTLezI6WcABOjaAKAP6Wp8XS06JpGlN/UNe1jJopvTpkAAp5SWoIsixbMKamhNHxCO4Tap11nGKrqpL6j27hAHAlBFUA6LUwLa7ruixLaVXmOch8XddVVUnqPGtf62sXun0+usVqrZ0lco7KbxR9nNL8KYXok4ELIKgCQK+F03lordv5PQF92lEMGd+wG+XTNO0N3I6hdYqikPDdre0YGQd0wTVBQOSsWOPWhvglqAKI0LGhOMzkzzYzmqYzr9LcELyST/hWnfZz6ulRh2QgIWcFwjRwSeO3doRJM0EVwPUcG4pDpsVvvvnmW2+9ZS954403fvjDH6qB0SttvbFS+DR0k8Hqh17treTo/UYxx+mM0AkAUSGoAkBwwdLiNE2dweSVUm+99dZbb70lvfFC7cihtXZG0xzSG+XtJfITJE1TOoUAiBxBFUexp8A4yF0ch4ELCjOdx3vvvff++++/9NJLMoy87Y033hgZ0tjRO2yQ/HOomkFCsBPEnQGGertdS4Emgss/8zwnfAM4KTMVs1lCUAUAf2Hm0JNYOfREz7OjhrpvgmZXLXSXqE4VhTyks58YdpfI94R9ss6S7gq2K03LzOTPwAKRTP7cS0b4scOsOdSrBtXgmPx5oqgbqJo9/P2Cj3gnf37vvfeSezL1aDLAeenNN98cKlNrLTm0jFlRFIV01LBrNWShHcHlVRkUWYK7zC1ir2MmJpViJV7LQmXVefQeP+3hAERIwl2SJFmWSU4scyrZ3xkEVcAHOTHE8rbFL7/8sgm+b7755ksvveQMPWHMSu1NCB7vuWzTWldVlWVZWZby4K/blM1M0WSKpf8HgDPq1g2r0fa7BFWERQaJCwtTF/3ee+/9yZ/8SbcoWa4Wjb8z3g968Vb+EzjZrtS8gUYUwAKHN6Ko69pMh2Hkea61zrLMJyW9UlANjkYUE0XFdF64ZVuH4jAjUbz88stvvPGGPER76aWXZKEZmOLdd99dUOayQTcnt1o/lqfdnSXatoYAVopqoGJ76F/1dL2sf4c2giqA09k5FAcboE3GJ37rrbecYdrefffdocYVJ0XUBm6Bc6dHkiVfsqECQRXAkJ1DcZgB2sQPf/jDtm3ffffdN95444033pDB2i6WEwPAgcqyTJJE+s8dfSwAcDXhJ39++eWXSYXhmD+4D6O1A5/RWsu8SNLZzvSfc0aHAACsEbK2GACwHakkbtu2qiozWrx0wpMOeQcfHwCcHGkxAJyMyY/zPDf5cZZlMiQw+TEALENajItgzCDcIEmCJT+WJfZAwgCAWcK3LQa6Zuesn64eYLhN4BYURSEpcndsYwCAJ2qLAeAitNZFUTDeGQAsQ1oMAOdGfzsACIK0eLbEcvSxANhK8rSjD+dTWmvpV2cvLIpC+tuddLC2CK8zgEjsHIpJi2drLUcfC4CttE87+nBUXddJkjRNozrzLRdFYcajOGNmGdV1BhCVnUMxaTEAnICML5Hnedu2TlpsxmuT5PikdcYAcDjSYgCInbSaSNPUaT7hkBbGUqMMAJiLtBgAzmE8JxYygDE98ABgAdJiAIidpLm0jgCATZEWA8A5UAcMAJsiLQaA2Ek9sU9aTL0yACxGWgwAsZNWxZOzOhdFQX87AFjsc0cfAABgWp7nZVkmSVJVVW9lcFEUkjcz+m8kkg8PH0P6Lo7DAE6DtHg2e7R8vn6Aq4ptXoyiKOq6bppGBjBO09Qkx7Jc/q6q6qgjXIygCmDIzqGYtHg2ojZwC5w7PYYsua7ruq6lpYSwX03T9KR98giqAIbsHIoDpMV1XWdZdt6IDABnIRPaqfsU2Sykjx16PHkUvMj2eX7D4NLaEAIW1bZtVVUyhWmapjLTqY88z81WVVUNrSOH6lOsvZp6osx/nsfzdFF3St1Nr3ahvazfERCVgCFuf9cLqsH5R7aJciI7L+Bitg7FSRvi6ZVUGOd57jMJk09RzsLJg9RaO88TnYOZW6zU0psqcLvLwoLfyknyUCnVtu9MrHahvazfERCVJAkTLcP6+c9//uqrr46vc8mgGpx/ZJsoJ7LzAi5m61AcZoC2uq7TNJVe0rqPf1ESZ03NhNRVjJcgLe3SNJVNpMeJM5KRU6zUcAy1UFmf3APARl5//fXk3oMHD8zfP//5z3vXJ6gCgK8gdc6h9iKB1XkYN1lCdwWnHInpJsQL+W7olmb34zabDnRdvwAAGWVJREFUXKl5A40ogAVCRcs1Hj9+7ITWF198cTzYXjWoBkcjCuAUtg7FYWqLfU7Dh9RGOPUKEmqH+vPJclnHcIa+l386xUplSbcOw1SBeB4zAOzg5z//+YMHD5RSL774ogmtH3zwgfzx+PFjSZGd+lqCKgD4O8Esd+OznvrPdOqs01usLPTP4wFgH5ITv/baax988EH31VdfffWDDz6QzPj1118fL4qgCgC9DkiLf/nLX85af/3AQ72zoXaLleZ0pmM1AMTm7bffHnlVMuYf//jH44UQVAGg18K0+Je//GWSJN/85jdnbfWDH/xg8TjM44Mid8Ox8wRwiB3cy7JM03Sya0gyzGePAOI0cmsffndLd7rXXnstYJkEVQAROjYUL5zO45VXXvnFL37xrW99K0mSF1988Zvf/OY3v/nNV155pXflH/zgBx988MGvfvUrpdQvfvGLZ555phuOg49F31uZ0WUCvVxrnxlJeBoIXNL4rR1hitYbr1588cVf/epXdV0TVAGc0bGhePksd6+88krbtr/85S9/9KMfvf322+bRnukZLXmwIWn0t771rd7SqqoaCuI+Dd3GvwPSNO0GdDtYS2VGnudmofvHl0d2DgB7644rLCQCZ1lGUAWAudZO/vzKK69IJbGpErazYacieYsqAa21M5rmkN4oby8py9IpqmmaT8erf7LuKAEgqKFaWGnbtibYElQB3Ky1abHxox/9aH0hUgPhhFqJ/kOt02TNsiyd6ZeU9SxPqlWcYmV9WdKN7HVdS11Inuda60y5kzkBQPwIqgDgL67pTGU2UTM7aO8S1amikABtPzHsLpHGKPbJdpeMHMmVpmW297LEC3dKKfXk0ayNmAQVZ5ccOvmzGbTYkznUqwbV4Jj8GTiFrUNxXOMWa62lbkNrXdd1URTyuM2utJCF3SqKLMuKopDgLtOW2uuYiUmlWAnfDBsE4NoIqgDgL1gjilBMCP60/dlobzyhta6qKssy047NqQhR1hRNptg8zyeHDQKAGLz66quLK0gIqgDgKa5GFLZlAwxNbuU/gZONRhSfmd+IgieJuIBjG1EEcaWgGhyNKIBT2DoUR1dbbCwbdHNyq+BjeZ7akuRbPVy2IYBjEVQBYFy8aXG07KGkz157tMD62hTgFCKcv+OqbjyoAhixcyiOq8vdKbSWo48FwFbapx19OJ+RLm5rVohNnNcZQAx2DsXbpsXSPZlKFwAIqCzLkRnssizzmXIZAODYJC2WLhpJknhOlQQA8CTDRMiYa85LvWMSAwA8hUyLTTacZZnMZpSmaZ7nPBcDgIC01nmeN03jNJaQsdLIiQFgmQBd7qQdm+TBBtUVALAdM2yw+Xt8kjkAwKTltcVmZiNTN6yUyvO8qirFkD0AsLGiKNI0LcvSDC0s4RcAsMzC2mJpwWb+aU9uRCUxAOxDEmKJxpNz1wEAxq1tWyxNh881GBAAXEZd12makhMDwHpr0+KyLJMk0VrfTiVxYjn6WABsJXna0YczZtmszvE4y3UGsL+dQ/HCtFhr3bZtVVVpmiqlmqbJsuxG8mNGngduQbTTeVwP1xnAkDNN5yFJsJMfS8/ouq4vnx8DAADgMsKMW2zy4zzPnfrjoijIjwEAABC5wLPcSRIs+bEsKcvSHrMCAAAAiNAmkz8rpYqikMYVJj8GAAAAorVVWiy01pIfb7oXAAAAYKVN0mL62wEAAOBc1qbFWmvpV2cvLIrCjNe2snwAAABgB8vT4rqukyRpmkYp5aS/RVGY8SgYnh0AAADxW54Wy/gSMvmzkxab8dokOb5YnTETMgG34ESz3J0d1xnAkJ1D8eeWbSatJtI0dZpPOOwa5cugByFwC5w7nYxtOwRVAEN2DsWr2haP58RCBmijBx4AAABitjAtljR3o9YRdV1LTz4Z381zq6IozFZDWXhRFFIJP1Ss2TX9BQFcBkEVALy0i0ij4aqqJteU2mKfNUVVVQsOUo7HJo2eZxXbu44cuXqizH+eJ2JT6k6pu+nVzrAX4DYtjpaHu2RQDc4zfk6XE9l5ARezdSheWFssP/p9mkbMrVeWnnwmjfbptFcURdM0aZrKJhKIy7IcKVaSdaeFirOOlMPM1QBOjaAKAL4WJ9Q+m5uZnz3LlPWdOonJErorOOVILDYhXsh3w/iuzTqnqMelthjYzppoeaCrBtXgqC0GTmHrULy8dJPyDjWQmJsTtwPBerzBRm90dorqLcEJ2eOHeoqElbQY2M5J0+KrBtXgSIuBU9g6FC8ficLM2WEmtCvuSQcLeeLW27ZslvEGG/6NNLqDK08WCwDXQ1AFgF6rBmir67qqKjOhXXlPBiqWyob1XY/Xl9A7cHK32DRNZaDlJEkk1/fvsg0AZ0FQBYBeC6fzMMzAPXVdm8oArXXwgXjGaxp6w7HPNCL2Ok3TZFmWpqmUJim+fV5iZCjplkHpgdO6tQk7CKoAInRsKF6bFhuTqfDcELyS59R6UtVtji3Pc1OZIeNxNk1T17X68mebEKaBSxq/tSNMmgmqAK7n2FAcLC0WMnJ7d7nWejykVlU1FMR9GroN7Vf0VnLY3yhmW+cBX57nUrehvj2ycwDYG0EVAIJb1bZYmFmOTOsxYYfIuq7Hu/4trtjw37C3ZmV8c//hmQFgTwRVAAhubZc7M+KEsCdGkhR5VoHO0zezF9WpcjBMk7XuJuZgegOxFOjT8IMJSwGcFEEVAGZYPLSbGXmtO7ylvGoC6Nwy7QJ7R9B0BsvsjqDZXdI9EmfJyKD3VVWdYkRhxi0GtrMmWh7oqkE1OMYtBk5h61C8dpY7J+Q5JJKOr9O7SZqmVVX1zhgiC7tRXnZk0nEn6NtFmb9743WapnmeO+ucImElLQa2c9K0uL1oUA2OtBg4hdjT4lCr2eyWGGpgIqVuVYe9SW8FtgnKIwm9s+vPpms6Q8JKWgxs57xpcXvFoBocaTFwCluH4qRdNDJOXddZltkj7wyR5sUL9jLeD3rxVp5dsJ11kg8/ayTdPj/7XJLkoVKqbd+ZWO0MewFuU5IsjJbxuFJQDc4zfk6XE9l5ARezdSgOPEBbl+cI8F3L+mRMbrVgRlMAuACCKgCM2zwtvh57eI2z1x4BGBLh/B1XRVAFMGTnUExaPBtRG7gFzp1OlrwdgiqAITuH4gDTeQAAAABntyotLssymbKsYTEAAACwJ2qLAQAAgKVti7XWtAYDAADAZVBbDAAAAJAWAwAAAKTFAAAAgAqSFtd1PT4F9OQKAAAAwLHC1BaXZTk0t2dd11mW1XUdZEcxsIefO/pYAGzFGWvy6MO5Mq4zgCE7h+IAabHWuqqqpmm6mbHkxGmaXiktbi1HHwuArbRPO/pwrozrDGDIzqE4TG2x1jrP86ZpnMYSWZYppa6UEwMAAOCSFo5b3CUJcVmW5m+p6+bXPwAAAOIXciSKoijSNC3Lsq5raVBRVVXA8jGubd9p23eOPgoAAIBTClZbLCQhlrYTVVUN9cPDpORDup4AAADsJ/y4xXVdp2lKTgwAAIATCVxbLOhjBwAAgHNhlrvb1T5Pb0gAAIBPbVJbjPXIWQEAAPZEWjybPckKw88BV8WMa7shqAIYsnMoJi2ejagN3ALnTidL3g5BFcCQnUNxjG2LZZS3JEm01s60eSOKojBbDfX5K4pC5tQeKtYuxH/XABAzgioA+Ehi+5le17UMe2ybPEitddM09pI8z+0Q7FNstxCzjj2K8IJWv0nyUCk1OdfGyr0A2E6SRBctPV0yqAbnGaWny4nsvICL2ToUR1dbbKYCadu2bds0TZVS40MgF0XRNE2aprKJTK0n01APFZvnuXq6Kt4pxKzD6MsATo2gCgC+2phI0Mzz3F44eZzdFZxyJKbb0bm9/24Y+qdTsnqizH8zz0nKuVPqbnq1dXsBsJ3YoqWnqwbV4Dyj9HQ5kZ0XcDFbh+K4aoulNsJpfyaxdahlmyyXdQwpwdRtyD+dYqXGwizsPukDgLMjqAKAv7jS4l4SascjuM9TOWcdp1ipC3Fazs07UAA4A4IqAPQ6TVq8Rm+lhVNsURRpmpZlKT2mtdbScq49ZycbABhCUAWAXidIi8V4NUM3yjtPAIfYwd0U0jSNLO8tJBnms0cAcRq5tS95dxNUAUTo2FC833Qec0PwSp7N2kyMLoqiLMs0TWWUTbOkOxQIVR3AJY3f2hGmaARVANdzbCjeKS3uHb3SVlXVUBD3aegmg9UPvZqmaXfvzjeKdCWxFxZFUdd10zRFUahvj+wcAPZ2paBqj/V7nDsVy5EAOMxOjSjquh4fEWNxxYb/hr01K3Yfke7TPeksQjcRALEhqAJAcHG1Le4dNkj+OTRrqIRgZ5x5JyL3druWAifrSybXAYBoEVQBwF9c05nKbKJpmppo212iOk/35GGi/cSwu0Qao9gn6yzprmAWVlWVffmzOU6Z/Bm4QSed/DnaoCrlRNRo4YU7pZR68ihUecRwYAubh+LFE4FsRGoj0jStqkqGvVTW/KLt/WRL9uxKMt+SUirP86qqTAl2sXZR5m975id7oZB/SjnMcgfcuAijpac4g6qI56qGmuUOwKa2DhqxhCSb0xzNDt9tXwRvrSDeDbvOhoYzG2q3EHsd0mLgxsWTwC0QYVAV8VxV0mLgFLYOGvE+FhzvB714K88u2M46K5s30IgCOLuTNqKwRRVUxQWuKoA9bR00CEleSIuBG0cCtwWuKoBZtg4a+03ncRn2UNIEdOCqIpy/45Kc60xQBWDbORSTFs9G1AZuQds3hAKCI6ICGLFzKI5r3GIAAADgEKTFAAAAAGkxAAAAQFoMAAAAKNJiAAAAQJEWAwAAAIq0GAAAAFCkxQAAAIBiOo8FmOUOuAXM37EPZrkDMIJZ7mJH1AZuAbPc7YOICmAEs9wBAAAAeyMtBgAAAEiLAQAAANJiAAAAQJEWAwAARb/SyPB2HIK0GCdAdDgQFx8AcCNIiwEAAADSYgAAAIDpPBZgljvgFtB6ZB/McgdgBLPcxY6oDdwCZrnbBxEVwAhmuQMAAAD2dvq0uK5rrXWSJFrroig8tyqKwmxV1/XImkmS+Bcb3PpfRXNL8Fl/fJ2RV3tf8l+4pyAHMKsQz5WXXfwTXfkgx7DFx/52XDuommM4pJwgt/nICusjwCH2j7ezNgn7lTe0nLcjkitw7rS4russy5qmUUo1TVOWpc9l1VqXZWm2yrJsKEaPB3cAuBiCKoBbdu60OMsypVRVVW3btm2bpqlSSms9sklRFE3TpGkqm1RVpZQqy7J3TSkfAG4EQRXALTtxWiy1EXmem5At9RBSYzFEgrWpsdBa53luSjMLkyTpDesAcFUEVQA3LjlvL2B5tOccv9a6aZqqqnqrN+T5YJqmzoM8p6i6rmWFuq6bpsnzvPz2Z9G8fX72FUuSh0qptn1nYrUPraHfnm/lwFa+QXNL8Fl/fJ2RV3tf8lm4/jrMFWSPswrxXHnZxV985f0PLKAzfuyvYc+gKknzUVc11H63+KT5rDbrTh9aHsPNHnC/CwrZNOqOvMTbsWaTrS/L1QZokwguXUa6r0pcHn8gKCvIOvJw0HnVTl693S3dEACOtENQBYBInLgRRa/J6AwA8EdQBXA7rlZbLMY7O3ejfJqmsVVgmN7fcQ5Wtf8YbfsP3cIYbXMPLKA4P/a3bLugetSVZ4y23oWnfjuuN0Ybb8f+Ik2L54bglSbD96ctfRe3gnjyaNbq7fOtungjRgC7ii2oiss31wZwLjGmxdKUbWSFoc4fyq+h21AjuUkLOtsBwOGiDaoAEJUY2xbXdd2OWhx/CdwAbhBBFQB8xJgWe5Jx5p0ng/LPoQmWJII7Y2fKJlIaANwsgiqAG3fitFjCtB2sZURMJxY7Ib4b97vlAMANIqgCuHEnTou11tLZWWtd17WZVtSOxbLQfswnr2ZZVhSFtIeToM+jQAA3jqAK4MbF2OXOnwnBErvVaMcRobWuqirLsrIs5cFfd34mALhNBFUAt+wi05ku6wdN72kA6EVQBXCDLpIWAwAAAGucuG0xAAAAEAppMQAAAEBaDAAAAJAWAwAAAIq0GAAAAFCkxQAAAIAiLd5UkiRHHwIAXAdBFcCmSIu3wpj2ABAQQRXA1kiLwyuKIkmSpmmOPhAAuAKCKoB9kBaHVxRF27Z5nh99IABwBQRVAPsgLf5UkiR1Xfe+VBSF1jpJEq310DrYwch7hFC4ERAKn6WTItIegvslEqTFSilVFMXQS1rrsizl4V3TNFmWjayM7XDZd8CNgFD4LJ0U78UhuF/i8bmjD+B4RVGUZTn0knwW27aVJUmSlGWptdZaF0XR/d0mv+o2PNybNPIeIZTFN8JuR4izIKieFJH2EMTeqNx0Wjw51o8EaPNxVEpVVSW/1eq65hfbDhiPaQcrb4QtDw0nQ1A9KSLtIYi9EbrptLiqKvlg1XXd28e5u1B+n9EhejeT7xHW40ZAKHyWTopIewjulwjddFpsHkOY5xQ2+bCmaeosT9OUT+Ruxt8jBMGNgFD4LJ0UkfYQ3C8RosvdhKHmO5PPL2REoeDHAxxi8Y0AOAiqgD9i785IiwfxmQMUNwLC4bME+ON+OQRp8SC6eQKKGwHh8FkC/HG/HIK0eMLQzzU+r7gp3AgIhc8S4I/7ZWekxYOGPnM0dcdN4UZAKHyWAH/cL4cgLZ7A5w9Q3AgIh88S4I/7ZWekxWPyPFdPz8oof8ty4EZwIyAUPkuAP+6X/d30uMWTZEpGmZVRa13XtfzNVEy4KdwICIXPEuCP+2V/pMUT2raVKcjNlOUMnIkbxI2AUPgsAf64X3aWcH091XVNx0+AGwGh8FkC/HG/7IO0GAAAAKDLHQAAAEBaDAAAACjSYgAAAECRFgMAAACKtBgAAABQpMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAECRFgMAAABKqc8dfQDATajrenIdrfUWOw1e7NwDEN3DqO/Jq2LZLkY27F3B88qY4z/wGgIIiFBMKJ7QAthenueTN2Oe5wH3WFVV8DLnGgo1cmxdaZpWVTVrF3Jh0zQdPwZnYZqmk1fGfsuOvYwAQiEU28sJxV3UFgN76P5EbpomTVN7+crfwVrrpmnapyNgDJzIW9d1lmVKqTRNi6KQs67ruiiKpmmyLJt1CkVRlGXZNM3Qq7IjZ3nTNJOVRnJsdV2XZel/PABiRig2CMX9ts67AXTJz9+wP3wl4ph/xlNF0buw98DkFEbqG3rJViMFOtUecvE9C4/hMgLYCKGYUOygyx0QL59mcP5FLSgt4AEIU2cgf/Tubqi+YegUpKjel6Sobv1Q90HqsusD4BYQip1XrxyKt867AXSNVFGYmga5Q2Wd3rvVLOy2D2ut39ZO3Bn/ta3uW5XZm8ytM+ge4cgSR1VV3TZtzqO37vH0FjvU1s1Z07k+zvox1PQA2AiheMjNhmLSYuAAk7HY/K8EpvFY3FoBJc9z2cSOp7LQrDPSl8IOSXYcXxaOF8TioULGj6f34V3vYzu5LOaf9nXL87z76JC0GLgwQvHcQi4fikmLgQNMxmKfEOYs7G3Q5gSjyYZ0vZFuMoKPl+Yc0qyw3nvA3SBrTnZk72Zbu7TuOhG2CwSwEUKxp9sJxbQtBmI0NG7OAgt6WDtNuyQgbtfeK+kwxyldj53Wb/JPe2H3vOTVbsO1pmnMyr3rFEWRpintjAEoQvHthWIGaANiFGrQ8u6AOAvIyDvbhac8z+3Cu/08ejuFdAspy7IoCrvbx/jQ8fJPp3AZCcj72AFcGaHYOQCfQk4dikmLgSsLOCfQUK/k9eXY0dAMpWnrHa7SKUe+MCQcq4GOz0VRdCstAGBrhGJnnWhDMY0oAHhZX9vh1A306n1pqBHYUAk+j+0A4IwIxZsiLQYwIeCTLImP3UoIw3Meo96xLU3Du95Hct1neWZWJ2e1JEloRwEgNoTiHZAWA6fk08ZrMed3vITOIHs0hfRWFXQXSnjttjnrjeay2tAEpHVdO7UssjunqE0vLICLIRQPFX7SUExaDJyAhCT56VzXtdZ66Kd8kG4K8oRL+kwkSaKUStM01DMv6dndNI10c5a9aK2TJGmaptsZWSlVlqWsKefeNM3Q8Zho231sZ9q6GVprWT9JEp/CAdw4QvH1Q/E2474BGOMztVLvcqOqqqHRMdXTUyvZhUwO/ag2nlpp6HTU0wPm9w4R73M8vaNmtp2h422RTK0EYH+EYkKxI2kH2koDiJD8jN6u/CRJzFCRIwPrOIYOSao3RoKMKc3npHqPx9PktkMrSHfsPM9pXAHAIBRfNRQzQBtwJns+UeruSx5sddesqmrZgc3aas25T25LqwkA/gjFy8QfikmLAfgyNQryw51nTQCwP0LxduhyB2BbMono0Ucxm/RxGRnACABOhFDsg9piAJ8J2/M32nmMfHSH1QSAfRCKjZ1DMV3uAMzGkzsAOByhODgaUQAAAACkxQAAAABpMQAAAKBIiwEAAABFWgwAAAAoRqIAAAAAFLXFAAAAgCItBgAAABRpMQAAAKBIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAABRpMQAAAKBIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAAJRS/z/HcHLjmQH2fwAAAABJRU5ErkJggg==", "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-25T17:01:05.157864Z", "iopub.status.busy": "2025-03-25T17:01:05.157468Z", "iopub.status.idle": "2025-03-25T17:01:05.522313Z", "shell.execute_reply": "2025-03-25T17:01:05.521619Z" } }, "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": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAI8CAIAAABDLwC/AAAABmJLR0QAAAAAAAD5Q7t/AAAgAElEQVR4nO3dz8/txpnY+eLEsCMbjlvate38DwakpSwWF2pA1rUX8a6TWQ3mve7uTVaGZEggCQuWO0GA7NK6i2TRPV61Mwtf2w1pQVLy8grwXxBkYXk103Kn0VZiYMBZPHpLdYu/imSRLPJ8PxDs9/KQxR/n8DnPKdaPpG1bBQAAANy2/+3oAwAAAACOR1oMAAAAkBYDAAAApMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAECRFgMAAACKtBgAAABQpMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAEAp9bnJNeq67i7UWk9uJWRl4bOXyZK7G87d5PJ8LqZ5a3r/ObRy74fBIYV4FjhZ2uGWXSg1cOM4Zl3SU5v7yel9aaTw8WjjGSXsXUd4zc8Siiffa7NaJG9K5O87gF21U4Y2TNN0aJM0TWetX1WV//HY8jyfu8lcVVVtWv4yeZ6bi9y9sJMXU66bUirPc3uTofXl1aqqzIYjpEynfJsc+cjnYX/yCewul/O1z2L8w2xfxskLJZfUZ7XwJzzf+EfOWSdNU/vG8fnYmDLHL1d3pz7RJk1Tn8+bXVSEN/7kpes6JBT37rT7PqqB+DBy1rMOyd8OuwBwFtO1xcL+YqvrummapmmSJGk7wTpJEhP7TK1AlmVD66unf6zPqv0ty9IzsVgsy7LeYz6QucJCLqy52raiKIqi6JZQlqWzJE3TpmmG1hfd8uWTkKap/ZL83bZtkiRlWTq1U7KJ8qs+3M3IWfdqmmbyg+rkgnLNnYVa68nVYqi+8vnIaa3lnZUVsizL81wurHN5zWdg5DR7L0uWZc5O5cDSNC2Kwok2dk18XddJknjGFgkpMVz2XvGH4qIoeu9u876bo8qyzPPW2zTOS+FFUdiHB+BGTSbOQ6v11vlJyO6tjZByeqsHzEtD2/baoaq4bduNdtGthpy1oX2VzBeGWWLe3PFKTfsApJDe9Ufel/GzMN/f3V0HrIpbfCVFVVWmcsun8PF7Z+Se8rndum9lQJt+5Jx1xk9k5MPWzgk4I48duh8zWbn/DOesc6Czh+Lufn32st0d4Yj83Qewj+Vpcdv33bPgu9BePisCjn/Hh0q8tguUJnWY1Zyg9xJJQHdaRAxFeZMe9SZ8Q3vsvZ6TmZZzYBs1n1h2JdtObVl3hZFGFL0nPnmzjB/Ppmlxu/1Hzl5h5LOxLC0e+vnXW8hQKj8eFsYTo8mQ0l2hqqqAvwBPGorFSO4+Wfg+bwppMYB2ZVrsfPdM1jHked6Nnvb3q/zt80XSjaeyZLzybxbTlDbP8+0aGpoDdppjDuk9Nfk+c3IUZ6FTQvfVBameTwWk2d0OOd+sK9nefyB7a7XNCr1pcTvwayHytNjsJexHbijNGk9w56bFzkuTn71utBmPTu1AYtR9fO9kn/ZHyByhs9XipxnO8Z8iFA+t07uaZwAZKlD0/v6xmzjLCs5WztmRFgNoV6bFztfbsqe03a86/84x9hKzrfzvyu8hk2TbZa4pcJx/ptJb1eFceXNJe987dZ/oO29Wb7Iy/p76vOPjX0XBLUiO2+FvxJG0uDeFHblZRl6yD95ntSACfuSGPgZD57IsLXaCg3/eZkzmPd0VzDsit0w3vTMfbFnBTsWGNlnsLKG499iG3qzJvXTP2lxS55o7u1NP/xof2cTzRADcglVpsfPqgi+q7hek51dIN5iaWLk+8bLrP+SPoZrUsOxMZdZWvV/V7fCPB/Nt0a1O6/2qGLqknt++5kto6wtozL2SC9Litu9TMfLp9flg75kWmz2u/8htkRZXTzMfIfNRXHChzId/aIXux6AbUoZ+gjqbdJ/DrI9LZwnFvQc2dO9PJqNDV7hbiJzvyO/VarSRCWkxgLZtQ07nId14Z/Xg7nZUl9jk0z25d0fp06MiLNMdqEGOp7s8LDNog3+H6KIosixTAz21u5dXTmHoEslXvr3+gve0y2y+W+/+BVdyAeluv/WnYlMBP3LdN9euOp0re5oZuWLNR2jBQLyqE1KKonDOq/c07Zto/0EtYgjF9ktpmg6VM/fiSDnOM6jum+Ks0N3Xmg8ngAsLmRZLoJk18Jb5MjZjzvsMCD/y6vpvIPNd2FvsdsOKaa1lRLPcGvd3hIw5JTlZ1Tc6m7o/bCdv6/3C6F2/9xtorrquTYGSTm1t7pVcQy5OtIN5jdviI2db85sk72jbdu44er3m3sK94xIGOZLtxBCKlTXk2eSRrHxTZDC+k96GAKLiO25xLyeDlIFLR8KTjGdpRhg1Xy3dbOnA8SP3H0/XDPjqk2o4m+T3Q8MOSdPUXExZc7Jqx5BLsTIDMDWLkh9rv3ndlllwJVcqiqIsS59hjKOyxUcu7BWY/NTJB3sy2qz5sEU1tPa4CEOx+T3c+yBrsRO9KQDOaFVtcd03Ee5I2JIEwql57VYLyauR18esJ19aMuS+NHrzzCqSJJFJNHzqz+xno+MtKITdjmL9jxPzCFVrbcoM/s4uvpJByLf+PhXhK230kTvk98BkXaZEm/W7OIUIQ7H5PRz2Mp7oTQFwSpOtj0dW674kS3q7eoz0DJtcs3fXTh+OZZ2vJ/du/+FzuWbtZdZoCcKn89/QdbY37O1yZ6/vP8rE0Drd93GLLmWLr6RtWZc7Z7Xe7u3jGzo27XK350euHe1Xt2wkillr9g6kUE0NXex8DIaOM01Ts7C7QveoJrv6eTpLKDYF+vTjnLw4zgGM9O/MreECPTsTjy8BcIMW1hZLK0PVaYMrMSvLsm5FhVQeODUQvf0ePOsDNnqaNtKM2G5lu/L5rFKqbdsFz52lAmxW/Y1cZNmRz+5kfalaXlOz2+2YpbW2D8Y45EoGFKpyfVzMH7luY9beaZ/DkvvRmZhaWY/vu5NOzypf33dGtDes69quZz1chKF4Vk+M3nruEb29ny//aBHAfiYTZ1kttZhteysDTLRN01SexJlNuqP/DFUSTFZQDQ09FmQIMLuORP43f3rI+v0H0nL222to0Ch7K2dh7+Wys//x4xm55iPDfjlHe9TFtK2sLW4HLrLN5xzHL8X4LbMRz4+cWS23xoUdqiwMVVvcWmP/jUcbe+XJ0rqHas7L3Br20e5cWxx5KLY/MOkAZ6C08UrloevpfNjMOtQWA1jDNy12jD+K7f0qnYxTvSUMreDkqW3QtLjtC+6zDm9SPjW8w4KthtLitpOJtqNpce/6I8fTXW38+jivrryYy66kY31a3FopWu+rPgezaVq86Ueu7dz1I7lOwLR46AiHWgeNZ2C9H4NuNBvP6rrHHzYtdsQWin062Dk31Nz2OW3nTbffAtJiAGsk7WYjWNlP0LZ45pgkST41DkOQvQxdopGXMBcX04f0XIznCX6vQxq0mGgztOu6rrMsG+8BJgM4DH0OzzXYiC3aUCwDuYzf+NJEpHeduQ0wxo2/+wBuxIlzkX2iGGnxDmSsKIZemsRHbjGfcEFitMzi65YkSZqm4zf+SFocFu8+ABV2Oo+dSTA9KpdKksTncSEmSTUenWYmSZ3c0UdxVk3TeN6w/Dyba1koDjIsOgCEtWo6j8PleZ5l2SG/76lUCEVrzcX0wVVaTCYH9nzavtGAu9e2IBQXRZF7z+a9aZ1xdzATADfr3GnxDjUN1M8BF+BTl2m35CEnnmVBKDZT/IzbIQIT5AEYNFUEAAAAzty2GAAAAAiFtBgAAAAgLQYAAABIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgJo7+XPyYZi549vnmVoPABYiFAPAFqgtBgAAAFTStl61BaEqJwxqKQBgLkIxAGyH2mIAAABgZttisbh2IXg9B3aTJA+VUm37ztEHAuBThOIbRCgGNkVtMQAAAEBaDAAAAJAWAwAAAGpZ2+KN1HXdu1xrvbLMNSUgEuNvJW80EAqhGCMIxbi2iNLiLMtGXq2qau6dprVummbZtohKURRlWaqBt7Ku6yzL8jznXQbWIxRjCKEYlxdRWizyPHeWyE2YZZnnEMuirmsC8fXM/RgAWIZQjBGEYlxVdGlxURTdJUmSyB/dV8fxszWoKILggo8BgLkIxREjFANbOUeXO6m36G3xVtf1UEu4ET5bdVfw3NfkapOvLjij7fzmN3//gx/83xKIn332377++n/9zW/+/pAjkY9BWZb+1ye2iwmcGqH4QIRiYAfnSIt7SdVFlmVZliVJYldFyHKlVFmWSZKYu7Gu6yRJ7K3sG1VelV/ApoTJfSmrEkVrPVS4s/duIZN7OcRvfvP3Dx/+Xx9//HulEqWS3/3uk3/4h0/u7v7mqHBcVZWaavsoxj8e8n45S+yaD9mcuhBgEqF4B4TiQAcOTGn9qCfK/Oe5ydxCRo4nTVOlVFVVzpI0TfM8z/Nc/mk2r6rKXsEslHXyPK+qyrScM8XKCqaoNE1luVmzd19mBVkuhQ+tM7KCWTK0l0O8/vp//d73/kapO/u/P/uzv3nttZ/ueRhy9eStNNfZvCpvnL1k/OPR/Tg573jvOkAMCMWEYkIxsJ3o0uLqaeZGsu8TEzTtzZ1btHt/OpG3taKz8097q7bvS8IEX/ufzjrOzTy+gs8ZzeUE0KX//Z8zl8/+z+dc7FjcvZjOez15MZ317a5F1tU7/osQ6CIU20sIxYRiIKzoGlFkTyvLsmmaNE3tp2DyPKX7XKy70Hk1TVP7CY7WWm5RZyvnCY66f2DkLJTu1YbTcdvekZTvrFAUhfnpvOCMdjHeseOwbh9yJYeebE5eTNlQutWrp98dezXz7gA3iFDseUa7IBQDO4luJIreUYGaptFam7tLgmBvYyMnPnZNNlFy7kBzc07GxJH2Z3YIsNcPckZD2vadZRvann323/7ud590l3/lK1/83e/+4/ryl5GxM5umqeu6e9l9LmaapuZv+bLXWksPEvO+xNCgEDgKodhBKO4iFON6okuLh0YF6oYk8xPTh9xdTdP0hrbeW1rI+rP2NbT3SSv3soXvfe+lf/iHT/7Tf3rfXvjnf55++cv//KhDElVVSSVWOzB25vjFlPkFzPuutZY/7CoKOnnglhGKo0IoBvYRXSOKXr3P14bahfSWIHfaUOMw+65zgrLseta+hvY+aeVetvAXf6H/+3//f//sz14yS/78z9P/9t/+n7/4C33cQSmllNZ6/Pnd+MWUd7woCrs2wtRbLK4WAq6NUHwUQjGwj3Okxb3xsWvy+Vr31clN7F+uszb02bsZd2bxGW3t619/7tGjf/OVrzyjVKtU+5WvPPPlL//zR4/+zb/8l88deFTCNCt0LpH/xWyaRgoxFRWm2O4TZACE4qMQioF9nCMtFuZGsu8coyiKLMuGIpes3P3pKU9/RnYqGzrr1HWdZZn/kx1Z03mW1O1NMuuMdvP1rz/39tv/SqlEKfW73/3HH//4X8UQiIX0v3EurOfHQ0K2tGazN5TSaM0GDCEUH4JQDOxh6AGH+7zj0MEynVF4zMoyGmLv2JPdUYE8B8vsPt2zh7G0N3QOzxlY0Vk4OVjm5Bkdy38Eny04owLZ7HfHLPS5mL2DQM29L4CdEYoJxYRiYDvnSIvNbVN1hpE3nMERewOrM7iP6hs7s/eGd57jpGlqb+gTi3sLcfYyfkbHijYWt/efHOdVn4s59KGK6soDNkIxoZhQDGwnaf26ESQffjZDY/v8wp4HQQpxLBvAZc+t5hYS55A0SfJQBRppaE9xXkxgMULx4q3mFhJn9CAUA5s6fVqMfZw0FgMXQyi+cYRiYFNn6nIHAAAAbGTJdB52TQMA4BCEYgAIK7pZ7hAnntkBwOEIxcCmaEQBAAAAeHe5+3TtQM/s6OQBAIsRigFgC/PSYgAAAOCSaEQBAAAAkBYDAAAApMUAAACAUgMT359C7/FXVaWGJ1KX+dztideFTL8+tH6e5+qJWvWfulPqbuYmAOISIGzFrfc0Nwqq9h4BwN+6ODdh4bjFdV1nWbZs2zzPi6JYtu1GmqY5+hBc8oWRJGv7RM4twWf98XVGXu19yWfh+uswV5A9zirEc+VlF3/xlfc/sICi/divOaSVThdy/YPqIclxqE/1Fp80n9Vm3elDy2O42QPud0Ehm0bdkZd4O9ZssnUoXjWdh9QHzLJ1AlrXtVJKaz2+zvgK4xYMaZSohz4bMmcVgBGHhNwdgioARGJVWlwUxdxQeGyNi9a6LMsDDwAAFosw5BJUAVzJibvcScWJ1GQY8s+hJ4byjeIEcdlkQTUMAFwJQRXAjVuYFmut27Zd8NSsbdtQrdykHLu0uq6bpnFisRPiu3G/Ww4ARGWfkEtQBXDjTlxbrLVO07RpGq11XddFUUiXFDsWy0L7u0RezbKsKAppDydBn4ZxAG4cQRXAjVvVttiY7CW9UW9KE4LN3quqGo/FWuuqqrIsK8tSHvylaepUfgBAzLYLuQRVALcs2CA18sdQY7KtQ+SyftD+W9ljRCwZiSJ5qJRq23c23cuFHTVODRQX/15U12GHkLt1UBVRXVXwdkSFt6PX1pclQG2x6V1xYPXAsqd1POMDcDr7hFyCKoAbFKYRhbql3hX2gEf8kgOu6tjRJCddJuQ615mgCsC2cygO0OVOqgdupyWZPUng0ccCYCvOjKBHH85nLhZyo73OAGKwc4gIMxJFnudlWV4mTANAzAi5ALCFYC2Xx2u5z14HQJe7Y9Hz4EBcfBHbdbhGyI3tqt443o6o8Hb02vqyhKktppsFNkVoOBAXP0KEXGyBmz0qvB2HCNPlrmkaxVsIALsg5ALAFgLUFkv7tqqq1hcFABhHyAWAjQQbiQIAsANCLgBsJEzb4jRNx2ciBQCEQsgFgC2EaVtcFEWWZUmS5Hk+tEKQHQEACLkAsIUw41xMzkFy9q4h9tBp6oXP/vQ8LwZoA06nG9biiWOXCbkxX2QAMdg5SoSpLb6pzh9EbeAWOHd6VHNBXynkElEBjNg5FIdJi+kCAgC7IeQCwBbCpMVChg0y8Voat9HEDQC2cIWQ++TpJmoXQkM44IwCT/6cpqlEamVVdF/gGRmTPwM3LraJWK8Rcq+aEytiOLCNM03+nKapXVHRtq30kuZ5HwAEdIGQm3yYxJUTv3CnXrgLWF5cZwfAT7CRKOxKC5vWummaE9Ve9KK2GLhxUdUWXyDkRpc1Sk785FHAIgnjQHBbh+IAbYslNA81aJPxNeu6PkUFBgBE7nohN4b0MVEPgxxJdOk+gDmCTf7cW28xshwAsBghFwCCCzmdR29RIy+dCI0ogBsXWyMKdfKQG1u484zS0+VEdl7AxZyjy52MLZ8kSVEU9b2iKCRAD01PelKJ5ehjAbCV5GlHH85TJKheJuRGe50BHG7nUBws6S6KoizL7vI8z082jmYfaouBGxdVbbE6f8iNLdxRWwycwjlqi5VSRVG0bVtVVZ7naZrmeZ7nedu2CwK0dBZJkkRr7b95URRmq6HWdVKbIlUsk4Wc4qsFwG2SkCuRdjLkElQBwEdc9R9KqbqusyxzFk4epIxJZC9xqkx8iu0WYtahthi4cbHVFvu7ZFANjtpi4BQirS2u6zpJkgVdnkcqFYTE2aqq2rZt2zZNUzU1On1RFE3TpGkqm0hDZ+fxolOsaZk3VMi5BsYHcG0/+9nPkiT52c9+NnfDJEn+7u/+ThFUAcBDsEYUQUjGnOe5iZuSeXfrG2wSrE2OrrWW4Gvyb3kpTVNTbFEU8t1gyDp2oi+bj+8aAOJHUAUAH6vS4izLkpnGC5RY7FQnS6gdH6TTCcdSgqnbkH86xUo0NwuJ1AAi953vfGdZyCWoAoCPuGqLe/lMF+LzVM5ZxynWqQsZ2SMAnBpBFQB6LUyLtdbtUnM7I69viNZbaeEUK08Ay7KUHtNaa2k5d9JONgCu5Nvf/vayeKuU+su//EunNIIqAPQ6QW2xGK9m6EZ55wngEDu4m0KappHlvYUsbiICIGZrGoCdEUEVQISODcWnSYvn8mzWZmK0jI2fpqndsbppmu57MF4xA+CkJqtdbxxBFcAOjg3FJ0iLfRq6jVd79NZPOJuYntfdjtUMQQ/gSgiqANDrBGnxOP9Gcr1R3u4j0g30ErvpJgLgdhBUAdysuNLi3mGD5J9DtQsSgp1x5p2I3NvtWgr0qS85ZPD55MNk6//2PykAOyOoAoC/uKYzldlE0zQ10ba7RD39VE7dzy9aVZVZ2F0irdnsk3WWdFcwC6uqyr782Ryn+0z+vAMmJgX8Jeec/PmqQTU4Jn8GTmHrUBxXbbHWOk3Tpmm01nVdF0UhA/rYtRqy0I7g8mqWZUVRSHCXGUftdczEpFKshGZZ6KxQ3JN1nHKuhApj4PIIqgDgL3DS7TxTWxb7JASbf9r1E8rq3exUdUisF86r9obmn3meO88QnULsdVZWAMRZW6yozAC8RVtbbMe6oZB7vaAaHLXFwClsHYrDlC41CkPD93RjpQ/noV6orfy7YNvr7J8WbxdPidrAAlGlxSMhV+pie0PulYJqcKTFwCnEnhbblRDm0Zg8rVNK2YE7TdOiKE767Iy0GLhxkaTFvSHXOFHIjS0QkRYDp7B1KP7c4i3N47PeyuDuLKDyNG1ZzXFU7LHoY/iaBLCF2KZYGw+5vSufJeQSVAEM2TkUL0y6Jcd1Gqj5bCW1F/GHaccpaoujqpMGLubY2uLrhdzYAhG1xcApRFpbrLVecFimcQUAwB8hFwB2ENcAbQAAAMAhlrct7hVkgDYAgCefAdoAAD7CpMVbDNAGAOi1bIA2AMA4BmjzcorOcHS5A7bDAG1hxRaI6HIHnEKkXe7UDQ/QBgD7u/AAbQAQiYVd7uq6Lsuyqqq2bX1irqTFVVXJgEHLdgoAt2lByG3blpALALMwQBsAxI6QCwA7CDwShbK6RUfbpm0lJmQCbkFss9xJaJ2Mq3Vdn66GmKAKYMjOoTjkuMVFUSRJkt1LkuRcodlTazn6WABspX3asQcjfTOyLPNsVbzLQQUTz3UGEJudQ3GwtFhr3Y3FZVnGVuMCAOdVluVVH8QBwOHCpMUyKlCaptIjxJbnOUEcANZL01Qp1TRNkiQ0GgaA4MKkxUVRpGla13U3A75kOwoA2J90vJPk2KdBBQBgluVpcV3Xyb2maaQCo5fzEqEcABar6zrPc0WDCgAIbXlaLPUWpqVEt/mE3T7a/idpMQCsURRFVVWKBhUAEFSYRhRa6yzLusulRjnILgAAhtOggswYANYLlhbneS5tJPQ9GaxNKSW1GgCAsEyDiizLaFABACsFm85DmkaUZdk0jb28qiqCNQBspCgKeV4nDSqOPhwAOLGQs9wVRVEUhcyxpJSSOuOA5UeCCZmAW3CiFFMaVJzogB0EVQBDdo5s4Sd/vmo2bBC1gVvg3OmHJ51pmo6H1rZttdbO87pTIKgCGLJzKA6fFgMAwtJa+3SqMw/rAAALBJv8OSCZFkR67/mP5iYN7GSroS+GoijGx042u5ZyFhw8AByo93kdQRUAvAwNNnyU3mErJreSUYpseZ7PLbZ3HRmPWT1R5r8FJ6XUnVJ306udYS/AbTo2Wj5+/Fgp9fjx4wVbvfbaa9cLqsF5xs/pciI7L+Bitg7F0dUWmzHd5PgkNI/XMRRF0TRNmqayiQTisixHipUhjZwWKs46Uk7veMwAsKdXX331tddee/DgQZIkr7/++uT6r7/+epIkDx48eO2113784x8rgioA+Ngu415AAqtTJzF5nN0VnHIkFpsQL+S7YXzXZp1T1ONSWwxsJ5JoaVf9vvjii6897cUXX7Rfba8bVIOjthg4ha1DcVz3bW+wljA6NLl0b3R2iuotwQnZ498Tp0hYSYuB7USSFgsnA7ZJrmzWvGpQDY60GDiFrUNxdI0ouuRh31CHDzNGsmc5s4oFgAi9/fbbH3zwgQTxx/fknx988MHbb789vjlBFQB6nSYtXqN3IM9usWma1nUtPaazLBvpWw0AkXj1nv8mBFUA6HWCtFiM1zT0hmOfYu3g3jRNlmVpmuZ5Lk8Dy7LslpwM89kjgDiN3NqXvLsJqgAidGwovux0Hp5TPUmgN18PeZ6bygwZj7Npmrqu1Zc/26RlQibgisZvbVI0giqAHRwbik9QW+zT0G282qO3ksPexBTuPOCT6g2axAG4EoIqAPQ6QVo8zr+RXG8gHt98vAcJAFwPQRXAzYorLXaevgn551BHDQmyzjjzsompz+gNxFKgT30JE5YCOCmCKgDMsOnwb3N1x8vsHUHTGSyzO4Jmd0n3ZJ0lI4PeV1V1ihGFGbcY2E5s0dLTVYNqcIxbDJzC1qE4uvtWgm+aplVVSVR1YrEs7EZ5ib9VVZkS7GLtoszfvfHa7jRt1jlFwkpaDGznLGmxxC57ySWDanCkxcAp3Fxa3N4HcaN3IqVuVYe9SXd+ptYK4r3hu3fXn03XdIaElbQY2E7kabET35xXrxdUgyMtBk5h61CctLGOjFPX9YL2Z5Nb+XfBttdJPvxsQJD2+dlXLEkeKqXa9p2J1c6wF+A2JUmM0bIoirqu7aHT0jQtiqI3xF0pqAbnGT+ny4nsvICL2ToUByi9russy+zBKa/HjnTqhc/+9Lx6SfJQqbZtH/nvhbQYOFZ3dMx40uK6rouicAYSrqrqRF3ZVgbV4EiLgTjtHIqDjURxOwPuOJX54x4//vXXv/59pVqlVJLcfe1r33/8+NfbHyOAtbpP7g4nFbcykbLkxNJsVymV5/mJcmJHbNcZQDx2DsUB0mKtdZqmn05cBMvjx7/+7ncf/f73f1Aqkf8++eQP3/3uIzJjALPUdd3Nhtu2XdYuAgDQK8zkz0VRFEWRZVmapr0x+sLtK0Z873s/+dKXPv/xx5+YJR9//Mmzzz7z8OFPPvroGwceGICTunZzNQA4Vpi0OMsy+aNpGqe5m7hIHH/hTimVqIfeG7RKuW1iPtEh8t0AACAASURBVP74k48//r20Y+u4+/T/n0y0QgZwm8qylBriiwRVAIhJmLTYGaYHSilpTzz6qpsxA0AvrXVVVXVdl2UptQ9lWcqgE0cfGgBcR4xDDkVoWefiJLkbyH37R6VgJAogWvEM0NY7DMXpGlfEFogYiQI4ha1DcbCRKND11a/+0bPPPuMsfO65L/7xH3/lkOMBcAFa67qu27Y1888ppcqyTJJEXjr06ADgxBamxdItem78la3OVaWxxjvv/Ok//dMf7Mz4uee++I//+D//6q/+9YFHBeAaTH6c57nkx03TZFnWHeYTAOBjYVqstc7zXOKvT5pbFIWMLnS6J31rPHjwjZ/+9O6ZZz6vVCv/feELn/vbv334ne8wDAWAYGSuu7YzGzMAYJa1TTSKoijLUv7ujs5mz0qapul5n+4xyx1wa2Ke5e4CmOUOgI+dQ/HakSiKe5IBd0dnk1z5SjXES98PHmsCZ+Lc6TG3TDj7pB783gAwZOdQHGw6D/O3qRI+dZgGgAhJHYRT12AGpripVmoAEFyYtNhGNgwAWzDVJE6Y1VpLWiyTfZy3uRoAHIsB2gDgBEwqXFWVUyVcFIWM16aUapqGCmMAWIa0GABiJ5030jRt23boiZzWWhrhmW7QAIBZSIsBIHbSLsKnGthM8AEAmIu0GABiJ2mxT88NWYfmxQCwAGkxAAAAsMFIFDiRp0bU3wxj2gMryVgTPuMTU08MAIttXlss0z5vvZc9JZajjwXAVpKnHXswkg1nWTa+mplY9FwDZcZznQHEZudQvFVaLNlwkiTX6xPdWo4+lnPYp04aCKt92rEHo7WWvnQj+W5d15I3y0htJxLPdQYQm51DceBGFGYWaLMkTVMG0QSAleq6TpKkaZokSdI01ffqe2aiu3NVFQNARNoQqqrqjgpUVdXK0tI0zfPcc6s8z81WQ7vO81yOzadYezX1RJn/PI/n6aLulLqbXu1Ce1m/IyAqoaLlSiaI9RqKbNcLqsH5R7aJciI7L+Bitg7FSbuiRrqu66IonLphrXVZlnmeL6skNs8BbZMHaeY+NZwDmFustF9J01T6r9jNABZ0IEuSh0qptn1nYrUL7WX9joCoJMmqaBmWBDczx4dUDw+F3EsG1eD8I9tEOZGdF3AxW4fihW2L5XFelmUSN00NhE9H6XGmbZyk7ZPN6ZRSkprL/E/t/QyoTptmp1ip4Rhqu02rDwAxK4pCWqxJ1JV/Dq1MUAUAT2u73JlsOEjUk0LstnFSr+BUWjgkWJthibTWEqDNIclLpk5FXhqaC6qu6+t1EwRwmwiqAOBvbVpclqXWOlRNgIROpzQJtUODcZrobC+UEkwgln86xQ49djxpV24AN0IeymmtzYhFI0GYoAoA/hamxVrrqqqk/qBpmrIsJTRvMZL8+Fymc+dEHS9WFsbTghAAbFprab1mV/faQdizEEVQBYCO5bXFUj/RWn2cm6bJsmxywPkFO1pZQu/jwm6x0pxuvKM3ABxFBmhTSuV5bg8NYVdSLEhnFyCoArikANN5SCVx+/QwbcHrj8fL6YbjoVZuDju4l2XpM8pyMsxnjwDiNHJrx3B3S5STbnBFUdhBz1RSKKVkjmifAgmqACJ0bCgOOcudyY/NaJdSf3xIaBvvUGKYQC8H6fN1MjLc3YrjBXCw8cEsjz66T2PaeIyS9rsbDftAUAWwg2NDceBZ7oQJykVRrO+A7NPQbXxguDRNuwHdDtams7ZZ6P7x5RkHDABh9XaD65IwOJm/ElQBoFfI2uIuea63aXbv30iut9LC3rwsy+yeZPMbtZYGgAV8wp1nU4eVexEEVQAXs0lt8eJJPaQGwtlcIu/QY0FZsyxLZ/olZX09yHRNTrGyvizpHq1MH6Xux/vMFEEcwPkQVAFghvE2HJOkGbGZ5l6Y0OksnyQN48zUSr1LZGF3d/bC7pLuyY6fvrPfldPcK3Wn1N30ahfay/odAVFZHy3XkIjkE1El+jkbXi+oBucf2SbKiey8gIvZOhSvqi02fem6o1dKrUBZlnVd+w9GobWWug3pWG3mRrIrLaS9cpqmptiiKOSpnFRCmGlL7aPK81wGx6iqyhTLsEEAro2geqDkwwuOpNE+Tz9IXNnytNjEx6qqnLS4KAqJvzLsvPzTs1h5Kiftz4bK7x5JVVXSdk1Csx3fzSGp+4ZusiTP8436awPAFkyIm4WgCgCeknZRfzhJebuBsmcHSaIWTXG0rIHy5Fb+EzjZ7B/9C34rJ8lDpVTbvnM7e1m/IyAqSbIwWgYhIdd//d5DvVJQDc4/sk2UE1UN8Qt3Sin15FHYUmN4v3Cztg7FC2uLx3ts2HrH8fGxrNPe5Fbrp3cCgJ1prdd/ExBUAWDcqrTYc5bRboflU7NnJzmw9gjApphibTdXDaqH16om6mGow4irFhy3ZOdQvMkAbdd2pagNYIhzp5Mlb4egCmDIzqF44XQeUvXrM8SE/zAUAIBeix+4yTgSgY8GAC5qVVo82QXEjN9+mRYUALA/rbXWOkkSrbVnfYSsr/w6gQAA1OJGFPZYmEMx2nSdllHcAQCLFUUhVb8SV80owqbSQUKxqYxQHgOxAQBsy9sW13WdJEnTNEmSSIAW9T17ns9gxwsAt8pUQ8gEHGbWJGe1NE0lh979AAHg3FZ1uWvb1kTnpmm60ZnR3QEgODNHkj2NqFRMHHdQAHB6a0eiKO6p+4d35tEeCTEAbIpUGAACCjNAGxkwAOxm2cRyAIBxC0eiAAAcRTo0M/wlAIQVIC2WkYBkMCBx7ZEyE8vRxwJgK8nTjj6cQdL72cTeow9niVNcZwCH2DkUr02LtdZZlkmXO7NQut+dN0aPay1HHwuArbRPO/pw+pnx2oQMDXTg8SwT/3UGcJSdQ/GqtsUm/soobPbwmXVdywgVnoPP49qSDzf/qm6f5wsVt0XCrB1+pXEFURcAllmeFksUTtO0G38lRhdFIQMbL562FAAwpCxLZ8IOrXXbtmesMAaAGCxvRCGtJsbrJGR+uwu3M8ZWXrhTL9zN2mKHCmkgKkOT2PXWVgAAJi1MiyXmpmk6vpqEbLvZMQBgJdNkovdVQi4ALLOqbbFP04g0TYnRmNvwN1EPPbeikhg3aCQtlqdztFsDgAUYtxgAzkdqHJwmalrrsiwnn+MBAHqRFgPA+UhVsQyFafh0+QAADCEtno2R54FbEP90HtKn2Zbn+RmH/o38OgM40M6heFXb4rIsy7IMdShnccZvHQBzOXd6hBmbDMdm6obP256YoApgyM6heFVaDAA41nmzYQCIzcJGFFJL4W9W4TL9h8wd7T/mcVEUZquhpnUyw0iSJEPFmkKuOnM1gBtEUEVAyYfJ9f47+qIiFklsT69k8lJn4eRBaq2dYeDyPLfDtE+x3ULU/YD59j2zYJLhJHmolGrbdyZWu9BeVu5on70A/pIkumjp6ZJBNTj/mDNRTkznFeqk1A0MhXn4mwVPW4fi6LrcSZytqkqqmWWkofE6hqIomqZJ01Q2kW4oTqNnp9g8z9XTLVScQkw53bgPACdCUMXVzJ8GddLl8354Wj7L3bLHYeOP8OSlPM9N4fLkbnxCEAnWdr8TCdBmR2ZOPlNsURTO0J5OIb3lAMC5EFQBYIZZTYRtEt3SNDW1BSOqqpKIadccdPUekmw4tBepfugWaxfVW4Icv4xnNLRrKTzPc/VEmf9Gjn+IUndK3U2vdqG9rNzRPnsB/K2Jlge6alANzj/mTJQT03mFOqmW80I0tg7Fy0eikI4URVHIEzFTbeDUSdR1baolpEnZ3B1J67Sh+mnZi0+xzjoyHZSpyeiOAKoYFR/AFRFUAaDXqgHaTPfkoijKspT0tzuScZqmkkMv3svK0ZF7Hxd2A7qzQl3Xst+iKMoPb254ZgBXRVAFgF5hxi0uikLaitV1bTdHCzgcz3gdQ3dHaZqON54TQ+tIoq/6KjxGhpJuz9lR/TJ26DNBb+ULi3DCjk0RVAFE6NhQHHg6j7Cp8Bo+4Vsp5fQRUU+POtTb6oMwDVzS+K19a0lzF0EVwA6ODcVhBmizK4mD82noNr73bpge2kRrLeFbeo1EkuJjK/NH+WEQH1wAQRUAegVLi7MsO6QvhX+QHQrZ5u8kScwom4wfBOA2EVQB3Kzw03nUdZ3cm1sxIDUQTqg1vfp6N5FdON1HzJia9jpOsVKgPeimUirPczpKn1f7fDvrP/+tjj0vYDGCKgD4C5wWm/HaRNM0s1qBSBh15heVygZ7NSfIduO+U4784UR5aSdnIrjpH+1/tAAQOYIqAPgLmRbL4Dt5npsx3qXHsX+dsdZaOjvL0G8mybYDqyy0y5RXsywrikJG4pSgb69jJiaVYiVZl4XKiv5JH8I6gJMiqAKAv5AjUZRl6fQy1lq3bTurwtiE4PGeyzatdVVVWZaVZSn1E2ma9j7dK8vSFJvnOaEZwOURVAHAUxJkZBwZkHIo1MpkeHPbGQ/NwLRyK/8JnGz2+AMLWpomyUOlVNu+czt7WbmjK+0F15AkYaLlga4UVIPzjwYT5cR0XqFOSnFeiMbWoThMbbGZ87M3MnqOdtktc4utGB4IKzFpCE6KoAoA44KlxWpgsB6nb/IF2G1Czl57BGBI/PN3DNVELKsVPhBBFTG45LD0F6hk2TkUB+tyJ706nIZlUovcO/D7ebWWo48FZ8CkIefUPu3ow+kxNFq8PRzQKUR+nQEcaOdQHCwtluhclqXd3ViaTzBoJQAAwJj5dSiTqGSZK+RIFNJz2V5Cx2Rcz+yOfeqh51bELwAADhQyLZbh2Ezd8LkatwEAgJt1eDNc/zqU6aKoZFkqZFosyIYBYAvdBmnOEsIvAKwRPi0GAGyhKApnvEsz3YaYnKcDADCCtBiIEaMjo8upG06ShDwYAAIKNhIFgINt0IsZAIDbQW0xcKOSDxMqjAHg2q7W/e7JtsWTFs/GhEy4DJpqjIh/lrvLIKgCVyaPMZ88Ovo4vJAWz0bUxg4WZJOeg/vsXHOwz+62SL6dOz3CLPkyE4gSVAH42/RRJ2kxgDmi/N2/R/K98ZO7BYYmECXLBIBlSIsBxGef5DvKFB8AAjq8JVuoaUr2efZIWgzcrss01dgHnRQB4NpIiwFsi+QbAHAKpMUAroDkGwCwEtN5AAAAAKTFAAAAAGkxAAAAoEiLF0gsRx8LgK1wm++GoApgyM7BgbR4ttZy9LEA2Aq3+W6iCaq810B0dg4OpMVPqetaa50kida6KIqjD2cBwjqAiMQfVB8//vXXv/59CZ5Jcve1r33/8eNfH31QAI4RMi0emol0aHls6rrOsqxpGqVU0zRlWZ7liR5hHUCE4g+qjx//+rvfffT73/9BqUT+++STP3z3u48IocBtCpkWZ1nWmwFnWRZwL9uR46yqSqrr0zRVSmmtDz6sKdcN6/vUfFO/Dmwl/qD6ve/95Etf+vzHH39ilnz88Sdf+tLnHz78yYFHFdRVQ9xVz+uqTvN+MZ3Hp+TpXp7nJmTXdZ0kidRzxKw3rD/77DMPH/7ko4++sc0+N/x8P3786+997yem5vurX/2jd9750wcPAp/IPnux7BYRrvRb4kp7uUVeQfWFO3U/r8pBWqXcCuyPP/7k449/nyTLjuru0/9/8mjVca2ze4jbyVXPy3KpiHTG94u2xZ8qy1Ldx3FD6jb2bgTywp164S5JHnr+99FHv7NzYvHxx5/89re/611fypdvo1l2aKqxT833bvXruzVu2WdH7AWzRBRUB42nIGdNUK76CPGq56UuGpFO+n5RWzxGa900TV3X6ttHH8qgybAepiWffL6/9KXPmwLl8/3Tn94F/OW3T833PnvZ54rttiP2giDcoPrkkVo0cXcoSTJYQdC2S6p7Y5gq/IhHiHu46nldNSKd9P1K1ox54fziz7LMfl6m7tuQJcmqvexDOoI4xyn9RfI8L79dmoULIrg8jGvbdyZWs+Kp/16S5G4g9217w/qyvXz969///e//4FRLP/vsM8888/mPPvp3/QcmO5pXLT2UxwfL79fu5ckjz4u2/IrJoWz21rCXffaCTYNqKF/72vc/+cT9MDz33Be/8IXP/fa3/35BgYviXnD7BNL9bXle3rE9uAVfFpMu/jnc8s1albDK7/6RFaqqkqF5Tp0Wp2na/IfPTvOJejK38BdeeKSUevJk4gP6gnphwV5eeeWv/9f/+v/+x//4g73wX/yLz3/+8//s7/7ufx/cy+y7ZYc4Kxd/aC9DL8W5F7XjN1P0vyUus5fjvjjPyD+oWpHPtfV3h6moM0nJc8998R//8X/+7d8+/M53llRoRZCO7BbidnbV81IX/Rmz5fu1ZShe1YjCqS1OkkTy4DVlxu/555/fasMPl+zlP//nf/bd7z569tlnnLD+13/9fzz/fF9Y/7Bn2ZR1TTW8P8ELHmguqMlbvpcZX3U7NW7Za0fsJWpa62hHBfZxYL3Jgwff+OlP7x4+/MnHH/9elnzhC5/7L/9lYU78mUMbhwRvGaLieGay4Xkd/zNm5NV4K1bHnbSFEm2Lx0jer7VuVLzjUSwM6zOj9sqE1dNXv/pHQw805xa1yV7mXLR9UvwFO2Iva/YSIamUbZpGkuOjD2dChEH1wYNvfPTRN5Lk4VDDs9PZJ5Dub8PzuvTPmKOc9HPISBRX8ODBNz766N/Jb8q2ffTb3/77tVUdHV/96h89++wzzsLnnvviH//xVwLu5Z13/vSf/ukP9o6k5vuv/upfn24v+1yx3XbEXuIkeXBVVWmaDo0cD2/HZxJB7BPi9nfV87pSRLKd9P0iLf5U77BB8s9TPZrcKqzv8/mWmu9nnvm8Uq3894UvfG5xI79j97JbRLjSb4kr7WUH0rtDmq5JsIpq7qSrBNXz2SfE7e+q53WZiOQ46fsVMi2WIHhSEqbtYF3XddM0pz6pgHb7fO9Q873PXva8Ypf5LXGlvWytKIqmaezBf6SFbjyzKxNUD7RPIN3fJc/rGhGp1xnfr5AtPIae38U/DIVSSmudpqm0zyuKoq7r3rHob9nuLfD2+XbfcC+7XbF9dsRe4iEBKk1TJ0C1bZskSSSD/xBU4xDLz6TQLnVeZ49IHk7zfkXd8HlndV3LQ0nzIPIWBtZY5DSf72jsdsVO/1vionsJyYxx1lsTUVVVlmWmWcWxCKrATOeLSBdDWvwU+SKRUH7woQDAgJHkUmtdVdW+hzOGoArgREiLexC+AURrMkBFGMEiPCQA6GIkitkSy9HHAmAr3Oa7IagCGLJzcCAtnq21HH0sALbCbb4bgiqAITsHBxpRAMAp1XXttNw9xUR3ABAt0mIAOJO6rmXQYnuh/FNGQJOB28iPAWAu0mIAV5B8uKDl2d3SDY8hQ7PJ32ma6nvmVXU/zYesluc5gwQDgD/SYgDbuoWEdQcyALBMa9dbEywLzXDFRVGUZVmWJQ12AcATaTFwu0hYz0JaD8+aoaN42lZHBgAXQloMAF7a5w+rdl3cl46EGLhxEdRinKkyhbQYwOktTFg/3egdn3WTJFHHNUaQbnZa68k0tygKM0IFAGAW0mIAG9ohYb0RTdM0TTPZVriua2eQCgCAJ9Li2eypVujLgo3s0+p3Sc56MwlrtDOuJUlSVdWVxl8jqALwt2l7NtLi2YjawC1w7vQYsuQ8z6UyOMuyKw2+RlAFtnNgp4j7I5D/C1OZsnV7NiZ/BoDTqOs6z3OlVFmWV6owBoAYkBYDN+r4KgQsUhRFVVVKqaZpkiShdx0AhLJJIwrpMU1NBrAYrX4xQmvdtq1M8HGxBhUAcKDwtcVa67IszQylAIAt0KACAMIKXFtcFIVMT1qWZZIkdKTA9cwfI+JMI5njXOTRXJZl0qCCkAssFkGU5svieCFri+u6LstSHudJdI6h7zYAXJg0qJC/kyRh0GIAWCxYWlzXdZZlaZqaJm7SKYRHewCwtbZt0zQ9+igA4NzCpMWSE8sfZqHWuqqqpmnIjIFZGCMCDq11nufjsdQ0NQZwSk8eqSePwhbJt8lcYdoWS07cbdYmobwsy6IoLtNRmgmZbtzsKMMAEecUWxswnxB60khLUEUMyCDjtHMoDpAWF0WRpunQ2JkSo680siZRG7gFEc5yt8x777338ssvH30UYwiqAIbsHIoDNKIoimI8651cAQAw4r333kuSZG7r4TfffPO82TwA7C/GWe7qutZaJ0mitfZ/ICgDFclWI1XXSZIkSTJUrClEyllw8AAQ3Msvv/zuu+++//77khy/+eab77333tDKb775ZpqmSZK89dZb77777ssvv0xQBQAf0Y1zaXrv2SYPUmZ7spc40z75FNstRClVVZXW2h5HcEHzoyR5qJRq24nWpVfay8odXWkvuIZIRgV+77333nrrrffff98seemll+QPe6FSShJiddGgGpx/NJgoJ6bzCnVSivNCNLYOxYFri+unLShB4mxVVW3bmiGHxusYZA6RNE1lExkYrizLkWKlv7b9eNEpxJTDdH0A4vHyyy83TdO27RtvvCEJ8fv3lFIvvfTSG2+88e6777Zta9oTE1QBwFcbQp7nI43e8jz3L6e7/uRxdldwypFYbEfn9v67YXwvphz1RJn/PM/l6SO8U+puerUL7WXljpbtZfZ/6k6pu7lbzT0XXEOoaLmzqwbV4PxjzkQ5MZ1XqJNqOS9EY+tQvLa2WBqNlWUptQJ5nud5XlWV/CFRUiaCHmmdZkhthNNGTQoZ2laWO0m5lGDqNuSfTrFSWTLezI6WcABOjaAKAP6Wp8XS06JpGlN/UNe1jJopvTpkAAp5SWoIsixbMKamhNHxCO4Tap11nGKrqpL6j27hAHAlBFUA6LUwLa7ruixLaVXmOch8XddVVUnqPGtf62sXun0+usVqrZ0lco7KbxR9nNL8KYXok4ELIKgCQK+F03lordv5PQF92lEMGd+wG+XTNO0N3I6hdYqikPDdre0YGQd0wTVBQOSsWOPWhvglqAKI0LGhOMzkzzYzmqYzr9LcELyST/hWnfZz6ulRh2QgIWcFwjRwSeO3doRJM0EVwPUcG4pDpsVvvvnmW2+9ZS954403fvjDH6qB0SttvbFS+DR0k8Hqh17treTo/UYxx+mM0AkAUSGoAkBwwdLiNE2dweSVUm+99dZbb70lvfFC7cihtXZG0xzSG+XtJfITJE1TOoUAiBxBFUexp8A4yF0ch4ELCjOdx3vvvff++++/9NJLMoy87Y033hgZ0tjRO2yQ/HOomkFCsBPEnQGGertdS4Emgss/8zwnfAM4KTMVs1lCUAUAf2Hm0JNYOfREz7OjhrpvgmZXLXSXqE4VhTyks58YdpfI94R9ss6S7gq2K03LzOTPwAKRTP7cS0b4scOsOdSrBtXgmPx5oqgbqJo9/P2Cj3gnf37vvfeSezL1aDLAeenNN98cKlNrLTm0jFlRFIV01LBrNWShHcHlVRkUWYK7zC1ir2MmJpViJV7LQmXVefQeP+3hAERIwl2SJFmWSU4scyrZ3xkEVcAHOTHE8rbFL7/8sgm+b7755ksvveQMPWHMSu1NCB7vuWzTWldVlWVZWZby4K/blM1M0WSKpf8HgDPq1g2r0fa7BFWERQaJCwtTF/3ee+/9yZ/8SbcoWa4Wjb8z3g968Vb+EzjZrtS8gUYUwAKHN6Ko69pMh2Hkea61zrLMJyW9UlANjkYUE0XFdF64ZVuH4jAjUbz88stvvPGGPER76aWXZKEZmOLdd99dUOayQTcnt1o/lqfdnSXatoYAVopqoGJ76F/1dL2sf4c2giqA09k5FAcboE3GJ37rrbecYdrefffdocYVJ0XUBm6Bc6dHkiVfsqECQRXAkJ1DcZgB2sQPf/jDtm3ffffdN95444033pDB2i6WEwPAgcqyTJJE+s8dfSwAcDXhJ39++eWXSYXhmD+4D6O1A5/RWsu8SNLZzvSfc0aHAACsEbK2GACwHakkbtu2qiozWrx0wpMOeQcfHwCcHGkxAJyMyY/zPDf5cZZlMiQw+TEALENajItgzCDcIEmCJT+WJfZAwgCAWcK3LQa6Zuesn64eYLhN4BYURSEpcndsYwCAJ2qLAeAitNZFUTDeGQAsQ1oMAOdGfzsACIK0eLbEcvSxANhK8rSjD+dTWmvpV2cvLIpC+tuddLC2CK8zgEjsHIpJi2drLUcfC4CttE87+nBUXddJkjRNozrzLRdFYcajOGNmGdV1BhCVnUMxaTEAnICML5Hnedu2TlpsxmuT5PikdcYAcDjSYgCInbSaSNPUaT7hkBbGUqMMAJiLtBgAzmE8JxYygDE98ABgAdJiAIidpLm0jgCATZEWA8A5UAcMAJsiLQaA2Ek9sU9aTL0yACxGWgwAsZNWxZOzOhdFQX87AFjsc0cfAABgWp7nZVkmSVJVVW9lcFEUkjcz+m8kkg8PH0P6Lo7DAE6DtHg2e7R8vn6Aq4ptXoyiKOq6bppGBjBO09Qkx7Jc/q6q6qgjXIygCmDIzqGYtHg2ojZwC5w7PYYsua7ruq6lpYSwX03T9KR98giqAIbsHIoDpMV1XWdZdt6IDABnIRPaqfsU2Sykjx16PHkUvMj2eX7D4NLaEAIW1bZtVVUyhWmapjLTqY88z81WVVUNrSOH6lOsvZp6osx/nsfzdFF3St1Nr3ahvazfERCVgCFuf9cLqsH5R7aJciI7L+Bitg7FSRvi6ZVUGOd57jMJk09RzsLJg9RaO88TnYOZW6zU0psqcLvLwoLfyknyUCnVtu9MrHahvazfERCVJAkTLcP6+c9//uqrr46vc8mgGpx/ZJsoJ7LzAi5m61AcZoC2uq7TNJVe0rqPf1ESZ03NhNRVjJcgLe3SNJVNpMeJM5KRU6zUcAy1UFmf3APARl5//fXk3oMHD8zfP//5z3vXJ6gCgK8gdc6h9iKB1XkYN1lCdwWnHInpJsQL+W7olmb34zabDnRdvwAAGWVJREFUXKl5A40ogAVCRcs1Hj9+7ITWF198cTzYXjWoBkcjCuAUtg7FYWqLfU7Dh9RGOPUKEmqH+vPJclnHcIa+l386xUplSbcOw1SBeB4zAOzg5z//+YMHD5RSL774ogmtH3zwgfzx+PFjSZGd+lqCKgD4O8Esd+OznvrPdOqs01usLPTP4wFgH5ITv/baax988EH31VdfffWDDz6QzPj1118fL4qgCgC9DkiLf/nLX85af/3AQ72zoXaLleZ0pmM1AMTm7bffHnlVMuYf//jH44UQVAGg18K0+Je//GWSJN/85jdnbfWDH/xg8TjM44Mid8Ox8wRwiB3cy7JM03Sya0gyzGePAOI0cmsffndLd7rXXnstYJkEVQAROjYUL5zO45VXXvnFL37xrW99K0mSF1988Zvf/OY3v/nNV155pXflH/zgBx988MGvfvUrpdQvfvGLZ555phuOg49F31uZ0WUCvVxrnxlJeBoIXNL4rR1hitYbr1588cVf/epXdV0TVAGc0bGhePksd6+88krbtr/85S9/9KMfvf322+bRnukZLXmwIWn0t771rd7SqqoaCuI+Dd3GvwPSNO0GdDtYS2VGnudmofvHl0d2DgB7644rLCQCZ1lGUAWAudZO/vzKK69IJbGpErazYacieYsqAa21M5rmkN4oby8py9IpqmmaT8erf7LuKAEgqKFaWGnbtibYElQB3Ky1abHxox/9aH0hUgPhhFqJ/kOt02TNsiyd6ZeU9SxPqlWcYmV9WdKN7HVdS11Inuda60y5kzkBQPwIqgDgL67pTGU2UTM7aO8S1amikABtPzHsLpHGKPbJdpeMHMmVpmW297LEC3dKKfXk0ayNmAQVZ5ccOvmzGbTYkznUqwbV4Jj8GTiFrUNxXOMWa62lbkNrXdd1URTyuM2utJCF3SqKLMuKopDgLtOW2uuYiUmlWAnfDBsE4NoIqgDgL1gjilBMCP60/dlobzyhta6qKssy047NqQhR1hRNptg8zyeHDQKAGLz66quLK0gIqgDgKa5GFLZlAwxNbuU/gZONRhSfmd+IgieJuIBjG1EEcaWgGhyNKIBT2DoUR1dbbCwbdHNyq+BjeZ7akuRbPVy2IYBjEVQBYFy8aXG07KGkz157tMD62hTgFCKcv+OqbjyoAhixcyiOq8vdKbSWo48FwFbapx19OJ+RLm5rVohNnNcZQAx2DsXbpsXSPZlKFwAIqCzLkRnssizzmXIZAODYJC2WLhpJknhOlQQA8CTDRMiYa85LvWMSAwA8hUyLTTacZZnMZpSmaZ7nPBcDgIC01nmeN03jNJaQsdLIiQFgmQBd7qQdm+TBBtUVALAdM2yw+Xt8kjkAwKTltcVmZiNTN6yUyvO8qirFkD0AsLGiKNI0LcvSDC0s4RcAsMzC2mJpwWb+aU9uRCUxAOxDEmKJxpNz1wEAxq1tWyxNh881GBAAXEZd12makhMDwHpr0+KyLJMk0VrfTiVxYjn6WABsJXna0YczZtmszvE4y3UGsL+dQ/HCtFhr3bZtVVVpmiqlmqbJsuxG8mNGngduQbTTeVwP1xnAkDNN5yFJsJMfS8/ouq4vnx8DAADgMsKMW2zy4zzPnfrjoijIjwEAABC5wLPcSRIs+bEsKcvSHrMCAAAAiNAmkz8rpYqikMYVJj8GAAAAorVVWiy01pIfb7oXAAAAYKVN0mL62wEAAOBc1qbFWmvpV2cvLIrCjNe2snwAAABgB8vT4rqukyRpmkYp5aS/RVGY8SgYnh0AAADxW54Wy/gSMvmzkxab8dokOb5YnTETMgG34ESz3J0d1xnAkJ1D8eeWbSatJtI0dZpPOOwa5cugByFwC5w7nYxtOwRVAEN2DsWr2haP58RCBmijBx4AAABitjAtljR3o9YRdV1LTz4Z381zq6IozFZDWXhRFFIJP1Ss2TX9BQFcBkEVALy0i0ij4aqqJteU2mKfNUVVVQsOUo7HJo2eZxXbu44cuXqizH+eJ2JT6k6pu+nVzrAX4DYtjpaHu2RQDc4zfk6XE9l5ARezdSheWFssP/p9mkbMrVeWnnwmjfbptFcURdM0aZrKJhKIy7IcKVaSdaeFirOOlMPM1QBOjaAKAL4WJ9Q+m5uZnz3LlPWdOonJErorOOVILDYhXsh3w/iuzTqnqMelthjYzppoeaCrBtXgqC0GTmHrULy8dJPyDjWQmJsTtwPBerzBRm90dorqLcEJ2eOHeoqElbQY2M5J0+KrBtXgSIuBU9g6FC8ficLM2WEmtCvuSQcLeeLW27ZslvEGG/6NNLqDK08WCwDXQ1AFgF6rBmir67qqKjOhXXlPBiqWyob1XY/Xl9A7cHK32DRNZaDlJEkk1/fvsg0AZ0FQBYBeC6fzMMzAPXVdm8oArXXwgXjGaxp6w7HPNCL2Ok3TZFmWpqmUJim+fV5iZCjplkHpgdO6tQk7CKoAInRsKF6bFhuTqfDcELyS59R6UtVtji3Pc1OZIeNxNk1T17X68mebEKaBSxq/tSNMmgmqAK7n2FAcLC0WMnJ7d7nWejykVlU1FMR9GroN7Vf0VnLY3yhmW+cBX57nUrehvj2ycwDYG0EVAIJb1bZYmFmOTOsxYYfIuq7Hu/4trtjw37C3ZmV8c//hmQFgTwRVAAhubZc7M+KEsCdGkhR5VoHO0zezF9WpcjBMk7XuJuZgegOxFOjT8IMJSwGcFEEVAGZYPLSbGXmtO7ylvGoC6Nwy7QJ7R9B0BsvsjqDZXdI9EmfJyKD3VVWdYkRhxi0GtrMmWh7oqkE1OMYtBk5h61C8dpY7J+Q5JJKOr9O7SZqmVVX1zhgiC7tRXnZk0nEn6NtFmb9743WapnmeO+ucImElLQa2c9K0uL1oUA2OtBg4hdjT4lCr2eyWGGpgIqVuVYe9SW8FtgnKIwm9s+vPpms6Q8JKWgxs57xpcXvFoBocaTFwCluH4qRdNDJOXddZltkj7wyR5sUL9jLeD3rxVp5dsJ11kg8/ayTdPj/7XJLkoVKqbd+ZWO0MewFuU5IsjJbxuFJQDc4zfk6XE9l5ARezdSgOPEBbl+cI8F3L+mRMbrVgRlMAuACCKgCM2zwtvh57eI2z1x4BGBLh/B1XRVAFMGTnUExaPBtRG7gFzp1OlrwdgiqAITuH4gDTeQAAAABntyotLssymbKsYTEAAACwJ2qLAQAAgKVti7XWtAYDAADAZVBbDAAAAJAWAwAAAKTFAAAAgAqSFtd1PT4F9OQKAAAAwLHC1BaXZTk0t2dd11mW1XUdZEcxsIefO/pYAGzFGWvy6MO5Mq4zgCE7h+IAabHWuqqqpmm6mbHkxGmaXiktbi1HHwuArbRPO/pwrozrDGDIzqE4TG2x1jrP86ZpnMYSWZYppa6UEwMAAOCSFo5b3CUJcVmW5m+p6+bXPwAAAOIXciSKoijSNC3Lsq5raVBRVVXA8jGubd9p23eOPgoAAIBTClZbLCQhlrYTVVUN9cPDpORDup4AAADsJ/y4xXVdp2lKTgwAAIATCVxbLOhjBwAAgHNhlrvb1T5Pb0gAAIBPbVJbjPXIWQEAAPZEWjybPckKw88BV8WMa7shqAIYsnMoJi2ejagN3ALnTidL3g5BFcCQnUNxjG2LZZS3JEm01s60eSOKojBbDfX5K4pC5tQeKtYuxH/XABAzgioA+Ehi+5le17UMe2ybPEitddM09pI8z+0Q7FNstxCzjj2K8IJWv0nyUCk1OdfGyr0A2E6SRBctPV0yqAbnGaWny4nsvICL2ToUR1dbbKYCadu2bds0TZVS40MgF0XRNE2aprKJTK0n01APFZvnuXq6Kt4pxKzD6MsATo2gCgC+2phI0Mzz3F44eZzdFZxyJKbb0bm9/24Y+qdTsnqizH8zz0nKuVPqbnq1dXsBsJ3YoqWnqwbV4Dyj9HQ5kZ0XcDFbh+K4aoulNsJpfyaxdahlmyyXdQwpwdRtyD+dYqXGwizsPukDgLMjqAKAv7jS4l4SascjuM9TOWcdp1ipC3Fazs07UAA4A4IqAPQ6TVq8Rm+lhVNsURRpmpZlKT2mtdbScq49ZycbABhCUAWAXidIi8V4NUM3yjtPAIfYwd0U0jSNLO8tJBnms0cAcRq5tS95dxNUAUTo2FC833Qec0PwSp7N2kyMLoqiLMs0TWWUTbOkOxQIVR3AJY3f2hGmaARVANdzbCjeKS3uHb3SVlXVUBD3aegmg9UPvZqmaXfvzjeKdCWxFxZFUdd10zRFUahvj+wcAPZ2paBqj/V7nDsVy5EAOMxOjSjquh4fEWNxxYb/hr01K3Yfke7TPeksQjcRALEhqAJAcHG1Le4dNkj+OTRrqIRgZ5x5JyL3druWAifrSybXAYBoEVQBwF9c05nKbKJpmppo212iOk/35GGi/cSwu0Qao9gn6yzprmAWVlWVffmzOU6Z/Bm4QSed/DnaoCrlRNRo4YU7pZR68ihUecRwYAubh+LFE4FsRGoj0jStqkqGvVTW/KLt/WRL9uxKMt+SUirP86qqTAl2sXZR5m975id7oZB/SjnMcgfcuAijpac4g6qI56qGmuUOwKa2DhqxhCSb0xzNDt9tXwRvrSDeDbvOhoYzG2q3EHsd0mLgxsWTwC0QYVAV8VxV0mLgFLYOGvE+FhzvB714K88u2M46K5s30IgCOLuTNqKwRRVUxQWuKoA9bR00CEleSIuBG0cCtwWuKoBZtg4a+03ncRn2UNIEdOCqIpy/45Kc60xQBWDbORSTFs9G1AZuQds3hAKCI6ICGLFzKI5r3GIAAADgEKTFAAAAAGkxAAAAQFoMAAAAKNJiAAAAQJEWAwAAAIq0GAAAAFCkxQAAAIBiOo8FmOUOuAXM37EPZrkDMIJZ7mJH1AZuAbPc7YOICmAEs9wBAAAAeyMtBgAAAEiLAQAAANJiAAAAQJEWAwAARb/SyPB2HIK0GCdAdDgQFx8AcCNIiwEAAADSYgAAAIDpPBZgljvgFtB6ZB/McgdgBLPcxY6oDdwCZrnbBxEVwAhmuQMAAAD2dvq0uK5rrXWSJFrroig8tyqKwmxV1/XImkmS+Bcb3PpfRXNL8Fl/fJ2RV3tf8l+4pyAHMKsQz5WXXfwTXfkgx7DFx/52XDuommM4pJwgt/nICusjwCH2j7ezNgn7lTe0nLcjkitw7rS4russy5qmUUo1TVOWpc9l1VqXZWm2yrJsKEaPB3cAuBiCKoBbdu60OMsypVRVVW3btm2bpqlSSms9sklRFE3TpGkqm1RVpZQqy7J3TSkfAG4EQRXALTtxWiy1EXmem5At9RBSYzFEgrWpsdBa53luSjMLkyTpDesAcFUEVQA3LjlvL2B5tOccv9a6aZqqqnqrN+T5YJqmzoM8p6i6rmWFuq6bpsnzvPz2Z9G8fX72FUuSh0qptn1nYrUPraHfnm/lwFa+QXNL8Fl/fJ2RV3tf8lm4/jrMFWSPswrxXHnZxV985f0PLKAzfuyvYc+gKknzUVc11H63+KT5rDbrTh9aHsPNHnC/CwrZNOqOvMTbsWaTrS/L1QZokwguXUa6r0pcHn8gKCvIOvJw0HnVTl693S3dEACOtENQBYBInLgRRa/J6AwA8EdQBXA7rlZbLMY7O3ejfJqmsVVgmN7fcQ5Wtf8YbfsP3cIYbXMPLKA4P/a3bLugetSVZ4y23oWnfjuuN0Ybb8f+Ik2L54bglSbD96ctfRe3gnjyaNbq7fOtungjRgC7ii2oiss31wZwLjGmxdKUbWSFoc4fyq+h21AjuUkLOtsBwOGiDaoAEJUY2xbXdd2OWhx/CdwAbhBBFQB8xJgWe5Jx5p0ng/LPoQmWJII7Y2fKJlIaANwsgiqAG3fitFjCtB2sZURMJxY7Ib4b97vlAMANIqgCuHEnTou11tLZWWtd17WZVtSOxbLQfswnr2ZZVhSFtIeToM+jQAA3jqAK4MbF2OXOnwnBErvVaMcRobWuqirLsrIs5cFfd34mALhNBFUAt+wi05ku6wdN72kA6EVQBXCDLpIWAwAAAGucuG0xAAAAEAppMQAAAEBaDAAAAJAWAwAAAIq0GAAAAFCkxQAAAIAiLd5UkiRHHwIAXAdBFcCmSIu3wpj2ABAQQRXA1kiLwyuKIkmSpmmOPhAAuAKCKoB9kBaHVxRF27Z5nh99IABwBQRVAPsgLf5UkiR1Xfe+VBSF1jpJEq310DrYwch7hFC4ERAKn6WTItIegvslEqTFSilVFMXQS1rrsizl4V3TNFmWjayM7XDZd8CNgFD4LJ0U78UhuF/i8bmjD+B4RVGUZTn0knwW27aVJUmSlGWptdZaF0XR/d0mv+o2PNybNPIeIZTFN8JuR4izIKieFJH2EMTeqNx0Wjw51o8EaPNxVEpVVSW/1eq65hfbDhiPaQcrb4QtDw0nQ1A9KSLtIYi9EbrptLiqKvlg1XXd28e5u1B+n9EhejeT7xHW40ZAKHyWTopIewjulwjddFpsHkOY5xQ2+bCmaeosT9OUT+Ruxt8jBMGNgFD4LJ0UkfYQ3C8RosvdhKHmO5PPL2REoeDHAxxi8Y0AOAiqgD9i785IiwfxmQMUNwLC4bME+ON+OQRp8SC6eQKKGwHh8FkC/HG/HIK0eMLQzzU+r7gp3AgIhc8S4I/7ZWekxYOGPnM0dcdN4UZAKHyWAH/cL4cgLZ7A5w9Q3AgIh88S4I/7ZWekxWPyPFdPz8oof8ty4EZwIyAUPkuAP+6X/d30uMWTZEpGmZVRa13XtfzNVEy4KdwICIXPEuCP+2V/pMUT2raVKcjNlOUMnIkbxI2AUPgsAf64X3aWcH091XVNx0+AGwGh8FkC/HG/7IO0GAAAAKDLHQAAAEBaDAAAACjSYgAAAECRFgMAAACKtBgAAABQpMUAAACAIi0GAAAAFGkxAAAAoEiLAQAAAEVaDAAAACjSYgAAAECRFgMAAABKqc8dfQDATajrenIdrfUWOw1e7NwDEN3DqO/Jq2LZLkY27F3B88qY4z/wGgIIiFBMKJ7QAthenueTN2Oe5wH3WFVV8DLnGgo1cmxdaZpWVTVrF3Jh0zQdPwZnYZqmk1fGfsuOvYwAQiEU28sJxV3UFgN76P5EbpomTVN7+crfwVrrpmnapyNgDJzIW9d1lmVKqTRNi6KQs67ruiiKpmmyLJt1CkVRlGXZNM3Qq7IjZ3nTNJOVRnJsdV2XZel/PABiRig2CMX9ts67AXTJz9+wP3wl4ph/xlNF0buw98DkFEbqG3rJViMFOtUecvE9C4/hMgLYCKGYUOygyx0QL59mcP5FLSgt4AEIU2cgf/Tubqi+YegUpKjel6Sobv1Q90HqsusD4BYQip1XrxyKt867AXSNVFGYmga5Q2Wd3rvVLOy2D2ut39ZO3Bn/ta3uW5XZm8ytM+ge4cgSR1VV3TZtzqO37vH0FjvU1s1Z07k+zvox1PQA2AiheMjNhmLSYuAAk7HY/K8EpvFY3FoBJc9z2cSOp7LQrDPSl8IOSXYcXxaOF8TioULGj6f34V3vYzu5LOaf9nXL87z76JC0GLgwQvHcQi4fikmLgQNMxmKfEOYs7G3Q5gSjyYZ0vZFuMoKPl+Yc0qyw3nvA3SBrTnZk72Zbu7TuOhG2CwSwEUKxp9sJxbQtBmI0NG7OAgt6WDtNuyQgbtfeK+kwxyldj53Wb/JPe2H3vOTVbsO1pmnMyr3rFEWRpintjAEoQvHthWIGaANiFGrQ8u6AOAvIyDvbhac8z+3Cu/08ejuFdAspy7IoCrvbx/jQ8fJPp3AZCcj72AFcGaHYOQCfQk4dikmLgSsLOCfQUK/k9eXY0dAMpWnrHa7SKUe+MCQcq4GOz0VRdCstAGBrhGJnnWhDMY0oAHhZX9vh1A306n1pqBHYUAk+j+0A4IwIxZsiLQYwIeCTLImP3UoIw3Meo96xLU3Du95Hct1neWZWJ2e1JEloRwEgNoTiHZAWA6fk08ZrMed3vITOIHs0hfRWFXQXSnjttjnrjeay2tAEpHVdO7UssjunqE0vLICLIRQPFX7SUExaDJyAhCT56VzXtdZ66Kd8kG4K8oRL+kwkSaKUStM01DMv6dndNI10c5a9aK2TJGmaptsZWSlVlqWsKefeNM3Q8Zho231sZ9q6GVprWT9JEp/CAdw4QvH1Q/E2474BGOMztVLvcqOqqqHRMdXTUyvZhUwO/ag2nlpp6HTU0wPm9w4R73M8vaNmtp2h422RTK0EYH+EYkKxI2kH2koDiJD8jN6u/CRJzFCRIwPrOIYOSao3RoKMKc3npHqPx9PktkMrSHfsPM9pXAHAIBRfNRQzQBtwJns+UeruSx5sddesqmrZgc3aas25T25LqwkA/gjFy8QfikmLAfgyNQryw51nTQCwP0LxduhyB2BbMono0Ucxm/RxGRnACABOhFDsg9piAJ8J2/M32nmMfHSH1QSAfRCKjZ1DMV3uAMzGkzsAOByhODgaUQAAAACkxQAAAABpMQAAAKBIiwEAAABFWgwAAAAoRqIAAAAAFLXFAAAAgCItBgAAABRpMQAAAKBIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAABRpMQAAAKBIiwEAAABFWgwAAAAo0mIAAABAkRYDAAAAirQYAAAAUKTFAAAAgCItBgAAAJRS/z/HcHLjmQH2fwAAAABJRU5ErkJggg==", "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-25T17:01:05.527579Z", "iopub.status.busy": "2025-03-25T17:01:05.527216Z", "iopub.status.idle": "2025-03-25T17:01:05.635559Z", "shell.execute_reply": "2025-03-25T17:01:05.634119Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "execution": { "iopub.execute_input": "2025-03-25T17:01:05.640784Z", "iopub.status.busy": "2025-03-25T17:01:05.640185Z", "iopub.status.idle": "2025-03-25T17:01:05.929292Z", "shell.execute_reply": "2025-03-25T17:01:05.928323Z" } }, "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-25T17:01:05.937954Z", "iopub.status.busy": "2025-03-25T17:01:05.937443Z", "iopub.status.idle": "2025-03-25T17:01:06.190777Z", "shell.execute_reply": "2025-03-25T17:01:06.189787Z" } }, "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-25T17:01:06.198854Z", "iopub.status.busy": "2025-03-25T17:01:06.198333Z", "iopub.status.idle": "2025-03-25T17:01:06.467611Z", "shell.execute_reply": "2025-03-25T17:01:06.466599Z" } }, "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-25T17:01:06.476345Z", "iopub.status.busy": "2025-03-25T17:01:06.475853Z", "iopub.status.idle": "2025-03-25T17:01:06.583964Z", "shell.execute_reply": "2025-03-25T17:01:06.582886Z" } }, "outputs": [], "source": [ "%jsroot off" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "execution": { "iopub.execute_input": "2025-03-25T17:01:06.587953Z", "iopub.status.busy": "2025-03-25T17:01:06.587500Z", "iopub.status.idle": "2025-03-25T17:01:06.961200Z", "shell.execute_reply": "2025-03-25T17:01:06.959748Z" } }, "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-25T17:01:06.966197Z", "iopub.status.busy": "2025-03-25T17:01:06.965564Z", "iopub.status.idle": "2025-03-25T17:01:07.075888Z", "shell.execute_reply": "2025-03-25T17:01:07.074420Z" } }, "outputs": [], "source": [ "%jsroot on" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "execution": { "iopub.execute_input": "2025-03-25T17:01:07.081339Z", "iopub.status.busy": "2025-03-25T17:01:07.080711Z", "iopub.status.idle": "2025-03-25T17:01:07.299488Z", "shell.execute_reply": "2025-03-25T17:01:07.298333Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KSTestSummary::PushKSTest - Warning - received pValue = 0. Reset to an arbitary small non-zero value (e^(-15))\n", "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-25T17:01:07.305565Z", "iopub.status.busy": "2025-03-25T17:01:07.304987Z", "iopub.status.idle": "2025-03-25T17:01:07.779633Z", "shell.execute_reply": "2025-03-25T17:01:07.778198Z" } }, "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-25T17:01:07.788852Z", "iopub.status.busy": "2025-03-25T17:01:07.788310Z", "iopub.status.idle": "2025-03-25T17:01:07.947564Z", "shell.execute_reply": "2025-03-25T17:01:07.946168Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This notebook contains 56 KSTets: combined Chi2/nDoF = 403.179 / 112, and combined __p-Value = 1.69871e-34__\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-25T17:01:07.952259Z", "iopub.status.busy": "2025-03-25T17:01:07.951643Z", "iopub.status.idle": "2025-03-25T17:01:08.094996Z", "shell.execute_reply": "2025-03-25T17:01:08.093571Z" } }, "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 }