{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Machine learning technique for signal-background separation of nuclear interaction vertices in the CMS detector \n",
"\n",
"Phil Baringer: baringer@ku.edu, Anna Kropivnitskaya (speaker): kropiv@cern.ch \n",
"
\n",
"University of Kansas\n",
"
\n",
"_for CMS Collaboration_\n",
"\n",
"_Code with Toy data is available at_ [Binder](https://mybinder.org/v2/gh/kropiv/MLforNIatPyHEP/master)\n",
"\n",
"## Abstract:\n",
"The CMS inner tracking system is a fully silicon-based high precision detector. Accurate knowledge of the positions of active and inactive elements is important for simulating the detector, planning detector upgrades, and reconstructing charged particle tracks. Nuclear interactions of hadrons with the detector material create secondary vertices whose positions map the material with a sub-millimeter precision in situ, while the detector is collecting data from LHC collisions. \n",
"\n",
"A neural network (NN) with two hidden layers was used to separate secondary vertices due to combinatorial background from those arising from nuclear interactions with material. The NN was trained and tested on data from proton-proton collisions at a center-of-mass energy of 13 TeV, recorded in 2018 at the LHC. \n",
"\n",
"NN training is performed using Keras and Matplotlib in a Jupyter notebook. Secondary vertices in the training data are classified as signal or background, based on their geometrical position. Even though the variables used in training show only small differences between background and signal, the NN has impressive separation power. Hadrographies of the CMS inner tracker detector before and after background cleaning are presented."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Table of contents\n",
"\n",
"* [Introduction](#Intro)\n",
"* [CMS detectors](#CMSdet)\n",
" * [Pixel detector](#PixelDet)\n",
"* [Nuclear interactions](#NIs) \n",
" * [Data selection and reconstruction](#Data)\n",
" * [Toy Data](#ToyData)\n",
" * [Connect/Generate data](#Import-data)\n",
"* [Neural network (NN) motivation and strategy](#NNmotivation)\n",
"* [Classification strategy for NN](#Classification)\n",
" * [Set Signal and Background regions for beam pipe](#SetBP)\n",
" * [Set Signal and Background regions for BPIX](#SetBPIX)\n",
" * [Set Signal and Background regions for pixel support tube](#SetTube)\n",
" * [Set Signal and Background regions for rails, by using x position of NI candidate](#SetRails)\n",
" * [Classify NI candidates as Signal, as Background, and as Non-classified regions](#ClassifyEvents)\n",
" * [Check classification result](#CheckClassification)\n",
" * [Estimate background-signal ratio (B/S) of each signal region](#BkgEstimation) \n",
" * [Shuffle Data](#DataShufle)\n",
" * [Sort track parameters by $p_T$ decreasing and normalize subleading $p_T$ tracks](#SortPt)\n",
" * [Plot variables, injected to NN](#VariablesToNN)\n",
" * [Divide data into Train and Test data sets](#DataSplit)\n",
" * [Data preparation and classification for the NN](#FinalClassification)\n",
"* [Principal component analysis (PCA)](#PCA)\n",
"* [Keras mode: NN with 2 hidden layers](#KerasModel)\n",
" * [Import libraries](#ImportKeras)\n",
" * [Create function for NN model with 2 hidden layers](#NNfunction)\n",
" * [Create NN model structure and compile it](#ModelCompile)\n",
" * [NN model training](#ModelTraining)\n",
" * [Save/Load NN model to/from file](#Save-Load-Model)\n",
" * [Monitor performance during training](#MonitorTraining)\n",
" * [Model results](#ModelResults)\n",
" * [Predict the probability distribution of NN classes for Train and Test sets](#PredictY)\n",
" * [The probability distribution for injected vertex to be a signal](#PlotY)\n",
" * [NN model optimization with Test set](#YpredOptimization)\n",
" * [Plot Train and Test prediction for Signal-Background separation as function of BPIX radius](#PlotPredictedResultsR)\n",
" * [Background to Signal (B/S) ratios in Signal regions (S0-S6)](#BSafterClass)\n",
" * [Tracker tomography with Test set for Signal-Background separation in x-y plane](#PlotPredictedTomography)\n",
"* [Summary](#Summary)\n",
"* [Documentation](#Doc)\n",
"* [Acknowledgment](#Acknowledgment)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Introduction \n",
"[jump to top](#Top)\n",
"\n",
"In HEP, very often problem of signal-background (noise) separation appears:\n",
"* resonant peaks from decay particle,\n",
"* physics objects reconstruction/identification, for example, pions, photons, electrons, b(t)-jets… \n",
"* nuclear interactions with material (this analysis),\n",
"* photon conversions with material,\n",
"which are on top of combinatorial background.\n",
"\n",
"Very often, there is no clean sample of signal to train a neural network (NN), but regions with enhanced contribution of signal could be known (by mass, geometrical, or any phase space cuts).\n",
"\n",
"Machine learning technique of NN with floating classification could be helpful:\n",
"* input classification is done on mixed samples with different fractions of background to signal,\n",
"* output classification is optimized for real signal and combinatorial background separation.\n",
"\n",
"This analysis is performed with [Jupyter notebook](http://ebooks.iospress.nl/publication/42900) \n",
"at [SWAN](https://www.sciencedirect.com/science/article/abs/pii/S0167739X16307105?via%3Dihub) platform:\n",
"https://github.com/kropiv/MLforNIatPyHEP and [Binder](https://mybinder.org/v2/gh/kropiv/MLforNIatPyHEP/master)\n",
"and is based on the CMS public results, [public twiki](https://twiki.cern.ch/twiki/bin/view/CMSPublic/TrackerMaterialNIwithML2018).\n",
"\n",
"# CMS detectors \n",
"[jump to top](#Top)\n",
"\n",
"
\n", " \n", " $\\bf{Fig. 1}$: CMS detectors.\n", "
\n", "\n", "CMS detectors are designed to study different particle properties, created during p-p collisions, with high performance and resolutions: \n", "\n", "* muon system detects and measures muons, \n", "* central tracking system gives accurate momentum measurements, as well as the position of primary and secondary vertices\n", "* an electromagnetic calorimeter detects and measures electrons and photons,\n", "* hadron calorimeter detects and measures hadrons. \n", "\n", "In this analysis, material of [the pixel detector](#PixelDet) (part of the tracking system) is studied with [nuclear interactions](#NIs).\n", "\n", "\n", "## Pixel detector \n", "\n", "Inner tracker system consists of Pixel and Strip detectors, \n", "which reconstruct charged particles momentum with high precision.\n", "\n", "\n", " \n", " $\\bf{Fig. 2}$: Pixel detector. \n", "
\n", "\n", "Pixel detector consists of Barrel pixel (BPIX) and Forward pixel detectors.\n", "Data from barrel region only are analyzed in this analysis. \n", "\n", "[jump to top](#Top)\n", "\n", "\n", "# Nuclear interactions \n", "\n", "* Nuclear interactions (NIs) are interactions of hadrons with the detector material, which create secondary vertices. \n", "* For Physics analysis, the NIs play the role of background (noise) in the data. \n", "* Due to its interaction with material of the detector, the positions of these secondary vertices map the material with a sub-millimeter precision. Accurate knowledge of the positions of active and inactive elements is important for simulating the detector, planning detector upgrades, and reconstructing charged particle tracks.\n", "\n", "\n", " \n", " $\\bf{Fig. 3}$: Nuclear interaction schematic view. \n", "
\n", "\n", "Example, of material mapping with NIs for BPIX detector is presented at Fig. 4, taken from [CERN-CMS-DP-2019-001](http://cds.cern.ch/record/2664786?ln=en). \n", "\n", "NI candidates reproduce inner tracker hadrography, but a big combinatorial background from random vertices is observed near the beam pipe, 1st, 2nd and 3rd layers of the barrel pixel (BPIX) detector.\n", "\n", "\n", " \n", " $\\bf{Fig. 4}$: Hadrography of the tracking system in the x-y plane in the barrel region ($|z| < 25$ cm). The density of NI vertices reproduces structure of the BPIX detector. \n", "
\n", "\n", "[jump to top](#Top)\n", "\n", "\n", "## Data selection and reconstruction\n", "\n", "* p-p collisions at 13 TeV from the single muon collection:\n", " * Study with part of 2018 promptly reconstructed data (4.3 fb-1)\n", "* The nuclear interaction (NI) reconstruction technique is presented at:\n", " * [DOI:10.1088/1748-0221/13/10/P10034](http://dx.doi.org/10.1088/1748-0221/13/10/P10034)\n", " * [CERN-CMS-DP-2019-001](http://cds.cern.ch/record/2664786?ln=en)\n", "\n", "* NI is a displaced vertex with following requirements:\n", " * at least 3 tracks incoming or outgoing from the vertex;\n", " * invariant mass of the outgoing system > 1 GeV to suppress light mesons, baryons, and photon conversions.\n", "\n", "Only NI vertex candidates (NI candidates) from barrel region of the tracker detector (BPIX, |z| < 25 cm) are analyzed: around 1.5×106 NI candidates.\n", "\n", "[jump to top](#Top)\n", "\n", "## Toy Data\n", "\n", "There is no public CMS data sample for this notebook, so a Toy sample was generated in the next section:\n", "\n", "* Background radius distribution was simulated with a non-central chi-squared shape.\n", "* Signal radius distributions were simulated with Gaussian (normal) functions, except the rails simulation, which used a box-shape.\n", "* Input variables for neural network:\n", " * were randomly generated using Gaussian distributions (mean, $\\sigma$) with sigma taken from real data;\n", " * mean value for signal and background was slightly scaled according to the radius of the NI candidate: mean*(1+Radius/50);\n", " * mean value of the background was randomly varied between $\\pm(0.4\\sigma:0.5\\sigma)$ about the mean value of the signal.\n", "\n", "Results with CMS data are available in the notebook as an output, but, during presentation, Toy data will be used to show the notebook functionality.\n", "\n", "[jump to top](#Top)\n", "\n", "\n", "## Connect/Generate data " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:log:shape of data = (1397381, 27)\n" ] } ], "source": [ "# DataType = \"CMS\"\n", "DataType = \"Toy\" # for PyHEP only Toy could be used\n", "#import matplotlib and numpy\n", "import matplotlib\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from matplotlib.colors import LogNorm\n", "\n", "import logging, sys\n", "from importlib import reload\n", "reload(logging) # you need it if want switch logging level\n", "\n", "\n", "#logging.basicConfig(stream=sys.stdout, level=logging.INFO) # it could make settings for all logger, what we don't want\n", "logging.basicConfig(stream=sys.stdout) # it could make settings for all logger, what we don't want\n", "#logging.disable(sys.maxsize) # desiable logging\n", "\n", "logger = logging.getLogger('log')\n", "# logger.setLevel(level=logging.DEBUG)\n", "logger.setLevel(level=logging.INFO)\n", "\n", "plt.rc('axes', labelsize = 15)\n", "plt.rc('axes', titlesize= 17)\n", "plt.rc('font', size=12) \n", "plt.rc('legend', fontsize=15)\n", "\n", "# set CMS label at each plot:\n", "if DataType == \"Toy\":\n", " labelData = \"Toy Data\"\n", " CMSlabel = \"Generator\"\n", " CMSlumi = \" \"\n", "else:\n", " labelData = 'Data 2018, |z| < 25 cm'\n", " CMSlabel = \"Preliminary\"\n", " CMSlumi = \" 4.3 fb$^{-1}$ (13 TeV) \"\n", "# CMSlabel = \"internal\"\n", "def SetCMSlabel(px, label = CMSlabel, size = 17, label_lumi = CMSlumi):\n", " if DataType == \"Toy\":\n", " TitleCMS = r\"$\\bf{Toy}$\"+\" \"+r\"$\\it{\"+label+\"}$\"\n", " else:\n", " TitleCMS = r\"$\\bf{CMS}$\"+\" \"+r\"$\\it{\"+label+\"}$\"\n", " text = px.text(0.,1.,TitleCMS, size = size, transform=px.transAxes,\n", " verticalalignment='bottom', horizontalalignment='left')\n", " text2 = px.text(1.,1.,label_lumi, size = size, transform=px.transAxes,\n", " verticalalignment='bottom', horizontalalignment='right')\n", " return text, text2\n", "\n", "def CalcRad(xpos, ypos):\n", " Rad = np.sqrt(np.square(xpos)+np.square(ypos))\n", " Rad_BP = np.sqrt(np.square(xpos-0.171)+np.square(ypos+0.176))\n", " Rad_BPIX = np.sqrt(np.square(xpos-0.086)+np.square(ypos+0.102))\n", " Rad_Tube = np.sqrt(np.square(xpos+0.080)+np.square(ypos+0.318))\n", " return Rad, Rad_BP, Rad_BPIX, Rad_Tube\n", "\n", "def gaussian(x, mu, sig):\n", " return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))\n", "\n", "# connect data\n", "if DataType == \"Toy\":\n", " \n", " np.random.seed(10) # to fix random generator\n", " scale = 1 # (should be int) scale amount of your Toy Data\n", " Diff_SB = 0.5 # variation of background mean by \\pm Diff_SB*sigma \n", " Diff_SB_min = 0.4\n", "\n", " def StructureGen(pos, lw, lw_corr, ngen, x0, y0):\n", " lenth = np.size(ngen)\n", " for i in range(0,lenth):\n", " r_gen = np.random.normal(loc=pos[i], scale=lw[i]/lw_corr[i], size=ngen[i])\n", " phi_gen = np.random.uniform(low=-np.pi, high=np.pi, size=ngen[i])\n", " x_gen = np.multiply(r_gen, np.cos(phi_gen)) + x0\n", " y_gen = np.multiply(r_gen, np.sin(phi_gen)) + y0\n", " z_gen = np.random.uniform(low=-25., high=25., size=ngen[i])\n", " if i == 0:\n", " x_str, y_str, z_str = x_gen, y_gen, z_gen\n", " else:\n", " x_str = np.concatenate(([x_str,x_gen]),axis=0)\n", " y_str = np.concatenate(([y_str,y_gen]),axis=0)\n", " z_str = np.concatenate(([z_str,z_gen]),axis=0)\n", " return x_str, y_str, z_str\n", "\n", " def varGen(varName, varMean, varSigma, Rad):\n", " var_lenth = np.size(varName)\n", " logger.debug(\"var_lenth size = \" + str(np.size(varName)))\n", " sample_size = np.size(Rad)\n", " for i in range(0,var_lenth):\n", " varM = varMean[i]*(1. + Rad/50.) # small scale: with Raduis variable are changes slightly Rad between 0 and 25\n", " varS = varSigma[i]*(1. + Rad/50.)\n", " # print(\"varM shape = \" + str(varM.shape))\n", " var_gen = np.random.normal(loc=varM, scale=varS, size=sample_size)\n", " if i == 0:\n", " var_tot = var_gen\n", " else:\n", " var_tot = np.c_[var_tot,var_gen]\n", "\n", " return var_tot\n", "\n", " # generate background:\n", " # https://en.wikipedia.org/wiki/Noncentral_chi-squared_distribution\n", " n_bkg = 400000*scale\n", " r_bkg = np.random.noncentral_chisquare(df=3, nonc=2, size=n_bkg)\n", " r_bkg = r_bkg + 1.\n", " phi_bkg = np.random.uniform(low=-np.pi, high=np.pi, size=n_bkg)\n", " x_bkg = np.multiply(r_bkg, np.cos(phi_bkg))\n", " y_bkg = np.multiply(r_bkg, np.sin(phi_bkg))\n", " z_bkg = np.random.uniform(low=-25., high=25., size=n_bkg)\n", "\n", " # beam pipe position and Radius is taken from CMS-DP-2019-001 (http://cds.cern.ch/record/2664786?ln=en)\n", " # generate beam pipe (BP):\n", " n_BP = [30000*scale]\n", " # in R_BP centered at BP\n", " xSignal_BP = [2.21]\n", " lw_Signal_BP = [0.1]\n", " lw_corr_BP = [3.5]\n", " x0_BP, y0_BP = 0.171, -0.176\n", " x_BP, y_BP, z_BP = StructureGen(xSignal_BP, lw_Signal_BP, lw_corr_BP, n_BP, x0_BP, y0_BP)\n", "\n", "\n", " # BPIX position is taken from Figure. 4.1 at CMS-TDR-11 (https://cds.cern.ch/record/1481838?ln=en)\n", " # generate BPIX: \n", " # Inner Shield L1_1 L1_2 L2_1 L2_2 L3_1 L3_2 L4_1 L4_2 Outer Shield \n", " xSignal_BPIX = [2.49, 2.8, 3.10, 6.65, 6.98, 10.80, 11.10, 15.84, 16.13, 18.65]\n", " lw_Signal_BPIX = [0.055, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2]\n", " lw_corr_BPIX = [2., 3., 6., 3., 6., 3., 3., 3., 3., 3.]\n", " n_BPIX = [2000, 10000, 5000, 8000, 3500, 4000, 4000, 3000, 3000, 1000]\n", " logger.debug(\"n_BPIX befor = \" +str(n_BPIX ))\n", " n_BPIX = np.multiply(n_BPIX,scale)\n", " logger.debug(\"n_BPIX after = \" +str(n_BPIX ))\n", "\n", " x0_BPIX, y0_BPIX = 0.086, -0.102\n", " x_BPIX, y_BPIX, z_BPIX = StructureGen(xSignal_BPIX, lw_Signal_BPIX, lw_corr_BPIX, n_BPIX, x0_BPIX, y0_BPIX)\n", "\n", " #tube position and Radius is taken from CMS-DP-2019-001 (http://cds.cern.ch/record/2664786?ln=en)\n", " # generate Tube:\n", " xSignal_Tube = [21.75] # avarige of Rx and Ry\n", " lw_Signal_Tube = [0.4]\n", " lw_corr_Tube = [3.5]\n", " n_Tube = [10000*scale]\n", " x0_Tube, y0_Tube = -0.080, -0.318\n", " x_Tube, y_Tube, z_Tube = StructureGen(xSignal_Tube, lw_Signal_Tube, lw_corr_Tube, n_Tube, x0_Tube, y0_Tube)\n", "\n", " #Rails position and Radius is taken from CMS-DP-2019-001 (http://cds.cern.ch/record/2664786?ln=en)\n", " # generate Rails:\n", " n_Rails = 1000*scale\n", " ySignal_TopRail = 19.08\n", " ySignal_BotRail = -19.73\n", " lw_yRail = 1.\n", " xmin, xmax = -5, 5\n", " x_TopRail = np.random.uniform(low=xmin, high=xmax, size=n_Rails)\n", " y_TopRail = np.random.uniform(low=ySignal_TopRail, high=(ySignal_TopRail+lw_yRail), size=n_Rails)\n", " z_TopRail = np.random.uniform(low=-25., high=25., size=n_Rails)\n", " x_BotRail = np.random.uniform(low=xmin, high=xmax, size=n_Rails)\n", " y_BotRail = np.random.uniform(low=(ySignal_BotRail-lw_yRail), high=ySignal_BotRail, size=n_Rails)\n", " z_BotRail = np.random.uniform(low=-25., high=25., size=n_Rails)\n", "\n", " x_sig = np.concatenate(([x_BP,x_BPIX,x_Tube,x_TopRail,x_BotRail]),axis=0)\n", " y_sig = np.concatenate(([y_BP,y_BPIX,y_Tube,y_TopRail,y_BotRail]),axis=0)\n", " z_sig = np.concatenate(([z_BP,z_BPIX,z_Tube,z_TopRail,z_BotRail]),axis=0)\n", " x = np.concatenate(([x_bkg,x_sig]),axis=0)\n", " y = np.concatenate(([y_bkg,y_sig]),axis=0)\n", " z = np.concatenate(([z_bkg,z_sig]),axis=0)\n", "\n", " logger.debug(\"x shape = \" +str(x.shape))\n", " logger.debug(\"y shape = \" +str(y.shape))\n", " logger.debug(\"z shape = \" +str(z.shape))\n", "\n", " lenth_sig = np.size(x_sig)\n", " lenth_bkg = np.size(x_bkg)\n", " \n", " # create 23 input variables with gaussian, the same sigma for S and B, but with some shift in mean for S and B \n", " var_Name = np.asarray([\"ver\", \"NI\", \"pT1\",\"pT2\", \"pT3\", \"eta1\", \"eta2\", \"eta3\", \"phi1\", \"phi2\", \"phi3\", \n", " \"chi2_1\", \"chi2_2\", \"chi2_3\", \"normchi2_1\", \"normchi2_2\",\"normchi2_3\",\n", " \"hits1\",\"hits2\", \"hits3\", \"algo1\", \"algo2\", \"algo3\"])\n", " # print(\"var_Name shape = \" + str(var_Name.shape))\n", " var_Mean_Sig = np.asarray([20., 1.1, 1.5, 1., 0.5, 0., 0., 0., 0., 0., 0.,\n", " 20., 15., 12., 1.2, 1., 0.8,\n", " 20., 15., 10., 10., 9., 8.])\n", " var_Sigma = np.asarray([10., 0.3, 0.3, 0.3, 0.3, 1., 1., 1., np.pi, np.pi, np.pi,\n", " 10., 8., 5., 0.5, 0.4, 0.3,\n", " 5., 4., 3., 5., 4., 3.])\n", " # variation of background mean by \\pm (Diff_SB_min, Diff_SB)*sigma\n", " fracRandom = np.random.uniform(low=Diff_SB_min, high=Diff_SB, size=var_Sigma.size)\n", " IntRandom = np.random.randint(2, size=var_Sigma.size) #genrate 0 or 1\n", " fracRandom[IntRandom==0] = -fracRandom[IntRandom==0]\n", " var_Mean_Bkg = var_Mean_Sig-np.multiply(fracRandom,var_Sigma)\n", " logger.info(\"Background mean value shift in $\\sigma$ = \" + str(fracRandom))\n", "\n", " # generate signal input variables:\n", " Radius = CalcRad(x_sig,y_sig)[0]\n", " var_Signal = varGen(var_Name, var_Mean_Sig, var_Sigma, np.asarray(Radius))\n", "\n", " # generate background input variables:\n", " Radius = CalcRad(x_bkg,y_bkg)[0]\n", " var_Bkg = varGen(var_Name, var_Mean_Bkg, var_Sigma, np.asarray(Radius))\n", "\n", " logger.debug(\"var_Signal shape = \" + str(var_Signal.shape))\n", " logger.debug(\"var_Bkg shape = \" + str(var_Bkg.shape))\n", "\n", " # merge Signal and Background\n", " var = np.r_[var_Bkg,var_Signal]\n", " logger.debug(\"var shape = \" + str(var.shape))\n", "\n", " # merge var and positions 1st bkg, after signal\n", " num = np.asarray(range(0,np.size(x)))\n", " data = np.c_[num,np.asarray(x),np.asarray(y),np.asarray(z),var]\n", " print(\"Toy data.shape = \" + str(data.shape))\n", "\n", "else:\n", " data = np.genfromtxt(\"/eos/user/k/kropiv/root-files/NI/NN_X_2018D_barrel.csv\", delimiter=',')\n", "logger.info(\"shape of data = \" + str(data.shape))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Display generated Toy data:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "if DataType == \"Toy\":\n", " # using the variable ax for single a Axes\n", " fig, (ax,bx) = plt.subplots(1,2, figsize=(17,7))\n", "# fig, ax = plt.subplots(figsize=(15,7))\n", " nb = 200\n", "\n", " Rad = CalcRad(x, y)[2] # 2nd element centered at BPIX\n", " cut = 23.\n", " Xmax = 25.\n", " xcut = x[Rad < cut]\n", " ycut = y[Rad < cut]\n", " # to add color pallete to figure: cmap = 'viridis' (default), 'jet' \n", " counts, xedges, yedges, im = ax.hist2d(xcut, ycut, bins=nb, range = [[-Xmax, Xmax], [-Xmax, Xmax]], norm=LogNorm(),\n", " cmap = 'viridis')\n", " ax.set_xlabel('x (cm)')\n", " ax.set_ylabel('y (cm)')\n", " SetCMSlabel(ax) \n", " ax_cbar = plt.colorbar(im, ax=ax)\n", " \n", " x_values = np.linspace(-1.5, 2, 100)\n", " for mu, sig in [(0, 0.5), (Diff_SB*0.5, 0.5)]:\n", " bx.plot(x_values, gaussian(x_values, mu, sig))\n", " bx.text(0.05, 0.9, \"Gaussian\",\n", " verticalalignment='bottom', horizontalalignment='left',\n", " transform=bx.transAxes, color='black', fontsize=15)\n", " bx.legend(['mean = 0', 'mean = 0.5$\\sigma$'],loc=\"upper right\",framealpha=1.)\n", " \n", " fig.tight_layout()\n", " plt.savefig('Results/Toy_Generator.pdf')\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Neural network (NN) motivation and strategy \n", "\n", "For each NI candidate, monitoring variables are available, which are very similar for real NIs (signal) and combinatorial background (background).\n", "\n", "* Machine learning technique could be helpful for signal-background separation.\n", "* A NN with 2 hidden layer (with 12 neurons in each hidden layer) is selected:\n", " \n", "* For simplicity, only vertices for a NI candidate with exactly 3 tracks are used:\n", " 1.4×106 (=3 tracks, majority of the vertices) from 1.5×106 (≥ 3 tracks) vertices.\n", "\n", "* 23 variables are injected to the input layer of NN (23 input variables for NN):\n", " * number of primary vertices; \n", " * number of NI candidates per one event; \n", " * 3 tracks for each NI vertex candidate:\n", " * $p_T$, $\\eta$, and $\\phi$;\n", " * $\\chi^2$, and normalized $\\chi^2$;\n", " * number of valid hits;\n", " * track reconstruction algorithm.\n", "\n", "* The vertex position (x, y, and z) is used for classification of NI candidates.\n", " * N.B.: It is not injected as input variable for NN.\n", "\n", "[jump to top](#Top)\n", "\n", "# Classification strategy for NN \n", "\n", "Classification for signal and background regions is done by using radius of the NI candidate, r, where\n", "$r = \\sqrt{(x-x_0)^2 + (y-y_0)^2}$:\n", "* $(x,y)$ is the vertex position of the NI candidate;\n", "* $(x_0,y_0)$ is the central position of material structures in CMS coordinates, which are installed with millimeter precision, and is taken from [CERN-CMS-DP-2019-001](http://cds.cern.ch/record/2664786?ln=en).\n", "\n", "Classification is done for 7 signal regions (S0-S6) and for 5 background regions (B7-B11), defined in sections below.\n", "\n", "| Material structure | Radius definition | Material center position |\n", "| --- | --- | --- |\n", "| beam pipe (BP) | r, centered at BP | (1.71, -1.76) mm |\n", "| BPIX inner/outer shields, layers 1-4 | r, centered at BPIX | (0.86, -1.02) mm |\n", "| BPIX rails and pixel support tube | r, centered at tube | (0.80, 3.18) mm |\n", "\n", "\n", "[jump to top](#Top)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Set Signal and Background regions for beam pipe \n", "\n", "[jump to top](#Top)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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nnqKRYsWMW7cOH7//XdatGjhWZM2d+5cSpQoQZ8+fVi5ciUrV67kyiuvBGDHjh0MHDiQefPmMXnyZNLS0mjatClHjhwJql/79+9n06ZN1K5d25O2YcMGatas6ZMvIiKCatWqsWHDhqDqv/POO9m1axcvvvgihw4d4o8//uDhhx+mZs2atGzZMqi6Akm/LumvBx54AGMM1atXz3Gdp0+fZsmSJdx6663Ex8fzwgsv0Lp1a1577bWg6/r2228pXbo0ZcqU8Un/7LPPiIqKIioqijZt2vDDDz+csa7333+fLl26UK1aNWbOnMmUKVO49NJL2b9/vydPUlISffv2ZfDgwXz00Uds376du+66ix49enDttdcyZ84cKlasSLdu3TKsGc0tmkoqIiIiIpKJyMhISpcuzd69ez1p7777rud9WloaV199NfHx8XzzzTdcf/31NGjQgMKFCxMfH59h2uErr7ziU7Z169aULVuWefPm0atXr2z365FHHiE6Opru3bt70g4dOuQZ1fNWqlQpDh06lO26wRkxW7hwId26deOJJ54AoGbNmnz66ae5sqbO+7p89913TJ48maFDh3LttdcGXdeWLVuYMmUKU6ZMYffu3bRu3ZoPP/yQTp06EREREXR9v/zyC2+++SaPP/64T3qzZs24++67qV69Otu2bWPkyJFcd911/Pe//6VKlSoB6zp9+jRPPPEEnTt35qOPPvKkd+zY0SffiRMnePXVV2nWrBkAu3btYsCAATz33HM8+uijAMTHx3P55Zfz1Vdf5clUXo0YioiIiIhkwX/q5JIlS7jmmmsoUaKEJwAEAu4S6m/VqlW0bt2auLg4ChcuTFRUFMeOHctW2XQTJ07kgw8+4O233yYuLs7nM2NMwP4HSs/Kzz//TM+ePenSpQtffPEF8+bNo1SpUtx88825Nr0SnJHPzp0706pVK/7v//4v6PJDhw6lWrVqfPTRR/Tv359t27axZMkSunXrlqOg8NChQ9x6663Uq1ePp556yuez5557jnvuuYfrrruOO++8k+XLl2OMYdy4cZnW99tvv7Fr1y7uueeeLNuNiIjguuuu8xynj5y2aNEiQ9rOnTuDPq/sUGAoIiIiIpKJ5ORkDhw4QLly5QBYu3YtHTt2JD4+nvfff5+VK1d6ppme6bEF27dv58Ybb8Ray1tvvcU333zD2rVrKVu2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ffv25ZFHHmHfvn1cf/31HD58mNmzZ/Pxxx9naPeFF17g6NGjdOrUic8//5wmTZpQp04dOnToQP/+/Tl69Cjly5fnH//4B1FRUYSFnXlcp02bNjRt2pTbb7+dF154gbi4OF5++WVOnDjBY4895snXuXNnXn/9dRo0aMAll1zC22+/na1HTPgrVKgQQ4YM4dFHH6V06dJcd911/POf//QJOoPVunVrzwY2jz/+OJdffjmJiYl8//33JCcnM3r0aOLi4rjvvvsYOnQo4eHh1KpViylTppCYmJhhBNJbrVq16NGjBwMHDiQxMZHq1aszefJkNmzY4LO5UKjJ76mkJ4EW1tpjxphw4GtjzBL3s1estS97ZzbG1Aa6A5cDFwFfGGMutdamAROBvsAqnMCwLbAEERGRPKS1hyIXpiNHjnD11VcDEB4eTuXKlbn//vt55plnPHn69evH77//zvjx40lOTqZ169ZMnz49w8PT33jjDSpXrszbb7/NCy+8QNmyZWndunWmbU+YMIHjx49z0003sWLFCurXr8/UqVPp378/gwYNIjo6mgEDBnDJJZewdm32/g+aO3cujzzyCA899BDJyck0btyYL7/8kurVq3vyDB06lH379vHMM88QERHBwIEDqVOnToZnG2bHQw89xMGDB3nzzTcZN24cHTt2ZMyYMdxxxx1B1wXO1NI5c+YwatQoxo0bx/bt24mNjeWKK67ggQce8OQbM2YMKSkpDBs2jLCwMO666y769OnDuHHjsqx/8uTJPP7444wYMYLDhw9Tt25dFi5cGNIjhqagBtmMMVHA10B/4CbgWIDA8EkAa+1o9/hTYBiwFVhura3ppvcAmltr+2XVZqNGjaz/gz1DxcS1E4mPiS/obohICNiRuIP+Cf3zvqGJEyE++P/XchrYpY8QepfPlVHDHTugfz5cL5E8sn79eho2bJghfc4vc9h7fG++96dcsXJ0qZ393TDPF6mpqdSpU4errrqKadOmFXR3zmmtWrUiJSUlw/rPUJHZ32Q6Y8x6a20j//R833zGGFMIWA9UB1631q42xtwEDDTG9ALWAY9Yaw8BFXFGBNPtcNNS3Pf+6SIiIvkqfVqpppeK+LoQg7P8NGvWLHbt2kXdunVJTExk8uTJ/O9//8vW2sVQsnz5clavXs2VV15JSkoKM2bMYNmyZcyaNaugu3beyffA0J0GeoUxpiQw1xhTB2da6AjAuj/HAn8DAk0OtlmkZ2CM6Ysz5ZSLL774rPsvIiIiIpLXihUrxpQpU9i0aRNpaWnUrVuXBQsW0Lhx44Lu2jklOjqaTz75hNGjR5OcnEyNGjWYOnUqXbt2LeiunXcK7HEV1trDxpgVQFvvKaTGmMnAQvdwB1DJq1g8sMtNjw+QHqidScAkcKaS5lb/RUREtN5QRPLKzTffzM0331zQ3TjnJSQkeDYNkrOTr4+rMMaUcUcKMcYUBVoBG4wxFbyydQZ+ct/PB7obYyKNMVWBGsAaa+1u4KgxpolxthzqBfjujysiIiIiIiLZkt8jhhWAae46wzBgprV2oTHmfWPMFTjTQbcC/QCstT8bY2YCvwCpwAB3Kio4m9ZMxXlcxRK0I6mIiJzB2YzwZaes1hmKiMj5Kl8DQ2vtD0CDAOl3ZVFmJDAyQPo6oE6udlBEREREgnb69OlsPV9PRPLW6dOnc1xWf8EiIhIStB5QJG9ERESQlJRU0N0QESApKYmIiIgclVVgKCIiIiI5VrFiRTZv3syxY8fOarRCRHLu9OnTHDt2jM2bN1OxYs6e4ldgu5KKiIjkB637E8lbsbGxAGzZsoVTp04VcG9EQldERASVKlXy/E0GS4GhiIiIiJyV2NjYHN+Misi5QVNJRUREzpLWL4qIyPlOgaGIiFzwFLiJiIhkTYGhiIiIiIhIiFNgKCIiIiIiEuIUGIqIiIiIiIQ4BYYiIiIiIiIhToGhiIiIiIhIiFNgKCIikou0A6qIiJyPFBiKiMgFq6CCNAWHIiJyvlFgKCIiIiIiEuIUGIqIiIiIiIQ4BYYiIiIiIiIhToGhiIiIiIhIiFNgKCIiIiIiEuIUGIqIiIiIiIQ4BYYiIiIiIiIhToGhiIiIiIhIiFNgKCIiIiIiEuIUGIqIyAWpz7S1Bd0FERGR84YCQxERERERkRCnwFBERERERCTEKTAUEREREREJcQoMRUREREREQpwCQxERkTygzW9EROR8osBQREREREQkxCkwFBERERERCXEKDEVEREREREKcAkMREZE8onWGIiJyvlBgKCIiIiIiEuIUGIqIiIiIiIQ4BYYiIiIiIiIhLl8DQ2NMEWPMGmPMf40xPxtjnnPTY40xnxtj/uf+LOVV5kljzCZjzG/GmDZe6Q2NMT+6n71qjDH5eS4iIiIiIiIXivweMTwJtLDW1geuANoaY5oATwDLrLU1gGXuMcaY2kB34HKgLfCGMaaQW9dEoC9Qw321zc8TERERyQ5tQCMiIueDfA0MreOYexjuvizQCZjmpk8DbnHfdwI+ttaetNZuATYBjY0xFYAYa+1Ka60F3vMqIyIiIiIiIkHI9zWGxphCxpjvgX3A59ba1UA5a+1uAPdnWTd7ReAPr+I73LSK7nv/dBEREREREQlSvgeG1to0a+0VQDzO6F+dLLIHWjdos0jPWIExfY0x64wx6/bv3x98h0VERERERC5wBbYrqbX2MLACZ23gXnd6KO7PfW62HUAlr2LxwC43PT5AeqB2JllrG1lrG5UpUyZXz0FERERERORCkN+7kpYxxpR03xcFWgEbgPnA3W62u4F57vv5QHdjTKQxpirOJjNr3OmmR40xTdzdSHt5lREREREREZEgFM7n9ioA09ydRcOAmdbahcaYlcBMY0wfYDvQDcBa+7MxZibwC5AKDLDWprl19QemAkWBJe5LREREREREgpSvgaG19gegQYD0A0DLTMqMBEYGSF8HZLU+UURERERERLKhwNYYioiI5BU9O1BERCQ4QY8YGmMigDJAEeCgtfZQrvdKRERERERE8k22AkNjzOU4G7y0AuoChbw+OwB8C8wG/mmtPZEH/RQREREREZE8kuVUUmNMU2PMcuAHoBnwFXAf0BFoA9wOjAGSgVeAXcaYZ40x0XnaaxEREREREck1ZxoxnAO8Ctxlrd2RVUZ3p9FWwENu0oiz756IiIiIiIjktTMFhpWttcnZqch9jMSnwKfGmCJn3TMRERERERHJF1lOJc1uUJhb5URERM7Wubgj6bnYJxEREW852ZX0MqAizq6kPqy1i3OjUyIiIiIiIpJ/sh0YGmPqAh8BtQATIIvFa7dSEREREREROT8EM2L4LpACtAc2AafypEciIiIiIiKSr4IJDGsBt1prP82rzoiIiIiIiEj+y3LzGT9rgIvzqiMiIiIiIiJSMIIZMewLfGSMSQKWA4f9M1hrk3KrYyIiIiIiIpI/ggkM/wS2Au9lkUebz4iIiIiIiJxnggkMPwCuBl5Gm8+IiIiIiIhcMIIJDG8A7rPWTs+rzoiIiIiIiEj+C2bzma2A1hCKiIiIiIhcYIIJDB8DnjbGVMmbroiIiIiIiEhBCGYq6XM4j6vYaIzZSuBdSRvnUr9EREREREQknwQTGP7kvkREREREROQCku3A0Fp7T152RERERERERApGMGsMRURERERE5AIUzFRSjDGNgc5ARaCI/+fW2ttyqV8iIiIiIiKST7IdGBpjBgNjgb3A7+gB9yIiIiIiIheEYEYMHwHGAw9ba20e9UdEROSC1GfaWt65O6GguyEiIhJQMGsMI4FFCgpFREREREQuLMEEhlOBLnnUDxERERERESkgwUwlfRyYYIz5AviSjA+4t9baibnWMxEREREREckXwQSGLYA7gOLue38WUGAoIiIiIiJynglmKukbwGrgciDSWhvm9yqUN10UERERERGRvBTMiOFFwN+ttb/mVWdEREREREQk/wUzYvgFUD+vOiIiIiIiIiIFI5gRw1eBN40xRQm8+QzW2l9yq2MiIiIiIiKSP4IJDL9wfw4HnvP7zOBsPqN1hiIi0hpfiwAAIABJREFUUmD6TFtb0F0QERE5LwUTGN6QZ70QERERERGRApPtwNBa+9XZNmaMqQS8B5QHTgOTrLXjjTHDgPuA/W7Wp6y1i90yTwJ9gDRgkLX2Uze9ITAVKAosBh601tqz7aOIiIiIiEioCWbEMDekAo9Ya78zxhQH1htj/r+9Ow+Trarv/f/+BBAccAQVAT0k4oBEUY84kBunGBGTIImJGH8CenKJ41WT+1zRTA4/4pDJeBNNUJBDYkRUVJzlh+KIwlFRZkVBOELgKA44geD398ferUXRXUN3jV3v1/PU01Vrr733d9eu7l3fXmuvdWq77J+q6u87KyfZBziUZoqMuwH/X5J7VdWNNHMmHgl8jiYxPBD40ISOQ5IkSZLWjWFGJV2zqrqyqr7YPr8WuADYvccqBwMnVtV1VXUJcDGwf5LdgNtW1RltK+EJwJPGHL4kSZIkrUsTTQw7JdkAPBD4fFv0vCRfSXJckju0ZbsDl3estrUt27193l0uSZIkSRrSVBLDJLcB3gW8sKp+QNMt9NeA/YArgX9YqrrM6tWjfLl9HZlkS5It27ZtW66KJEmSJC20iSeGSXagSQrfWlUnA1TVVVV1Y1X9HHgTsH9bfSuwZ8fqewBXtOV7LFN+M1V1TFVtrKqNu+6662gPRpIkSZLWgYESwyQ7JLlTj+U7J/nNAbYT4Fjggqr6x47y3TqqHQKc2z4/BTg0yY5J9gL2Bs6sqiuBa5M8rN3mYcB7BzkWSZIkSdJN9RyVNMmvAK8BngPslOTbwL8Ar6qqGzqq7gN8nP4T3B8APB04J8nZbdlLgacm2Y+mO+ilwJ8CVNV5SU4CzqcZ0fS57YikAM/ml9NVfAhHJJUkSZKkVek3XcWzgefT3PP3JZrE7iXAE5IcXFVD3bRXVZ9m+fsDP9hjnaOBo5cp3wLsO8z+JUmSJEk3168r6bOAV1TVX1TVO6vqRcBG4A7AGUnuOfYIJUmSJElj1S8x/FXg050FVXU+8HCawV7OSPLQMcUmSZIkSZqAfonhNm46KigAVfU94HHAp4DTgN8dfWiSJEmSpEnolxh+DnjKcguq6jrgycBbaQaQkSRJkiTNoX6J4ZuAnyS543ILq+rnVfWnwF8Cnxx1cJIkSZKk8euZGFbVaVX1lKq6pk+9v62qR482NEmS1pdNm8+adgiSJC2r33QVN9FOcn8HmvkGv1dV3xlLVJIkSZKkienXlZQk+yQ5Ick24GrgIuCrwNVJtiXZnGSfcQcqSZIkSRqPni2GSR4DvB+4GHg9cAHwXZpJ6m8P3Af4Q+CsJE+sqtPHGq0kSZIkaeT6dSV9LfAO4IiqquUqJDkaeAvw98DG0YYnSZIkSRq3fl1J7wcct1JSCNAuO76tK0mSJEmaM/0Sw8uBAwbYzgFtXUmSJEnSnOnXlfTvgDcm2YumS+mFwPdoRiXtvMfwGcCzxhinJEmSJGlMeiaGVfWmJNcCLwM20SSEnUIzQunTq+rEsUQoSZIkSRqrvvMYtgnfiW2r4X1o5jGEZnTSC6vqkjHGJ0mSJEkas4EnuG8TQJNASZIkSVpn+k5wL0mSRmfT5rOmHYIkSTczksQwyc+S3DCKbUmSJEmSJmvgrqR9vJJmIBpJkiRJ0pwZSWJYVa8YxXYkSZIkSZPnPYaSJEmStOD6thgmuQXw/wBP4JfTVRTNRPcXAh8E3lpV148xTkmSJEnSmPRMDJPcAzgVuAfwaeATNPMXBrg9TaL4b8CLkzy+qr453nAlSZIkSaPWr8XwX4FrgEdV1RXLVUhyN+BdwL8Avzva8CRJkiRJ49YvMXwU8AcrJYUAVXVFkpcD7xhlYJIkSZKkyeg3+MyPgF0G2M4uwI/XHo4kSZIkadL6tRj+J/C6JADvrqqbJH9JbgkcAvwjcMJYIpQkSZIkjVW/xPAlwG2A44G3JNlKMxpp0Qw+syfNQDTHtnUlSZIkSXOmZ2LYTkHxp0leATweuDfNdBXQjE56IfDRqvrWWKOUJKmPTZvPmnYIkiTNrb7zGAK0id9xY45FkiRJkjQFPQefSXKb1Ww0yc6rC0eSJEmSNGn9RiW9LMn/m+TX+m0oyY5J/iDJJ4EXjiY8SZIkSdK49etK+jjglcBLk3wZ+CxwLvBt4DqaAWj2Ah4MPBL4CfD3NJPdS5IkSZLmQL/BZ74AHJRkb+Aw4LHAM4EdO6pdBnymLT+lqn42plglSZIkSWPQryspAFX1tar6q6p6RFXdErgTsDuwU1VtqKqnVdW7+iWFSfZM8vEkFyQ5L8kL2vI7Jjk1ydfan3foWOclSS5OclGSx3eUPzjJOe2y16edbFGSJEmSNJx+g8+8KskBSW5Sr6q+W1VXttNZDOMG4M+r6r7Aw4DnJtkHOAo4rar2Bk5rX9MuOxS4H3Ag8IYk27XbeiNwJLB3+zhwyFgkSZIkSfRvMXwAcCqwLcl/JXlakjutdmdtMvnF9vm1wAU0LY8HA5vbapuBJ7XPDwZOrKrrquoS4GJg/yS7AbetqjOqqoATOtaRJEmSJA2hZ2JYVQcBdwQOB74HHA38d5LPJHlpkgesdsdJNgAPBD4P3KWqrmz3eSVw57ba7sDlHattbct2b593l0uSJEmShtT3HsOq+mlVvb+qnlNVG4AHAafQdN3ckuTyJP+e5PeS3GqQnbbzI74LeGFV/aBX1eVC6lG+3L6OTLIlyZZt27YNEp4kSZIkLZSBBp/pVFXnVNVrquo3aVr2/g9wK+BY4Dv91k+yA01S+NaqOrktvqrtHkr78+q2fCuwZ8fqewBXtOV7LFO+XLzHVNXGqtq46667DniUkiRJkrQ4hk4MO7WD0Lytqp5OkyQ+plf9duTQY4ELquofOxadQtNdlfbnezvKD02yY5K9aAaZObPtbnptkoe12zysYx1JkiRJ0hAGTgyT/I8kB3e83qUdkObsJP8AbF9VZ/TZzAHA04HHtOudneQg4NXA45J8DXhc+5qqOg84CTgf+DDw3Kq6sd3Ws4E30wxI83XgQ4MeiyRJkiTpl3pOcN/ltcD7+WXL3D/TTHj/buAI4Drgpb02UFWfZvn7A2m3tdw6R9MMetNdvgXYd4C4JUmSJEk9DNOV9N7AFwDaQWYOAV5QVc+iuc/wKaMPT5Kk/jZtPmvaIUiSNNeGSQxvAfy0fX4ATWvjB9rXXwV2G2FckiRJkqQJGSYxvJBmigqApwFntJPUA9wNuGaUgUmSJEmSJmOYewxfAbwjySbgdsDBHcsOBL40ysAkSZIkSZMxcGJYVackuS/wQOCcqvpqx+IzgK+MOjhJkiRJ0vgN02JIVX0D+MYy5ceMLCJJkiRJ0kQNNcF9kvsneXuSrye5LsmD2vKjkzxhPCFKkiRJksZpmAnun0AzXcVdgROAHToWXwc8f7ShSZIkSZImYZgWw1cBx1fVI7n5hPNnA/uNLCpJkiRJ0sQMkxjeB3h7+7y6lv0AuONIIpIkaZ3btPmsaYcgSdJNDJMYXg386grL7gdctvZwJEmSJEmTNkxieCLwiiS/0VFWSe4FvBh460gjkyRJkiRNxDDTVfwVsA/wCeC/27L30gxG81Hgb0cbmiRJkiRpEoaZ4P464HeSPBZ4LLALcA1wWlWdOqb4JEmSJEljNtQE9wBVdRpw2hhikSRJkiRNQc/EMMmtqurHS8/7bWypriRJkiRpfvRrMbw2ycOr6kzgh9x8mopu240mLEmSJEnSpPRLDJ8JfL19/owxxyJJkiRJmoKeiWFVbQZIsgNwMXBJVV0xicAkSZIkSZMx6DyGNwIfA+47xlgkSZIkSVMwUGJYVT8HvgbcZbzhSJIkSZImbdAWQ4C/AP46ya+PKxhJkiRJ0uQNM4/hXwJ3As5O8i3gKrpGKa2q/UcYmyRJkiRpAoZJDM8Dzh1XIJIkSZKk6Rg4MayqI8YYhyRJkiRpSga+xzDJcUn2WmHZPZIcN7qwJEkazKbNZ007BEmS5t4wg88cAey6wrJdgMPXHI0kSZIkaeKGSQyha7CZDvsC29YYiyRJkiRpCnreY5jkBcAL2pcFvCfJdV3VdqKZ3/D4kUcnSZIkSRq7foPPnA+8CwjwZ8DHgSu76lwPXAicNPLoJEmSJElj1zMxrKpTgVMBklwLvLmqvjWJwCRJkiRJkzHMdBUvH2cgkiRJkqTpGGaCe5I8Gfh9YA+aewtvoqr2H1FckiSta5s2n8Wxhz9k2mFIkgQMkRgmeRnw18CXae49vH5MMUmSJEmSJmiYFsNNwKur6qXjCkaSJEmSNHnDzGO4M3DaWnaW5LgkVyc5t6PsZUm+leTs9nFQx7KXJLk4yUVJHt9R/uAk57TLXp8ka4lLkiRJkhbZMInhicCBa9zf8Sts45+qar/28UGAJPsAhwL3a9d5Q5Lt2vpvBI4E9m4fa41LkiRJkhbWMF1JTwNek2QXmiksvtddYSmpW0lVfTLJhgH3dzBwYlVdB1yS5GJg/ySXAretqjMAkpwAPAn40IDblSRJkiR1GCYxfHv7cwNw+DLLC9humfJBPC/JYcAW4M+r6rvA7sDnOupsbct+1j7vLpckSZIkrcIwieFeY4rhjcAraRLLVwL/ADwTWO6+wepRvqwkR9J0O+Xud7/7WmOVJEmSpHVnmAnuvzmOAKrqqqXnSd4EvL99uRXYs6PqHsAVbfkey5SvtP1jgGMANm7cuGICKUmSJEmLqufgM0n+OMkdu8runmT7rrK7JVnVNBZJdut4eQiwNGLpKcChSXZMshfNIDNnVtWVwLVJHtaORnoY8N7V7FuSJEmS1H9U0v8A7rn0oh0V9BLg/l319qTpBtpTkrcBZwD3TrI1ySbgte3UE18BHg28CKCqzgNOAs4HPgw8t6pubDf1bODNwMXA13HgGUmSJElatX5dSZe7n2/VcwZW1VOXKT62R/2jgaOXKd8C7LvaOCRJkiRJvzTMPIaSJEmSpHXIxFCSJEmSFtwgieFyI3k6uqckSZIkrRODTFfxkSQ3dJWd1lU2zHyIkiRJkqQZ0i+he/lEopAkSZIkTU3PxLCqTAwlSRqTTZvP4tjH7ta/oiRJY+bgM5IkSZK04EwMJUmSJGnBmRhKkubWps1nTTsESZLWBRNDSZIkSVpwJoaSJEmStOBMDCVJkiRpwZkYSpIkSdKCMzGUJEmSpAVnYihJkiRJC87EUJIkSZIWnImhJEmSJC04E0NJkiRJWnAmhpIkSZK04EwMJUmSJGnBmRhKkiRJ0oIzMZQkSZKkBWdiKEmSJEkLzsRQkiRJkhaciaEkSZIkLTgTQ0mSpugv3n3utEOQJMnEUJI0n0yoJEkaHRNDSZIkSVpwJoaSJEmStOBMDCVJkiRpwZkYSpIkSdKCMzGUJEmSpAVnYihJkiRJC87EUJIkSZIWnImhJEmSJC24iSaGSY5LcnWSczvK7pjk1CRfa3/eoWPZS5JcnOSiJI/vKH9wknPaZa9PkkkehyRJkiStJ5NuMTweOLCr7CjgtKraGzitfU2SfYBDgfu167whyXbtOm8EjgT2bh/d25QkaW5sOOoD0w5BkrTgJpoYVtUngWu6ig8GNrfPNwNP6ig/saquq6pLgIuB/ZPsBty2qs6oqgJO6FhHkrQATKQkSRqtWbjH8C5VdSVA+/PObfnuwOUd9ba2Zbu3z7vLJUmSJEmrMAuJ4UqWu2+wepQvv5HkyCRbkmzZtm3byIKTJEmSpPViFhLDq9ruobQ/r27LtwJ7dtTbA7iiLd9jmfJlVdUxVbWxqjbuuuuuIw1ckiRJktaDWUgMTwEOb58fDry3o/zQJDsm2YtmkJkz2+6m1yZ5WDsa6WEd60iSJEmShrT9JHeW5G3Ao4BdkmwF/gZ4NXBSkk3AZcAfAlTVeUlOAs4HbgCeW1U3tpt6Ns0Ip7cEPtQ+JEmSJEmrMNHEsKqeusKix65Q/2jg6GXKtwD7jjA0SZIkSVpYs9CVVJIkSZI0RSaGkiRJkrTgTAwlSZIkacGZGEqSJEnSgjMxlCTNlQ1HfWDaIUiStO6YGEqSJEnSgjMxlCRpBtgSKkmaJhNDSZIkSVpwJoaSpLlhq5okSeNhYihJkiRJC87EUJIkSZIWnImhJEmSJC04E0NJkiRJWnAmhpIkzQgH15EkTYuJoSRJkqSB+U+s9cnEUJIkSVpgKyV6JoCLxcRQkiRJkhaciaEkSZKkmW0hnNW41hsTQ0mSZohfgCSN24ajPjDw35ph/ybNe7fUeYlzHEwMJUkzb5gvMZKkmxsmEVzpb+4o/g77t3x2mRhKkmaWXyAkaTL6/b0dV6Ko2WFiKEmaaX7xkLTeLf2dG/ffu9Umd2up01neXaffcc/S3/9ZimVcTAwlSZKkMRo2sRpVEtKvG/5a9jPMMY3ifsbubY2jW+ugCep6TRJNDCVJkqR1YjVdQtey/XHejzhoDMPUW0vZamKYJyaGkiTNmPX4hUNaBKv53V1Ni96stmCtpjWvX6I5qgRttd1Vhx20Z56ZGEqSJEkTMK7uosuVjWNfozKqJGrQ+xqnce/mPDIxlCTNpPVyoV2tRT9+aZatpUWss2yYe+oGqT/PfzfWOgjOWpPhQfc/6aRzkkwMJUmSpAH1a6VaKTkZtJvloMvXU0KyVqMY3EYmhpIkSXNtXKNOzptJHOs0389FOpew+uMdZRfVRXvPTQwlSZLWkfXypXZc8c/7+9JpPR3LJI2zC+g8dy81MZQkSVonhh12f96+wI561M/l6o1i0JZRJwfzdp40n+fMxFCSpBk1z/951ugs2mdgHJOur+a+vkEGGVm0c6P1zcRQkiRpDg0zl92sj6Q4y62agww2M+0YpVEwMZQkzRy/ZN2c74k6rbYFbBZbvYZJaFezjeXqjWpSc2k9MTGUJM0Ev4itL+O8F2y9GaTlb9wTo0/jve913IPMV9cryVvrnHjSItp+2gEsSXIpcC1wI3BDVW1Mckfg7cAG4FLgj6rqu239lwCb2vr/q6o+MoWwJUmSRmbYZGfUyc2Goz7Apa9+4ki3OQrD3Ds4jnsUpUUway2Gj66q/apqY/v6KOC0qtobOK19TZJ9gEOB+wEHAm9Ist00ApYkjZZfzG5u3qYfWO0AIItk3rp0jnKdXuuNcyTPYbrXSoto1hLDbgcDm9vnm4EndZSfWFXXVdUlwMXA/lOIT5I0AvOW+EzTLH2RHWbwk0HWX22deTarn/1Zi0fS+M1SYljAR5N8IcmRbdldqupKgPbnndvy3YHLO9bd2pZJkqQJGGVCM4qBQGY9kRl3C+EsbmtWB7uRtLxZSgwPqKoHAU8AnpvkN3vUzTJltWzF5MgkW5Js2bZt2yjilCRJHVYaNGSY++WGSSD6JaXdA5PMYtI0L1bbvXRa90hOevvSejIziWFVXdH+vBp4N03X0KuS7AbQ/ry6rb4V2LNj9T2AK1bY7jFVtbGqNu66667jCl+SpIkaNAEbZP1RxzOK/S2XOPZL8sbRlXWQmAap16v+rOp3T54jz0rry0wkhklunWTnpefAbwPnAqcAh7fVDgfe2z4/BTg0yY5J9gL2Bs6cbNSSpGGs5ou+1mat7+1ak4B+21zLdsfxuVlL18dh7rect8/8Wn9X/T2X5sOsTFdxF+DdSaCJ6b+q6sNJzgJOSrIJuAz4Q4CqOi/JScD5wA3Ac6vqxumELkka1NJQ+H5JnLyVpiEYZnqCpfM2zHQGq2mVG3a6hLXegzjIPv3M9ub7I82/mWgxrKpvVNUD2sf9qurotvw7VfXYqtq7/XlNxzpHV9WvVdW9q+pD04tekqTZsdqWqlkaHXMtXWJH3Z10Ldtbzy1l6/W4pEU2E4mhJGm+bNp8Vs+y7q5no+g6qN5GOTroWpOteTTMPZvDlkvSPDAxlCStyXJJoiaj1z1xa20BXA/3yK0lzlG3JK5nvhfS+jAr9xhKkubMSq2GN+Y77MzdpxCRBuGX+NHzPZW0HthiKEnr3LRb9PzSPLtm6b5CSdJ0mRhK0jqzlkSwc92l59NOLLV2Jn6SpH5MDCVpQXUnfMslhavdliRJmi8mhpK0jq10H+BqWgM715MkSeuLiaEkzbGVWv1G3Z201z4lSdL8MzGUpBk1jgRstds0GZQkaX0zMZSkOdArMRukldDETpIk9WJiKEkzrN89gmvd1lq2J0mS1g8TQ0kas16jfy5XPqpEzWRPkiQNysRQkgbUr6vmaqd4GHSwl1FOLyFJktTJxFCShjTKbpySJEmzwMRQknpY7fQP/aZ56N7uoNs3wZQkSeNgYihpYfS716974vdBRwId9B5CSZKkWWViKGldGeRev14td93PB1m313KTRkmSNA9MDCXNlEGTul6tfd31Bu3WudqYJEmS5p2JoaSbmKUkaJCErVcLoaN2SpIkDcbEUNJIDJJ4rZTIDTINQ/f9f+OMU5IkadFsP+0AJM2HzoTq2MMfMlD9Qeott/3u1yZzkiRJ42ViKOkXRpGAdSd0vZJDEz5JkqTZYFdSacZNInkadnCWQbuEDltXkiRJ02FiKM2Yfkla5+vVTMvQvbzXdA2DTv1gkidJkjTf7EoqTcGw9991rrfWZSZxkiRJ6maLoTQCox4lc9jRN00KJUmStBYmhtIaDDt/Xr+um722vdrupJIkSVI/JoZSH/0SuV7JoffqSZIkaR6YGGrhrTToSveyQbYzbHJnIihJkqRZYGKohTLI1An9kkK7cEqSJGm9MTHUXBv0vruVksFBB2YxGZQkSdJ65nQVmmlLiVj31A7LJXRLdUziJEmSpOHYYqipWanFrldXz1738JkISpIkSatjYqiR6Tcf30pJ3aBTOJj4SZIkSeNhV1INZdPms27SZfPYwx9ys7Ll1un1WpIkSdJ0zXWLYZIDk1yU5OIkR007nvWu1717JnuSJEnS/JrbFsMk2wH/CjwO2AqcleSUqjp/upHNp+7EbqklsF99E0JJkiRp/s1tYgjsD1xcVd8ASHIicDBgYjigQRI/SZIkSevfPCeGuwOXd7zeCjx0SrHMFZM+SZIkSZ3mOTHMMmV1s0rJkcCR7csfJrlorFEttl2Ab087CN2M52X2rPtzcg1vGPs+/nb0m5zeeTl1/O/XnFr3vytzyvMyezwnMyivmdnzco/lCuc5MdwK7Nnxeg/giu5KVXUMcMykglpkSbZU1cZpx6Gb8rzMHs/JbPK8zB7PyWzyvMwez8lsmrfzMs+jkp4F7J1kryS3AA4FTplyTJIkSZI0d+a2xbCqbkjyPOAjwHbAcVV13pTDkiRJkqS5M7eJIUBVfRD44LTj0C/YZXc2eV5mj+dkNnleZo/nZDZ5XmaP52Q2zdV5SdXNxmuRJEmSJC2Qeb7HUJIkSZI0AiaGGlqS45JcneTcHnUeleTsJOcl+cQk41tE/c5JktsleV+SL7fn5BmTjnHRJNkzyceTXNC+5y9Ypk6SvD7JxUm+kuRB04h1liXZ0OtvzbQkeVaSw6Ydx3owyO9KR92HJLkxyZMnGeOiGfSceK2frAGvK17vJyjJTknO7Hi/X75Mnbm51tuVVENL8pvAD4ETqmrfZZbfHvgscGBVXZbkzlV19aTjXCQDnJOXArerqhcn2RW4CLhrVV0/4VAXRpLdgN2q6otJdga+ADypqs7vqHMQ8HzgIOChwD9X1UOnEvCMSrIBeP9yn2utD4P8rrT1tgNOBX5KM+DcOycf7WIY8O+X1/oJG/C8eL2foCQBbl1VP0yyA/Bp4AVV9bmOOnNzrbfFUEOrqk8C1/So8sfAyVV1WVvfC8WYDXBOCti5/QN2m7buDZOIbVFV1ZVV9cX2+bXABcDuXdUOpknmq72I3L698Oumtk+yuf1P6zuT3AogyYOTfCLJF5J8ZOm9S/I/k5zV/gf3XR31j0/yxvY/7t9I8si2tf2CJMcvt+MklyZ5Tfsf4TOT3LMtf1mS/90+Pz3J65J8Nsm5SfZvy2/dbv+sJF9KcvAE3qu5M+DvCjRfrN4FeE0ZswHPidf6CRvwvHi9n6D2+v3D9uUO7aO71W1urvUmhhqHewF3aL8sfcHuVjPhX4D7AlcA59D8N+vn0w1pcbStXg8EPt+1aHfg8o7XW1n+C/GiuzdwTFXdH/gB8Jz2P7P/F3hyVT0YOA44uq1/clU9pKoeQPPFaVPHtu4APAZ4EfA+4J+A+wG/nmS/Ffb/g6ran+b36HUr1Ll1VT0CeE4bC8BfAB+rqocAjwb+Lsmthzz2hbLS70qS3YFDgH+bfFSLrcffL6/1U9TjvHi9n7Ak2yU5m+afVqdW1dxe600MNQ7bAw8Gngg8HvirJPeabkgL7/HA2cDdgP2Af0ly2+mGtBiS3IamleOFVfWD7sXLrGL//pu7vKo+0z7/T+A3aJLFfYFT2wvyXwJ7tHX2TfKpJOcAT6NJ/Ja8r5p7KM4Brqqqc9ovTecBG1bY/9s6fj68V5229f62bTe73waOauM7HdgJuPvAR71g+vyuvA54cVXdOPnIFlefc+K1fkr6nBev9xNWVTdW1X4016D9k3Tf+jA31/q5nsdQM2sr8O2q+hHwoySfBB4AfHW6YS20ZwCvbr8QX5zkEuA+wJnTDWt9a1u13gW8tapOXqbKVmDPjtd70PyXVzfVfQEtmgvteVW1XKJ2PM19N19OcgTwqI5l17U/f97xfOn1StfEWuH5IDH+QVVdtMI6ag3wu7IROLHpHccuwEFJbqiq90wwzIUy4N8vr/UTNsB58Xo/JVX1vSSnAwcCnYOmzc213hZDjcN7gf+RZPv23p6H0nTn0vRcBjwWIMldaFpbvjHViNa59v6OY4ELquofV6h2CnBYO2LZw4DvV9WVEwtyftw9yVIC+FSam/svAnZdKk+yQ5KllsGdgSvbL1BPG8H+n9Lx84xedZL8Bs15/D7wEeD57WeBJA8cQSzrziC/K1W1V1VtqKoNwDuB55gUjs+Af7+81k/YgOfF6/0EJdm17SFCklsCvwVfs40uAAAJjUlEQVRc2FVtbq71thhqaEneRvMf+F2SbAX+huZmW6rq36rqgiQfBr5C81/4N1fVzA03v570OyfAK4Hj2651oemS9e0phbsoDgCeDpzTdiUEeCltV8L2vHyQZpSyi4Ef0/ynVzd3AXB4kn8Hvga8saquTzNlweuT3I7mevY6mi6hf0Vz3803abqM7rzG/e+Y5PM0/0x96gp1vpvks8BtgWe2Za9sY/pK+4XuUuB31hjLejTI74omq+858Vo/FYP8rni9n6zdgM1pRk3+FeCkqnp/kmfB/F3rna5CkqQVJLkU2Njri1Xbdeh/V9WWScUlSdKo2ZVUkiRJkhacLYaSJEmStOBsMZQkSZKkBWdiKEmSJEkLzsRQkiRJkhaciaEkaSBJ9k/ysgHrnp7knWMOaaqSHJ9kXY5EmuSPkhwxwf29L8nfTGA/SXJOkqePe1+SNG9MDCVJg9qfZo5MNV4JHDHtIMbkj5jQsSV5KPBo4P+Oe1/VjLj3WuBvkjiXsyR1MDGUpAWRZLskt5h2HOtFVX3dCb37a1vpdupR5X8B762qayYU0juAuwBPmND+JGkumBhK0jq11NUxyZOSnAf8FHjoCnUfnuSUJFck+VGSs5M8rWP5EbQtOkmqfZw+QAxHJrk0yU+SfCDJ7l3Ld0ry2iSXJ7kuyZeTHNRV57Akn05yTZLvJvl4ko0rHOsTk5yf5Mft/u6Y5J7tOj9q69y/T8yPao/vt5O8v13vsiTPWm6fne9Ru95DknyqPeavJjlkmX0c3Mby0yT/3b4HOwzwfh6S5Mx2299J8sEk9+hYvm973Ne2j3ckuesyx/aodtkPk3wjyXM6jwv4A+CRHef6ZYPGnuRlSb6d5DeSnEXzufvDFY5nZ+AQ4Gbdjnsda8c+HtrG8pP2M7JXkjsneU97bBckeUzndqvqp8AHgcP6vd+StEhMDCVpfdtA03XuVcBBwCUr1LsH8BngT4DfBd4FvCXJU9vlHwD+oX3+8PbxnO6NdHk48Hzgz4BNwP2B93TVeSdNl8W/bfd7FnBKkv26juEEmuTij4GtwCeT/GrXtu4OvAL4S+BI4BHAMcCJ7ePJwPbAiUnSJ3aAY4GvAL8PfAh4Y5LfGWC9twPvbdc7B3hHkgcsLUzyR8DJwJnA7wEvb+N9Va+Nprkv7mTg6zRdPZ8BfBXYtV1+T5pzuBPwdJr39X7A+5Y53jcBX6ZJyk4H/jXJ/u2yVwIfB77EL8/1m4eM/VbA5na9A9v6y3kEcEvgs8Mca8c+jgH+CXgqzfn/D+BtwKdp3v9v0bz/t+ra72eBxw74OZCkxVBVPnz48OFjHT6A44EC9htyvdAkUP8OfKyj/Hm0t2kNsI3TgZ8B9+goO6CN58D29WPb14/sWveTwDtW2O6vtLFdCPx117HeAPxaR9lr2+0f1lF2UFt23x6xP6qtc0xX+anA57r2uaXj9RHtei/tivdC4MSO9/abwFu6tv1M4CfAnXoc97eAk3vE/R/ARcAtOsr2Bm4Enth1bK/oqLMDsA14dUfZO4HTl/lc9I0deFm7j4MH+Jy8FNi2imNd2scjO8qe05Z1fi72acuesMI53nstv2M+fPjwsZ4ethhK0vr2rao6u1+lJHdI8vok36RJ6H5G0xJ0rzXs+4tV9c2lF1X1GeBqmkFsAH4L+G/gM0m2X3oApwG/6Cqa5L5J3p3kKpok52fAvZeJ7dKq+nrH64vbnx9bpuwmXVpX8O6u1ycDD06y3aDrVdXPaVoPl475XjQtWyd1HfPHaFr69l1hm/cG7ga8pcd+f6vd9887tnsJcCkd72frox0x/gz4GrBHn+MaJvaiaWXt567At7vKBjlWgOuBT3W8HuZ8L+3zrkiSgOa/rpKk9euqAesdDzyMphvh+cAPgGcDB69h31evULZb+3wXmi/mP1um3o3wi3vQPkpzHH9G02L1U5ouit0Dmnyv6/X1y5QvlfUaDKUz1u7X27dx93pfl1uv85ihucdtOXuuUH6n9ueVPfa7C/Di9tFvu8u9V/3ek2Fi/25VXb9CvU47Add1lQ1yrADXton3kpud76q6vu0t2n1sS/sc5HMgSQvBxFCS1rfqVyHNiJFPBJ5XVf/WUb7WXiV3XqFs6Qv/NTRdBp/UYxsPp2nJelxVXdgR2+3WGNsguuO/M0131e4WruXW+07X685jhqY19kvLrLvSPaBL29ttheVL23437f2AXfrFPIhhYu/7uevY5u27ygY51rVa2uekRkKVpJlnYihJ2hHYjo6Wm7al7ve46Rf869tlO1UzsmM/D0py96q6rF3vAJokaWkgktOAPwd+2Jn0dbll+7MztkfQDEjzhQFiWItDuGl3yEOAL1TVjQOsdwH8Irk+mF8e80U0yfCGqnrTELEsrXc48L4V6pxG053zC1U1aGK2kuVaEFcbey8XAXdLsmNVXddR1u9Y12oD8HN+2dVUkhaeiaEkLbiq+n47rcBfJ/kBzRfmo4DvA7ftqLqUvL0gyceAH1TVRT02fTXw/naqg52A19Dcd/jhdvmpwEeAU5O8Bjiv3d9+wE5V9RLgc8APgTcleS1N6+HLaBKHcXtCkqOBT9CMcPk4Buta+ydJrgfOBf4ncE+aUTOpqp8n+XPgP5LclibxvB74VZqW0ydX1Y+7N9iu93+AtyZ5K83ImwU8BnhbVW2heV/OBD6Q5DiaVsLd27iPr6rThzj2C4GDkzyJZhTYK6rqitXE3sdnaAa/+XVgyxDHulYbgfOq6vsj2JYkrQsOPiNJgmYaiEtopoX4Z5rpKk7oqvMp4O+AFwCfpxm1tJczgDcAr6OZ+uFcOrqNtq1avw8cB7yQJkn8d5ruo59u61xFM03FXWkGcXkh8Cwm09LzJ8CDaKbY+B3guVV1ygDrHUrTavge4AHAU6rqF10vq+rtNAnmfjSTrZ9MM6LmF/nlfXI3U1X/RTO/4H1oRg09oX2+rV3+VZr7RH9MM43Dh2imk7iO4d+vN9Dc23kczRQiR64l9h7H9FWaz8UTusp7HusIHEjzGZcktbL23iaSJK0fSR5FM4/fr1fVuUOsdwTNSJo7V9UPxxPd+pPkRcCmqlppRNZR7+/eNK3T96yqSyexT0maB7YYSpKkaToG2DXJb01ofy8C/tOkUJJuynsMJUnS1FTVj5IcDtx63PtKM3fFJTT3LUqSOtiVVJIkSZIWnF1JJUmSJGnBmRhKkiRJ0oIzMZQkSZKkBWdiKEmSJEkLzsRQkiRJkhaciaEkSZIkLbj/H1l9HTsb53FvAAAAAElFTkSuQmCC\n", "text/plain": [ "B/S ratio | BP | IS | L1 | L2 | L3 | L4 | OS | Tube | Rails | Background | |||||||||||
no classification | 0.16 | 2.58 | 1.2 | 0.92 | 0.71 | 0.17 | 0.41 | 0.06 | 0.13 | 1000.0 |
%s | \"%(field)\n", " html += \" |
Background to Signal ratio | BP | IS | L1 | L2 | L3 | L4 | OS | Tube | Rails | ||||||||||
no classification | 0.16 | 2.58 | 1.2 | 0.92 | 0.71 | 0.17 | 0.41 | 0.06 | 0.13 |
signal class with Train set_ | 0.07 | 1.1 | 0.51 | 0.3 | 0.25 | 0.1 | 0.27 | 0.04 | 0.09 |
signal class with Test set__ | 0.07 | 1.13 | 0.51 | 0.28 | 0.27 | 0.1 | 0.3 | 0.05 | 0.09 |