diff --git a/BDT.ipynb b/BDT.ipynb new file mode 100644 index 0000000..deef99f --- /dev/null +++ b/BDT.ipynb @@ -0,0 +1,800 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "import os\n", + "import pickle\n", + "import math\n", + "\n", + "from sklearn.metrics import accuracy_score, roc_auc_score\n", + "trunc_normal= tf.truncated_normal_initializer(stddev=1)\n", + "normal = tf.random_normal_initializer(stddev=1)\n", + "\n", + "from xgboost import XGBClassifier\n", + "from architectures.data_processing import *\n", + "from architectures.utils.toolbox import *\n", + "from architectures.DNN import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# IMPORTING THE DATASET" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "l_index=1\n", + "mother_ID=[\"Ds\",\"Dplus\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bkg data amounts to 13821 while signal MC amounts to 5881 Ds and 9639 Dplus samples\n" + ] + } + ], + "source": [ + "MC_Dplus_sig_dict, MC_Ds_sig_dict, data_bkg_dict = load_datasets(l_index)\n", + "\n", + "m_plus=MC_Dplus_sig_dict[\"Dplus_ConsD_M\"].shape[0]\n", + "m_s=MC_Ds_sig_dict[\"Ds_ConsD_M\"].shape[0]\n", + "n=data_bkg_dict[\"Ds_ConsD_M\"].shape[0]\n", + "\n", + "print('Bkg data amounts to {0} while signal MC amounts to {1} Ds and {2} Dplus samples'.format(n,m_s,m_plus))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#Normalising the Chi2 vertex fits to the NDoF\n", + "\n", + "MC_Ds_sig_dict[\"Ds_ENDVERTEX_CHI2\"]=MC_Ds_sig_dict[\"Ds_ENDVERTEX_CHI2\"]/MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "MC_Ds_sig_dict[\"Ds_OWNPV_CHI2\"]=MC_Ds_sig_dict[\"Ds_OWNPV_CHI2\"]/MC_Ds_sig_dict[\"Ds_OWNPV_NDOF\"]\n", + "MC_Ds_sig_dict[\"Ds_IPCHI2_OWNPV\"]=MC_Ds_sig_dict[\"Ds_IPCHI2_OWNPV\"]/MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "del MC_Ds_sig_dict[\"Ds_OWNPV_NDOF\"]\n", + "del MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "#del MC_sig_dict[\"Ds_M\"]\n", + "\n", + "MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_CHI2\"]=MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_CHI2\"]/MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "MC_Dplus_sig_dict[\"Dplus_OWNPV_CHI2\"]=MC_Dplus_sig_dict[\"Dplus_OWNPV_CHI2\"]/MC_Dplus_sig_dict[\"Dplus_OWNPV_NDOF\"]\n", + "MC_Dplus_sig_dict[\"Dplus_IPCHI2_OWNPV\"]=MC_Dplus_sig_dict[\"Dplus_IPCHI2_OWNPV\"]/MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "\n", + "del MC_Dplus_sig_dict[\"Dplus_OWNPV_NDOF\"]\n", + "del MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "\n", + "data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]=data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "data_bkg_dict[\"Ds_OWNPV_CHI2\"]=data_bkg_dict[\"Ds_OWNPV_CHI2\"]/data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", + "data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]=data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "del data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", + "del data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]=data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "#data_bkg_dict[\"phi_OWNPV_CHI2\"]=data_bkg_dict[\"phi_OWNPV_CHI2\"]/data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", + "data_bkg_dict[\"phi_IPCHI2_OWNPV\"]=data_bkg_dict[\"phi_IPCHI2_OWNPV\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "\n", + "#del data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", + "del data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "del MC_Ds_sig_dict[\"phi_M\"]\n", + "del MC_Dplus_sig_dict[\"phi_M\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def return_branches(mother_index=None):\n", + "\n", + " branches_needed = [\n", + " #________________________________________\n", + " #D\n", + " #________________________________________\n", + " #D Geometric variables, pT and FD\n", + " \n", + " mother_ID[mother_index]+\"_ENDVERTEX_CHI2\",\n", + " mother_ID[mother_index]+\"_IPCHI2_OWNPV\",\n", + "\n", + " mother_ID[mother_index]+\"_OWNPV_CHI2\",\n", + " mother_ID[mother_index]+\"_IP_OWNPV\",\n", + " mother_ID[mother_index]+\"_DIRA_OWNPV\",\n", + " \n", + " mother_ID[mother_index]+\"_PT\",\n", + " mother_ID[mother_index]+\"_FD_OWNPV\",\n", + " \n", + " #________________________________________\n", + " #PHI\n", + " #________________________________________\n", + " #phi geometric variables, pT and FD\n", + " \n", + " \"phi_ENDVERTEX_CHI2\",\n", + " \"phi_IPCHI2_OWNPV\",\n", + " \n", + " \"phi_PT\",\n", + " \n", + " #phi Reconstructed mass\n", + " \n", + " #\"phi_M\",\n", + " \n", + " #________________________________________\n", + " #PION\n", + " #________________________________________\n", + " #pi Geometric variables and pT\n", + " 'pi_PT',\n", + " \n", + " #________________________________________\n", + " #LEPTONS\n", + " #________________________________________\n", + " #leptons Geometric variables and pT\n", + " \n", + " l_flv[l_index]+\"_plus_PT\",\n", + " l_flv[l_index]+\"_minus_PT\",\n", + " \n", + " \n", + " #D Reconstructed mass\n", + " mother_ID[mother_index]+\"_ConsD_M\",\n", + " ] \n", + " return branches_needed" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#Number of input features\n", + "\n", + "dim=len(return_branches(mother_index=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Convert data dictionaries to arrays for NN\n", + "\n", + "MC_Ds_sig = extract_array(MC_Ds_sig_dict, return_branches(mother_index=0), dim, m_s)\n", + "MC_Dplus_sig = extract_array(MC_Dplus_sig_dict, return_branches(mother_index=1), dim, m_plus)\n", + "data_bkg = extract_array(data_bkg_dict, return_branches(mother_index=0), dim, n)\n", + "\n", + "plt.hist(MC_Ds_sig[:,dim-1],alpha=0.5,bins=30);\n", + "plt.hist(MC_Dplus_sig[:,dim-1],alpha=0.5,bins=30);\n", + "plt.hist(data_bkg[:,dim-1],alpha=0.5,bins=200);\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/Rphipi/mu/bdt_train.png', format='png', dpi=100)\n", + "#Cut on Ds Mass\n", + "\n", + "#data_bkg_cut=data_bkg[np.where(data_bkg[:,dim-1]>1915)]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "#Add 0/1 label for bkg/sig\n", + "\n", + "MC_Dplus_sig_labelled=add_labels(MC_Dplus_sig,signal=True)\n", + "MC_Ds_sig_labelled=add_labels(MC_Ds_sig,signal=True)\n", + "data_bkg_labelled=add_labels(data_bkg,signal=False)\n", + "\n", + "#Merge MC sig and data bkg, shuffle it\n", + "\n", + "data=np.concatenate((data_bkg_labelled,MC_Ds_sig_labelled), axis =0)\n", + "data=np.concatenate((data,MC_Dplus_sig_labelled), axis =0)\n", + "np.random.seed(1)\n", + "np.random.shuffle(data)\n", + "\n", + "#get train size\n", + "train_size=data.shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#Strip away the label column and convert it to a one-hot encoding\n", + "\n", + "X=data[:,0:dim]\n", + "Y_labels=data[:,dim].astype(int)\n", + "Y_labels=Y_labels.reshape(train_size,1)\n", + "Y_labels_hot = to_one_hot(Y_labels)\n", + "Y_labels=Y_labels_hot\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "#Divide the dataset k \"equi populated\" sets\n", + "test=0\n", + "k=5 #number of subsets\n", + "i=4 #number of subset that is train set\n", + "PATH=l_flv[l_index]+'/test_'+str(test)\n", + "\n", + "if not os.path.exists(PATH):\n", + " os.mkdir(PATH)\n", + "X_train, Y_train, X_test, Y_test, X_dict, Y_dict = k_subsets(i, k, X, Y_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "X_mean=X_train.mean(axis=0)\n", + "X_train_1=X_train-X_mean\n", + "X_std=X_train_1.std(axis=0)\n", + "X_train_2=X_train_1/X_std\n", + "\n", + "\n", + "\n", + "X_mean=X_test.mean(axis=0)\n", + "X_test_1=X_test-X_mean\n", + "X_std=X_test_1.std(axis=0)\n", + "X_test_2=X_test_1/X_std\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(23472, 13)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train_2.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SETTING UP THE NETWORK" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "task='TRAIN'\n", + "\n", + "PATH=l_flv[l_index]+'/test_'+str(test)+'/NN_'+str(i)\n", + "\n", + "if not os.path.exists(PATH):\n", + " os.mkdir(PATH)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "LEARNING_RATE = 0.001\n", + "BETA1 = 0.5\n", + "BATCH_SIZE = 64\n", + "EPOCHS = 50\n", + "VAL_PERIOD = 10\n", + "SEED=1\n", + "LAMBD=0.1\n", + "\n", + "sizes = {\n", + "'dense_layers': [\n", + " #(16, 'bn', 0.8, lrelu, tf.glorot_uniform_initializer()),\n", + " #(8, 'bn', 0.5, lrelu, tf.glorot_uniform_initializer()),\n", + " #(16, 'bn', 1, tf.nn.relu, tf.random_normal_initializer()),\n", + " (200, 'bn', 0.95, tf.nn.relu, tf.random_normal_initializer()),\n", + " (200, 'bn', 0.95, tf.nn.relu, tf.random_normal_initializer()),\n", + " #(200, 'bn', 0.90, tf.nn.relu, tf.glorot_uniform_initializer()),\n", + " (100, 'bn', 0.95, tf.nn.relu, tf.random_normal_initializer()),\n", + " ],\n", + "'n_classes':2,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Input for propagation (?, 13)\n", + "Logits shape (?, 2)\n", + "Input for propagation (?, 13)\n", + "Logits shape (?, 2)\n", + "\n", + " Training...\n", + "\n", + " ****** \n", + "\n", + "Training DNN for 50 epochs with a total of 23472 samples\n", + "distributed in 366 batches of size 64\n", + "\n", + "The learning rate set is 0.001\n", + "\n", + " ****** \n", + "\n", + "Evaluating performance on validation/train sets\n", + "At iteration 0, train cost: 2386, train accuracy 0.7044, test accuracy 0.7658\n", + "Average of signal as predicted by NN 0.5681\n", + "Evaluating performance on validation/train sets\n", + "At iteration 10, train cost: 496.4, train accuracy 0.8168, test accuracy 0.7865\n", + "Average of signal as predicted by NN 0.6337\n", + "Evaluating performance on validation/train sets\n", + "At iteration 20, train cost: 260.4, train accuracy 0.8138, test accuracy 0.79\n", + "Average of signal as predicted by NN 0.5725\n", + "Evaluating performance on validation/train sets\n", + "At iteration 30, train cost: 176.6, train accuracy 0.8099, test accuracy 0.7758\n", + "Average of signal as predicted by NN 0.5691\n", + "Evaluating performance on validation/train sets\n", + "At iteration 40, train cost: 133.6, train accuracy 0.8081, test accuracy 0.7934\n", + "Average of signal as predicted by NN 0.6041\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameters trained\n", + "Model and hyperparameters saved in path: mu/test_0/NN_4/NN_model.ckpt\n" + ] + } + ], + "source": [ + "tf.reset_default_graph()\n", + "model_NN = DNN(dim-1, sizes,\n", + " lr=LEARNING_RATE, beta1=BETA1, lambd=LAMBD,\n", + " batch_size=BATCH_SIZE, epochs=EPOCHS,\n", + " save_sample=VAL_PERIOD, path=PATH, seed=SEED)\n", + "\n", + "init_op = tf.global_variables_initializer()\n", + "saver = tf.train.Saver()\n", + "gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.13)\n", + "\n", + "with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:\n", + " sess.run(init_op)\n", + " \n", + " print('\\n Training...')\n", + " model_NN.set_session(sess)\n", + " model_NN.fit(X_train_2, Y_train, X_test_2, Y_test)\n", + " \n", + " save_path = saver.save(sess, PATH+'/NN_model.ckpt')\n", + " hyper_dict={\n", + " 'k':k,\n", + " 'LEARNING_RATE':LEARNING_RATE,\n", + " 'BETA1':BETA1,\n", + " 'BATCH_SIZE':BATCH_SIZE,\n", + " 'EPOCHS':EPOCHS,\n", + " 'VAL_PERIOD':VAL_PERIOD,\n", + " 'SEED':SEED,\n", + " 'sizes':sizes,\n", + " 'LAMBD':LAMBD,\n", + " 'PATH':PATH,\n", + " }\n", + " with open(PATH+'/hyper_parameters.pkl', 'wb') as f: \n", + " pickle.dump(hyper_dict, f)\n", + " with open(PATH+'/variables_used.pkl', 'wb') as f: \n", + " pickle.dump(return_branches(mother_index=0), f)\n", + " print(\"Model and hyperparameters saved in path: %s\" % save_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "task='TEST'\n", + "\n", + "with open(PATH+'/hyper_parameters.pkl', 'rb') as f: \n", + " hyper_dict = pickle.load(f)\n", + " #for key, item in hyper_dict.items():\n", + " # print(key+':'+str(item))\n", + "\n", + "k=hyper_dict[\"k\"]\n", + "LEARNING_RATE=hyper_dict[\"LEARNING_RATE\"]\n", + "BETA1=hyper_dict[\"BETA1\"]\n", + "BATCH_SIZE=hyper_dict[\"BATCH_SIZE\"]\n", + "EPOCHS=hyper_dict[\"EPOCHS\"]\n", + "VAL_PERIOD=hyper_dict[\"VAL_PERIOD\"]\n", + "SEED=hyper_dict[\"SEED\"]\n", + "sizes=hyper_dict[\"sizes\"]\n", + "LAMBD=hyper_dict[\"LAMBD\"]\n", + "PATH=hyper_dict[\"PATH\"]\n", + " \n", + "if not os.path.exists(PATH+'/hyper_parameters.pkl'):\n", + " print(\"No saved sizes dict\")" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Evaluate model on test set...\n", + "INFO:tensorflow:Restoring parameters from mu/test_0/NN_4/NN_model.ckpt\n", + "Model restored.\n", + "Test accuracy: 0.7293\n" + ] + } + ], + "source": [ + "with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:\n", + " \n", + " print('\\n Evaluate model on test set...')\n", + " saver.restore(sess,PATH+'/NN_model.ckpt')\n", + " print('Model restored.')\n", + " model_NN.set_session(sess)\n", + " model_NN.test(X_test_2,Y_test)\n", + " output_NN=model_NN.predict(X_test_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zZmOl1UYCQaAVDp16qSZM2fqxIkTmjlzZrodkHTu96u79tprNWrUKI0dO1Y//fTTGeuvXr1atWvX9gdgSapTp46ioqLS1C1fvnyKVa6vuuoqSfKPlkrSypUr1aRJE5UoUUL58uVToUKF9Mcff2SqLUl++uknbd++XXfeeadOnTrlfzRq1EjHjx/3rw561113aePGjfruu+8kSQcOHNC///1v/x9aR48e1YoVK9Ls58Ybb1RISEiaa7GbNm3qf16iRAlFRkamOLdArrnmGh05ckTdunXTokWL/N9QA8ClpkaNGlq/fr3mzp2rBx98UM45/e///q9iY2P1xx9/pLvdmfqlJUuWqF27dsqTJ4//3+kKFSqofPnyaRaUTLJ06VLlyZNH7dq1S/Hve+PGjfXtt98qMTFRGzdu1O7duwPO/MlIZvuOVatWqUmTJv4ALKUMaeciJiYmRQBOOk7Tpk1TfNFQp04dlS9f3j+7LEnywFmkSBFFRETolltuUd68ef3lFStW1K5du866bStWrNCff/6pjh07pumb9+3bp507dyo8PFxly5ZVnz599N5772n//v1nfZwk1157rebPn6/Bgwdr1apVSkxMTPH+kiVLVLt2bVWoUMHfFsk3Uyy935ucQAhGjio/cF6aB3ChadOmjf744w8NGjRIf/75p1q3bp2mTokSJVSgQIGA05Ez45VXXtHtt9+uZ555RlWqVFGlSpU0ffr0dOvv3btXERERacoDlaUetU76xv748eOSfNOlmzZtKuecXn/9dX355ZdavXq1IiMj/XUyI+kWUC1btlRISIj/UaFCBUnSjh07JEn169dXuXLl/N/Uf/DBB8qXL59uv/12Sb7rgxMTE/Xggw+m2E+BAgV08uRJ/34yOr8ztbtKlSqaM2eOfvnlF7Vs2VIlS5ZU586dlZCQkOnzBRAk/jqa9nH6VG636qwUKFBArVu31iuvvKIff/xRb7zxhjZt2pRiHYbUztQvHThwQM8//3yKf6dDQkL0yy+/pPl3Ovk2iYmJKlq0aIptunfvrlOnTmnPnj3+KdtnO/01s33H3r17FRkZmWLbggUL6rLLLjur4yUX6AvoPXv2BCyPiopKc+lNoH7sXPq2QJL65quvvjrF53LrrbdK8vXNefLk0aJFixQdHa2ePXsqOjpaN910k/7zn/+c9fF69uyp4cOHa8aMGapbt66ioqL01FNP+cPwgQMHtHLlyjS/NxMnTkz39yYnMB0aAFIJCwtTq1atNGbMGHXs2FFhYWFp6oSEhKhBgwZauHChnn322bM+RrFixfTSSy/ppZde0vfff6+RI0eqS5cuqlGjhn/kNrno6Ght3LgxTfm5hLgFCxbo6NGjmjNnjv/cTp06ddbXxyZNZR4/fryuu+66NO8nhWEz05133qn33ntPw4cP13vvvacWLVr4F8IoVqyY/x7MgaYoly5d+qzalZ64uDjFxcXpyJEjmjdvnh599FE9/PDDGX75AACXgl69eik+Pl4bNmxIt86Z+qXw8HC1a9dO9957b5pt07uvfXh4uPLly6cvv/xSefKkHXuLjIz0X4e6Z8+eszqnzPYd0dHRaUY6jx07luGo+JkEmgVWqlSpgCOq+/btU+3atc/5WGcrqW/++OOPA4byKlWqSJKqVq2qDz74QCdPntTnn3+uAQMGKC4uTjt37gz43yo9efLkUb9+/dSvXz/t2LFDU6dO1aBBgxQTE6M+ffooPDxcsbGxGjduXJptCxQocI5nef4IwQAQwAMPPKATJ06oT58+6dZ59NFH1aZNG02ePNl/rVOS06dPa9GiRZlaOKtGjRoaNWqUpk6dqg0bNgQMwddff72mTp2qXbt2+adEr1q1KsWqk5l17Ngx5cmTR/ny/bcLmDFjhn+KUmZVqVJFMTEx2rp16xnvidypUye98MIL+vjjj7V8+fIU132FhYWpXr162rhxo55++umzO5kAzvTtedGiRdW5c2ctX75cK1asOO/jAcCFZP/+/WlGPhMSEnTkyJGAoSiQQP1S0nW2tWvXzvSlQI0aNVJiYqKOHDmiJk2aBKyT1JdMnjw54MwrKfC/65ntO66//nq99dZbOnr0qH9KdPK7CmSVunXraty4cfr999/9X/KuXr1aW7du1Y033pjlx5MCfy7169dXwYIFtXv37nQXs0ouJCREjRo1Uv/+/dW5c2cdPnxY4eHh5zQSXbZsWQ0cOFATJ07Ujz/+KMk39XvRokUqV65cmt/L5Och6ZxGvs8VIRgAAmjYsKEaNmyYYZ3WrVurf//+6tWrl7788ku1bdtWl112mTZs2KDXXntN5cuXTzcE33jjjWrXrp2qV68uM9OECRMUFhamOnXqBKzfo0cPPfvss2rVqpUGDx6sY8eOafDgwYqIiDirb2yl//5R0qNHD/Xq1Uvr1q3TCy+8kGYq1pnkyZNHo0eP1j333KPffvtNLVq0UP78+f2LbcycOdP/B0ft2rVVsWJF9e7dWwULFlSrVq1S7GvkyJFq3Lix8uTJozvuuEOFCxfW9u3bNW/ePA0bNkyVK1fOdLuqVq2qhQsXauHChSpRooQqVKigmTNnasWKFWrevLlKly6tTZs26f3338/0ImAAcLG45ppr1LZtWzVt2lSRkZHatm2bXnjhBRUqVCjNF7bJnalfGjJkiOrUqaO4uDj17NlTJUuW1K5du7R48WJ17949YJ9ZpUoV9ektbNEWAAAgAElEQVTTR506dVJ8fLxiY2N1/PhxrVu3Tj/99JPeeOMN5cmTxz/q3KVLF919990yM/373//W3XffrdjYWFWtWlX79u3TpEmTVL16dZUsWVLly5fPVN/x6KOP6tVXX1WrVq3Uv39/7d69WyNGjFDBggWz9HPv37+/xo0bp2bNmmnAgAH6448/NHDgQF1zzTXq0KFDlh4rSaD+rkSJEhoyZIj+9re/adu2bbr55pt1+vRp/fTTT1q2bJlmzZql77//Xo8//rjuuusuXXHFFfr111/1/PPPq2bNmv6R5PT2ndr999/vXzysaNGiWrZsmTZt2qTnn39ektS1a1e99tpratiwoR5//HFdccUVOnjwoFatWqXo6Gj169dP+fPnV4UKFTRjxgxVr15doaGhqlGjRrbee5kQDADnYfTo0brhhhv0yiuvqHPnzjp27JjKly+vNm3a6PHHH093u/r162vSpEnaunWr8ubNq+uuu06ffPKJypQpE7B+oUKFtGDBAj3wwAO66667/J1/fHx8hqt9BnLNNddo4sSJGjp0qGbNmqWaNWvq/fffT7EiaGbdddddKlKkiIYPH6633npLefPm1RVXXKFWrVql6bzuuusuDRs2TJ06dUqxQInk++Prs88+0+DBg3XPPfcoMTFRl19+uZo3b57pkYskTz75pH/Brt9++00TJ05UjRo1NHfuXPXv31+HDh1SqVKldN999+mZZ54563MGgAvZ008/rTlz5uiRRx7RoUOHFB0d7V9BOekylUDO1C9VrlxZK1eu1JNPPqnevXvr2LFj/pWYK1asmO5+X331VVWuXFkTJkzQ008/rSJFiuiqq65Sr169/HU6d+6s0NBQDRs2THfccYd/lDdp3Ys777xTy5YtU3x8vBISEtStWzdNmjQpU31HTEyM5s+fr0ceeUQdOnRQtWrV9M4776ht27ZZ8XH7RUREaNmyZXrsscd09913K3/+/GrZsqXGjBmTbWEuUH/XvXt3xcfHq3Tp0hozZoxGjx6t0NBQVa5c2d/PR0dHKyoqSsOGDdPu3btVrFgx3Xrrrf7gmtG+U6tfv74mTJig119/XcePH1fFihU1YcIE/7ofoaGhWrZsmZ5++mkNHjxY+/btU2RkpOrUqZNiBfDXXntNjz/+uG677TadOHFCW7Zs8d+bOTtYRvf1upTExsa63FyBDD6BFsLa+tyZp2rgwrZ+/XpVq1Ytt5sRdLZs2aLKlStr/PjxZ72qJjIno99tM/vGORebw026pNA340Kzfv16Vbvy8sBv5i8UuBxAjsqKvpmRYAC4SIwYMUKlS5fW5Zdfru3bt2vEiBGKiIjItmlWAAAAlyJCMABcJMxMQ4cO1e7du1WgQAHddNNNeuGFF856OjQAAEAwIwQDwEVi4MCBGjhwYG43AwAA4KJ2dkuKAgAAAABwESMEAwAAAACCBiEYQJYIlpXmETz4nQYA4NJECAZw3kJCQnTs2LHcbgaQpY4dO6aQkJDcbgYAAMhihGAA5y0yMlK7du3S0aNHGT3DRc85p6NHj2rXrl2KjIzM7eYAAIAsxurQAM5b0i16du/erZMnT+Zya4DzFxISoqioKG4/BQDAJYgQDCBLFClShMAAAACACx7ToQEAAIBLgJmd8fHpp59mybF+/PFHDRkyRH/88UeW7O9M5s+fr1deeSXT9bdu3arLLrtMO3bs8Jf98ssv6ty5s8qWLavQ0FCVK1dO7dq104oVK86rbdHR0Sk+48jISLVu3Vrr1q1LUa9Xr17q27fveR0LWYORYAAAACAje76TQkJz/rilrzur6snD3LFjx9SoUSM9+eSTiouL85dfddVVWdK0H3/8UUOHDlWfPn102WWXZck+MzJ//nwtWbJEDz30UKbqDx06VB07dlTZsmUlSQkJCapbt64qVKigUaNGKSoqSlu2bNHs2bP19ddfq379+ufVvu7du+v++++Xc067du3Ss88+q2bNmmn9+vUqXLiwJCk+Pl7XXnutBgwYoHLlyp3X8XB+CMEAAADAJaBevXr+50kjtFdeeWWK8mBw8OBBvfvuu1qyZIm/bPr06Tp8+LAWLlyo4sWLS5JuvfVW9ezZM8NFPRcsWKDbb79dx48fz/CYMTExKT7nK664QrVr19bq1avVqFEjSVKVKlVUu3Ztvf766xo2bNj5nCLOE9OhAQAAgCCzZcsWdezYUcWKFVNYWJji4uL0888/+993zumZZ57RFVdcodDQUEVHR6tly5Y6ePCgFixYoI4dO0qSSpUqJTNT1apV0z3Wd999pyZNmqh48eK67LLLdPXVV2vChAkp6sycOVO1atVSaGioSpcurUGDBikxMVGSNHDgQL366qvauHGjf8pxnz590j3etGnTFB4erhtvvNFfdvjwYRUsWFBFixZNU9/MMvehnYWk0d/UC4Z26NBBU6ZMyfLj4ewwEgwAAAAEkf3796tBgwaKiYnRG2+8ofz582vYsGFq2rSp1q9fr/z582vChAkaPXq0Ro4cqWrVqikhIUFLlizRsWPHVL9+fQ0fPlz/+Mc/NG/ePIWHh6tgwYIBj3X69GnFxcUpNjZW7777rvLnz6/169fryJEj/jpvv/22evTooYceekjPPfecNm7cqH/84x8yMz377LPq27evfv75Z61evVrTp0+XJEVFRaV7fkuXLlW9evVShNtatWrp999/V/fu3dW/f3/VrFkzS8Ovc06nTp2SJO3atUsDBw5UZGSkGjRokKLeDTfcoP79+2vjxo2qUqVKlh0fZ4cQDAAAAASRUaNG6fTp01qyZIl/ZLR+/fqqUKGCpkyZol69emnVqlVq1aqV7r//fv92HTp08D+vVKmSJF+4jI6OTvdYu3fv1q5du7Rs2TL/No0bN/a/n5iYqAEDBqh3797617/+JUlq2rSp8ubNq/j4eMXHx6ts2bKKiopSaGhopqZ2f/PNN+rWrVuKsri4OD344IMaO3aspkyZoiJFiqhp06bq27evGjZs6K/nnPOPQEu+EC/JH3Al38hx3rx5U+x/+PDhGj58uP91iRIlNHv27DTXS9esWVOStGrVKkJwLmI6NAAAABBElixZoubNmyssLEynTp3SqVOnVLx4cdWsWVNr1qyRJF177bWaPXu2nnnmGa1Zs8YfBs9WVFSUoqOjdd999+n9999XQkJCivfXrl2rvXv3qmPHjv62nDp1So0aNdKff/6p9evXn/Ux9+3bp5IlS6YpT5pS/fzzz+umm27SvHnz1KhRI02aNMlf5/XXX1dISIj/ERcXpxMnTqQoCwsLS7Pvnj17avXq1Vq9erUWLFigZs2aqW3btmnaHxoaqrCwMO3du/eszwtZhxAMAAAABJEDBw5o8uTJKYJdSEiIvvrqK/8thR544AENHjxYU6dO1fXXX6/o6GgNHTr0rMNwSEiIFi9erGLFiqlbt26Kjo5Ww4YN9cMPP/jbIvlGh5O3pVq1apKU4hZHmZGYmKiTJ0+qQIECAd+vXLmy4uPj9fHHH2vLli26+uqr9cQTT/jf79Chgz/Mrl69Wi+99JLy58+fouyrr75Ks99SpUopNjZWsbGxatasmaZMmaKIiIiAC2AVKFDgjAttIXsxHRoAAAAIIuHh4apXr54GDBiQ5r2k6dHJpyNv27ZNb7/9tgYPHqzLL79c3bt3P6vjVa9eXbNnz9Zff/2l5cuXKz4+Xq1bt9bWrVsVHh4uSZo8eXLA2zddeeWVZ3WsvHnzqkiRIjp8+PAZ60ZFRalr166Kj4/XkSNHVLRoUUVERCgiIsJf58CBAzIzxcbGnlU78uTJoypVqqQZCXbO6ciRI/7zRu4gBAMAAABBpHHjxvrkk09Uo0YN5c+f/4z1L7/8cj311FN644039OOPP0qSf7uzGdHMnz+/mjRpokceeUQ9e/bUn3/+qWuuuUYRERHatm2bunbtmuG2mT1WlSpVtGXLlhRl+/fvV2RkZJq6mzZtUlhYWMApzufj9OnTWr9+fZpgv3PnTiUmJqpy5cpZejycHUIwAAAAEETi4+M1ffp0NW7cWH379lWpUqW0d+9effrpp7rtttvUoUMH9ejRQzExMapTp46KFCmiRYsWaceOHbr11lslyX9LpLFjx6pDhw7+Wx+ltmrVKg0ePFh33nmnKlSooAMHDmj06NGqW7euP3iOGjVK9913nw4dOqSmTZsqX758+vnnnzVr1izNnz9fefPmVdWqVbVjxw5NnTpVVapUUWRkpMqVKxfw/Bo0aKDPPvssRdn48eM1e/Zs3XPPPapRo4b++usvLViwQG+88YYee+wx5ct3frFo165dWrlypSTp0KFDmjx5sjZt2uRf7CvJmjVrlDdv3qC7d/OFhhAMAAAABJHo6Gh9/fXXGjRokB555BH99ttvKlWqlG6++WZVr15dku9WPm+99ZZeffVV/fXXX6pUqZImTZqkFi1aSPJdWzt8+HCNGzdOo0ePVqVKlbRhw4Y0x4qJiVHx4sX1zDPPaM+ePSpevLhuu+02Pffcc/463bp1U3h4uEaMGKHXX39d+fLlU8WKFdW6dWvlyeNbwqhLly76/PPP9eijj+rAgQO6//779dprrwU8v/bt2+tf//qX9u7d61+5um3bttq1a5dee+017dixQyEhIapYsaJef/119erV67w/00mTJvkX2CpWrJiqVaumOXPm+D+vJAsWLFCTJk389xFG7jDnXG63IUfExsa6pNXukHvKD5yXpmzrc3G50BIAOD9m9o1z7uwuEkMK9M240Kxfv17Vrrw88Jv5C+VsY3Beqlatqr59++rhhx/O7ab4nTx5UjExMRo7dqzuuOOO3G7ORWv9+vX+hdNSy2zfzOrQAAAAAC4pgwYN0ssvv3zOt3bKDlOnTlVERITat2+f200Jejkags3sLTPbb2ZrA7z3uJk5MyvpvTYze8nMNpvZ92ZWK1ndbma2yXt0S70vAAAAAMGrS5cu6tGjh/bs2ZPbTfHLmzevJkyY4J/ijdyT09cET5L0iqS3kxeaWVlJTSRtT1bcQlIl71FX0jhJdc0sXNJgSbGSnKRvzGyuc+7XbG89AAAAgAtenjx5Utz/90Jwzz335HYT4MnRryGcc59JOhTgrTGS4uULtUnaSnrb+ayUVMzMSklqJmmxc+6QF3wXS2qezU0HAAAAAFwCcn0s3szaSNrlnPsu1VsxknYke73TK0uvHAAAAACADOXqLZLMrJCkQZKaBno7QJnLoDzQ/ntL6i0p3fuIAQAAAEmcczIL9OcmgNyWVXc2yu2R4CslVZD0nZltlVRG0v+ZWbR8I7xlk9UtI2l3BuVpOOfGO+dinXOxERER2dB8AAAAXCpCQkJ07PiJ3G4GgHQcO3ZMISEh572fXA3BzrkfnHORzrnyzrny8gXcWs65vZLmSurqrRJdT9IR59weSQslNTWz4mZWXL5R5IW5dQ4AAAC4NERGRmrX7t06eux4lo04ATh/zjkdPXpUu3btUmRk5HnvL0enQ5vZNEkNJZU0s52SBjvn3kyn+nxJLSVtlnRUUg9Jcs4dMrP/lbTaq/eMcy7QYlsAAABAphUpUkQ6+Jd279qhk6lvL5s3f660CYBPSEiIoqKifP+fnqccDcHOubvP8H75ZM+dpL7p1HtL0ltZ2jgAAAAEvSIFTEUKpE7AkkpXy/nGAMgWuX1NMAAAAAAAOYYQDAAAAAAIGoRgAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAICAzK2ZmM81sg5mtN7P6ZhZuZovNbJP3s7hX18zsJTPbbGbfm1mt3G4/AACBEIIBAEB6/iVpgXOuqqSaktZLGihpqXOukqSl3mtJaiGpkvfoLWlczjcXAIAzIwQDAIA0zKyIpJslvSlJzrm/nHOHJbWVNNmrNlnS7d7ztpLedj4rJRUzs1I53GwAAM4oX243AJeu8gPn5XYTAADn7gpJCZImmllNSd9I+pukKOfcHklyzu0xs0ivfoykHcm23+mV7cm5JgMAcGaMBAMAgEDySaolaZxz7jpJf+q/U58DsQBlLk0ls95mtsbM1iQkJGRNSwEAOAuEYAAAEMhOSTudc197r2fKF4r3JU1z9n7uT1a/bLLty0janXqnzrnxzrlY51xsREREtjUeAID0EIIBAEAazrm9knaYWRWvqLGkHyXNldTNK+smaY73fK6krt4q0fUkHUmaNg0AwIWEa4KR6wJdO7z1ubhcaAkAIJWHJU01s/ySfpHUQ74v0GeYWS9J2yV19OrOl9RS0mZJR726AABccAjBAAAgIOfct5JiA7zVOEBdJ6lvtjcKAIDzxHRoAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAAACAoEEIBgAAAAAEDUIwAAAAACBoEIIBAAAAAEGDEAwAAAAACBqEYAAAAABA0CAEAwAAAACCBiEYAAAAABA0CMEAAAAAgKBBCAYAAAAABA1CMAAAAAAgaBCCAQAAAABBgxAMAAAAAAgahGAAAAAAQNAgBAMAAAAAggYhGAAAAAAQNAjBAAAAAICgQQgGAAAAAAQNQjAAAAAAIGgQggEAAAAAQYMQDAAAAAAIGoRgAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAAACAoEEIBgAAAAAEDUIwAAAAACBoEIIBAAAAAEEjR0Owmb1lZvvNbG2yslFmtsHMvjezWWZWLNl7T5jZZjPbaGbNkpU398o2m9nAnDwHAAAAAMDFK6dHgidJap6qbLGk6s65GpJ+kvSEJJnZVZI6Sbra22asmeU1s7ySXpXUQtJVku726gIAAAAAkKEcDcHOuc8kHUpVtsg5d8p7uVJSGe95W0nTnXMnnHNbJG2WVMd7bHbO/eKc+0vSdK8uAAAAAAAZutCuCe4p6RPveYykHcne2+mVpVcOAAAAAECGLpgQbGaDJJ2SNDWpKEA1l0F5oH32NrM1ZrYmISEhaxoKAAAAALhoXRAh2My6SWolqYtzLinQ7pRUNlm1MpJ2Z1CehnNuvHMu1jkXGxERkfUNBwAAAABcVHI9BJtZc0kDJLVxzh1N9tZcSZ3MrICZVZBUSdIqSaslVTKzCmaWX77Fs+bmdLsBAAAAABeffDl5MDObJqmhpJJmtlPSYPlWgy4gabGZSdJK51wf59w6M5sh6Uf5pkn3dc4levt5SNJCSXklveWcW5eT5wEAAAAAuDjlaAh2zt0doPjNDOoPkzQsQPl8SfOzsGkAAAAAgCCQ69OhAQAAAADIKYRgAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAAACAoEEIBgAAAAAEDUIwAAAAACBoEIIBAAAAAEGDEAwAAAAACBqEYAAAAABA0CAEAwAAAACCBiEYAAAAABA0CMEAACAgM9tqZj+Y2bdmtsYrCzezxWa2yftZ3Cs3M3vJzDab2fdmVit3Ww8AQGCEYAAAkJFbnXPXOudivdcDJS11zlWStNR7LUktJFXyHr0ljcvxlgIAkAmEYAAAcDbaSprsPZ8s6fZk5W87n5WSiplZqdxoIAAAGSEEAwCA9DhJi8zsGzPr7ZVFOef2SJL3M9Irj5G0I9m2O70yAAAuKPlyuwEAAOCC1cA5t9vMIiUtNrMNGdS1AGUuTSVfmO4tSeXKlcuaVgIAcBYYCQYAAAE553Z7P/dLmiWpjqR9SdOcvZ/7veo7JZVNtnkZSbsD7HO8cy7WORcbERGRnc0HACAgQjAAAEjDzMLMrHDSc0lNJa2VNFdSN69aN0lzvOdzJXX1VomuJ+lI0rRpAAAuJEyHBgAAgURJmmVmku/vhXedcwvMbLWkGWbWS9J2SR29+vMltZS0WdJRST1yvskAAJwZIRgAAKThnPtFUs0A5QclNQ5Q7iT1zYGmAQBwXpgODQAAAAAIGoRgAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAAACAoEEIBgAAAAAEDUIwAAAAACBoEIIBAAAAAEGDEAwAAAAACBqEYAAAAABA0CAEAwAAAACCRr7cbgAAAABwwdv9n7Rlpa/L+XYAOG+MBAMAAAAAggYhGAAAAAAQNAjBAAAAAICgQQgGAAAAAAQNQjAAAAAAIGgQggEAAAAAQYMQDAAAAAAIGoRgAAAAAEDQIAQDAAAAAIIGIRgAAAAAEDQIwQAAAACAoEEIBgAAAAAEjXy53QAgkPID5wUs3/pcXA63BAAAAMClJEdHgs3sLTPbb2Zrk5WFm9liM9vk/SzulZuZvWRmm83sezOrlWybbl79TWbWLSfPAQAAAABw8crp6dCTJDVPVTZQ0lLnXCVJS73XktRCUiXv0VvSOMkXmiUNllRXUh1Jg5OCMwAAAAAAGcnREOyc+0zSoVTFbSVN9p5PlnR7svK3nc9KScXMrJSkZpIWO+cOOed+lbRYaYM1AAAAAABpXAgLY0U55/ZIkvcz0iuPkbQjWb2dXll65QAAAAAAZOhCCMHpsQBlLoPytDsw621ma8xsTUJCQpY2DgAAAABw8bkQQvA+b5qzvJ/7vfKdksomq1dG0u4MytNwzo13zsU652IjIiKyvOEAAAAAgIvLhRCC50pKWuG5m6Q5ycq7eqtE15N0xJsuvVBSUzMr7i2I1dQrAwAAAAAgQzl6n2AzmyapoaSSZrZTvlWen5M0w8x6SdouqaNXfb6klpI2SzoqqYckOecOmdn/Slrt1XvGOZd6sS0AAAAAANLI0RDsnLs7nbcaB6jrJPVNZz9vSXorC5sGAAAAAAgCF8J0aAAAAAAAcgQhGAAAAAAQNAjBAAAAAICgQQgGAAAAAAQNQjAAAAAAIGgQggEAAAAAQSNHb5GES1P5gfNyuwkAAAAAkCmMBAMAAAAAggYhGAAAAAAQNAjBAAAAAICgQQgGAAAAAAQNQjAAAAAAIGgQggEAAAAAQYMQDAAAAAAIGoRgAAAAAEDQIAQDAAAAAILGOYdgMytuZteaWYGsbBAAAMh69NsAAPhkKgSb2VAzey7Z60aStkv6RtLPZnZ1NrUPAACcJfptAADSl9mR4C6SNiR7PVrSF5IaSNooaUQWtwsAAJy7LOu3zSyvmf3HzD72Xlcws6/NbJOZvWdm+b3yAt7rzd775bPqZAAAyEqZDcGlJf0iSWZWVlJNSYOdcysl/VNSvexpHgAAOAdZ2W//TdL6ZK+flzTGOVdJ0q+SennlvST96pyrKGmMVw8AgAtOZkPw75KKes8bydfJrfJeH5dUKKsbBgAAzlmW9NtmVkZSnKQ3vNfm7W+mV2WypNu952291/Leb+zVBwDggpIvk/WWSxpoZqclPS5pTrL3KkvakdUNAwAA5yyr+u0XJcVLKuy9LiHpsHPulPd6p6QY73lM0n6dc6fM7IhX/8C5ngQAANkhsyPB/SSdkDRd0mFJg5K911XSZ1ncLgAAcO7Ou982s1aS9jvnvkleHKCqy8R7yffb28zWmNmahISEMzUDAIAsl6mRYOfcLvmmPwXSTNKxLGsRAAA4L1nUbzeQ1MbMWkoKlVREvpHhYmaWzxsNLiNpt1d/p6SyknaaWT75pmMfCtC28ZLGS/r/9u49XLKqPND4+0kLykWaS4NAgw2CdxPAFjFeA2pAjI0GFKNCDA7GAaJRE1sno2Ymjk2iomIGQ4IIjnJRYWhp1CANMckAgnITW6WBFjrd3OSqLQLyzR9rHbr6dNU5dc6pOlXn7Pf3PPVU1dqrqr59qVr17b322ixcuHCjJFmSpH7r9hJJyyPiWR0mPxX4Tu9CkiRJU9GLdjszP5SZ8zNzAXAEsDwz3wpcAhxWqx3F+q7WS+tz6vTlmWmSK0kaOt12h34lZQ9wO08BXt6TaCRJUi+8kv612x8E3hcRKynn/J5ay08Ftqvl7wMWT+EzJEnqm24HxoL25/VsSuludXvPIpIkSb3Qs3Y7My8FLq2Pbwb2a1PnIeDwScQpSdK06pgER8RHgY/UpwlcPsaVDv6+x3FJkqQJsN2WJKk7Yx0JvpByWYMAPgd8Clg1qs7DwE8y89/6Ep0kNdyCxcvalq9acsg0R6IZwHZbkqQudEyCM/NK4EqAiHgQWJaZXutPkqQhZLstSVJ3ur1E0un9DkSSJPWG7bYkSZ11lQRHxBOB9wBvpFwT8Emj62TmDr0NTZIkTYbttiRJnXU7OvSJwLuACyjXB3y4bxFJkqSpst2WJKmDbpPgw4HFmfmpfgYjSZJ6wnZbkqQOntBlvQCu62cgkiSpZ2y3JUnqoNsk+J+At/QzEEmS1DO225IkddBtd+g7gLdGxCXARcB9o6ZnZp7c08gkSdJk2W5LktRBt0nwZ+r9bsAr2kxPwMZUkqThYLstSVIH3V4nuNtu05IkacBst6XeOGn5yo3Kjj9gzwFEIqmXbCQlSZIkSY3RbXdoImIH4P3AQmBX4A2ZeUNEvAf4fmZe1qcYJakRFixeNugQNIvYbkuS1F5XR4IjYj/gRuCPgFXA04HN6uSdKI2sJEkaArbbkiR11m136BOBS4BnAO+iXH9wxPeB/XoclyRJmjzbbUmSOui2O/S+wKLMfCwiYtS0XwA79DYsSZI0BbbbUjfWXD3oCCQNQLdHgu8H5nWYtgfleoSSJGk42G5LktRBt0nw+cDfRMQeLWUZEdsDHwDOnWogEfEXEXFDRPwoIs6MiCdFxO4RcUVE3BgRZ0fEprXuZvX5yjp9wVQ/X5KkWaTv7bYkSTNVt0nwYuAB4MfA92rZF4CfAr8GPjKVICJiF+DPgYWZ+TxgE+AI4ATgxMzcC7gXOLq+5Gjg3szck3Le0wlT+XxJkmaZvrbbkiTNZF0lwZl5L7A/cCzwc+C7wC2URvYlmflgD2KZAzw5IuYAmwNrgQOAr9fppwOH1seL6nPq9APbnPMkSVIjTVO7LUnSjNT1dYIz82Hg1Hrrqcz8z4j4JHArZQ/1vwA/AO7LzEdrtdXALvXxLsBt9bWPRka5EkwAACAASURBVMT9wHbA3b2OTZKkmaif7bYkSTNZt9cJ/teIeHdEdBpkY0oiYhvK0d3dgZ2BLYCD21TNkZeMMa31fY+JiKsi4qq77rqrV+FKkjTU+t1uS5I0k3V7TvBdwCeBNRFxUUT8aU1ce+VVwC2ZeVdmPkIZsOP3gLm1ezTAfGBNfbwa2BWgTt8auGf0m2bmKZm5MDMXzpvn/wBJUmP0u92WJGnG6vac4MMo1xQ8Evgl8A/A7RFxQUS8PSK2mmIctwL7R8Tm9dzeAymDeVwCHFbrHEUZ7RJgaX1Onb48Mzc6EixJUhNNQ7stSdKMNZFzgn8FnAmcWRvPNwBvAv6JMuLkFpMNIjOviIivAz8EHgWuBk4BlgFnRcTf1rKR85pOBb4cESspR4CPmOxnS5I0G/Wz3ZakCVlzdXf1dt6nv3FIVddJcKvMfDAibqKMNPkAsP1UA8nMjwIfHVV8M7Bfm7oPAYdP9TMlSWqCfrTbkiTNVN2eEwxAROwXEZ+KiFsp1x18BfBZYK9+BCdJkibPdluSpI11dSQ4IpZQulA9DbgROA04KzNX9DE2SZI0CbbbkiR11m136DcB51Aa0Gv6GI8kSZo6221JkjroKgnOzD36HYgkSeoN221Jkjrr+pzgiNgsIt4dEadGxL9ExF61/M0R8ez+hShJkibKdluSpPa6PSf4GcBFwNbAD4BXAiPXGHwZcAjlWoSSJGnAbLclSeqs2yPBnwNuBRYAfwBEy7R/BV7a27AkSdIU2G5LktRBtwNjvQw4PDPvi4hNRk27A9ipt2FJkqQpsN2WJKmDbo8EPwQ8ucO0XYD7ehOOJEnqAdttSZI66DYJvgj4cERs3VKWEbEZcDxwYc8jkyRJk2W7LUlSB912h/5L4D+AlZSGNYGPAM8FNgXe2JfoJEnSZNhuS5LUQVdHgjPzNuB3gS9QBtm4iXI+0deAF2Tm7f0KUJIkTYzttiRJnXV7JJjMvBf47/UmSZKGmO22JEntdZ0ES5IkSbPVSctXDjoESdOk24GxJEmSJEma8UyCJUmSJEmNYRIsSZIkSWoMk2BJkiRJUmN0PTBWRBwJLM3M+/oYjyQ1woLFywYdgmY5221JktqbyJHg04DdAKL4SEQ8tT9hSZKkKbLdliSpjY5HgiNiGXBtvV0HBJB18hOAjwIXALf3OUZJkjQO221JkrozVnfoi4B9gNcBz6I0pJ+PiEuAK9mwcZUkSYNluy1JUhc6JsGZ+ZmRxxGxGfBr4IfAM4G3UxrSL0fEt4HvZua3+xyrJEnqwHZbkqTudDwnOCKOj4iXRsRWmfmbWnxaZr6F0qAGcCawJfD5/ocqSZI6sd2WJKk7Y3WHfj3w18D2EbGKsgf5iIh4MnB9rfOtzPxhf0OUJEldsN2WJKkLHY8EZ+arM3NHYD5wHGUP8quAbwH3UBrXd0fEgbXblSRJGpBet9sR8aSI+H5EXBsRN0TE39Ty3SPiioi4MSLOjohNa/lm9fnKOn1Bf+ZUkqSpGfcSSZm5NjO/VZ++MzO3BRZSGtddgS8B9/YtQkmS1LUettu/AQ7IzN8F9gYOioj9gROAEzNzr/o+R9f6RwP3ZuaewIm1niRJQ2ci1wlutaLefzgzdwVe0KN4JElS70243c7il/XpE+stgQOAr9fy04FD6+NF9Tl1+oERET2IXZKknhrrnOANZGZrwpzAzyl7icnMFW1fJPXYgsXLNipbteSQAUQiScOtF+12RGwC/ADYE/gH4Cbgvsx8tFZZDexSH+8C3Fbf/9GIuB/YDrh7anMiSVJvdZ0Et8rMx4DdexyLJEnqg8m225n5W2DviJgLnAc8u121et/uqO9G1yWOiGOAYwB22223iYYkSdKUTSoJliQNlr0iNJ0y876IuBTYH5gbEXPq0eD5wJpabTXlnOPVETEH2JoyINfo9zoFOAVg4cKFGyXJkiT122TPCZYkSbNYRMyrR4Cpl1l6FeXc4kuAw2q1o4Dz6+Ol9Tl1+vLMNMmVJA0djwRLkqR2dgJOr+cFPwE4JzMviIgfA2dFxN8CVwOn1vqnAl+OiJWUI8BHDCJoSZLGYxIsSZI2kpnXAfu0Kb8Z2K9N+UPA4dMQmiRJU2J3aEmSJElSY5gES5IkSZIawyRYkiRJktQYJsGSJEmSpMYwCZYkSZIkNYZJsCRJkiSpMUyCJUmSJEmNYRIsSZIkSWoMk2BJkiRJUmOYBEuSJEmSGsMkWJIkSZLUGCbBkiRJkqTGGJokOCLmRsTXI+InEbEiIl4cEdtGxEURcWO936bWjYj4XESsjIjrImLfQccvSZIkSRp+Q5MEA58Fvp2ZzwJ+F1gBLAYuzsy9gIvrc4CDgb3q7Rjg5OkPV5IkSZI00wxFEhwRTwFeDpwKkJkPZ+Z9wCLg9FrtdODQ+ngRcEYWlwNzI2KnaQ5bkiRJkjTDDEUSDOwB3AWcFhFXR8Q/R8QWwI6ZuRag3u9Q6+8C3Nby+tW1bAMRcUxEXBURV9111139nQNJkiRJ0tAbliR4DrAvcHJm7gP8ivVdn9uJNmW5UUHmKZm5MDMXzps3rzeRSpIkSZJmrGFJglcDqzPzivr865Sk+I6Rbs71/s6W+ru2vH4+sGaaYpUkSZIkzVBDkQRn5u3AbRHxzFp0IPBjYClwVC07Cji/Pl4KHFlHid4fuH+k27QkSZIkSZ3MGXQALY4HvhIRmwI3A++gJOnnRMTRwK3A4bXuhcBrgZXAulpXkiRJkqQxDU0SnJnXAAvbTDqwTd0Eju17UJIkSZKkWWUoukNLkiRJkjQdhuZIsGaGBYuXDToESZIkSZo0jwRLkiRJkhrDJFiSJEmS1BgmwZIkSZKkxjAJliRJkiQ1hkmwJEmSJKkxTIIlSZIkSY1hEixJkiRJagyTYEmSJElSY5gES5IkSZIawyRYkiRJktQYJsGSJEmSpMYwCZYkSZIkNYZJsCRJkiSpMUyCJUmSJEmNYRIsSZIkSWoMk2BJkiRJUmPMGXQAkqTeWLB42UZlq5YcMoBIJEmShpdHgiVJkiRJjWESLEmSJElqDJNgSZIkSVJjeE6wJPVZu3N1JUmSNBgeCZYkSZIkNYZHgiVJkiRNm5OWr9zg+fEH7DmgSNRUHgmWJEmSJDWGSbAkSZIkqTFMgiVJkiRJjWESLEmSJElqDJNgSZIkSVJjmARLkiRJkhrDJFiSJG0kInaNiEsiYkVE3BAR76nl20bERRFxY73fppZHRHwuIlZGxHURse9g50CSpPZMgiVJUjuPAu/PzGcD+wPHRsRzgMXAxZm5F3BxfQ5wMLBXvR0DnDz9IUuSND6TYEmStJHMXJuZP6yPHwRWALsAi4DTa7XTgUPr40XAGVlcDsyNiJ2mOWxJksZlEixJksYUEQuAfYArgB0zcy2URBnYoVbbBbit5WWra5kkSUNlzqADkCRJwysitgS+Abw3Mx+IiI5V25Rlm/c7htJdmt12261XYUrT5qTlKx9/vGbzOXzijc8fYDSSJsMjwZIkqa2IeCIlAf5KZp5bi+8Y6eZc7++s5auBXVtePh9YM/o9M/OUzFyYmQvnzZvXv+AlSerAJFiSJG0kyiHfU4EVmfnplklLgaPq46OA81vKj6yjRO8P3D/SbVqSpGFid2hJktTOS4C3A9dHxDW17MPAEuCciDgauBU4vE67EHgtsBJYB7xjesOVJKk7JsGSJGkjmfnvtD/PF+DANvUTOLavQUmS1AN2h5YkSZIkNYZJsCRJkiSpMUyCJUmSJEmNYRIsSZIkSWoMk2BJkiRJUmMMVRIcEZtExNURcUF9vntEXBERN0bE2RGxaS3frD5fWacvGGTckiRJkqSZYaiSYOA9wIqW5ycAJ2bmXsC9wNG1/Gjg3szcEzix1pMkSZIkaUxDkwRHxHzgEOCf6/MADgC+XqucDhxaHy+qz6nTD6z1JUmSJEnqaM6gA2jxGeCvgK3q8+2A+zLz0fp8NbBLfbwLcBtAZj4aEffX+ndPX7iSJEmSNrDm6kFHII1rKJLgiHgdcGdm/iAiXjlS3KZqdjGt9X2PAY4B2G233XoQqYbRgsXLNipbteSQAUQiSZIkadgNS3folwCvj4hVwFmUbtCfAeZGxEiiPh9YUx+vBnYFqNO3Bu4Z/aaZeUpmLszMhfPmzevvHEiSJEmSht5QJMGZ+aHMnJ+ZC4AjgOWZ+VbgEuCwWu0o4Pz6eGl9Tp2+PDM3OhIsSZIkSVKroUiCx/BB4H0RsZJyzu+ptfxUYLta/j5g8YDikyRJkiTNIENxTnCrzLwUuLQ+vhnYr02dh4DDpzUwSZIkSdKMN3RJsCRJkqTZ4aTlKwcdgrSRYe8OLUmSJElSz5gES5IkSZIawyRYkiRJktQYnhOsjhYsXjboECRJkiSppzwSLEmSJElqDJNgSZIkSVJjmARLkiRJkhrDJFiSJEmS1BgOjCVJkiRNws7rfgJrHh1VuM9ggpHUNY8ES5IkSZIawyPBkjSLdbrU2aolh0xzJJIkScPBJFiSesRra0uSJA0/u0NLkiRJkhrDJFiSJEmS1BgmwZIkSZKkxjAJliRJkiQ1hkmwJEmSJKkxTIIlSZIkSY3hJZIkSZKabM3VG5ftvE939TrVlaQhZhIsSZIkafDc0aJpYhIsSZKkDXVKRiRpFjAJliRJUm9128VakgbAJFiSJEmDM4CE+UPnXl8+Zt3Kvn6OpOHk6NCSJEmSpMYwCZYkSZIkNYZJsCRJkiSpMUyCJUmSJEmNYRIsSZIkSWoMk2BJkiRJUmN4iSRJkqSZbCKXGGpXV5IaxiRYkiRJ/WcCLmlI2B1akiRJktQYHgmWJEmSpG516tXQ6TQEDR2PBEuSJEmSGsMjwQJgweJlgw5BkiT1ynSef+u5vpJmGJNgSZIkzX4tyfrO61YOMBBJg2Z3aEmSJElSY3gkWJIkSZotJnLd6CFx0vKNj8wff8CeA4hETWESLEmS2oqILwKvA+7MzOfVsm2Bs4EFwCrgTZl5b0QE8FngtcA64E8y84eDiFtqDM/HlibFJFizUqeBvlYtOWSaI5GkGe1LwOeBM1rKFgMXZ+aSiFhcn38QOBjYq95eBJxc7yVJGiqeEyxJktrKzO8B94wqXgScXh+fDhzaUn5GFpcDcyNip+mJVJKk7pkES5KkidgxM9cC1PsdavkuwG0t9VbXsg1ExDERcVVEXHXXXXf1PVhJkkYzCZYkSb0Qbcpyo4LMUzJzYWYunDdv3jSEJUnShkyCJUnSRNwx0s253t9Zy1cDu7bUmw+smebYJEka11AkwRGxa0RcEhErIuKGiHhPLd82Ii6KiBvr/Ta1PCLicxGxMiKui4h9BzsHkiQ1xlLgqPr4KOD8lvIjaxu9P3D/SLdp9dCaqze+SZImZCiSYOBR4P2Z+Wxgf+DYiHgO60eg3Au4uD6HDUegPIYyAqUkSeqhiDgTuAx4ZkSsjoijgSXAqyPiRuDV9TnAhcDNwErgn4D/OoCQJUka11BcIqnuKR4ZZOPBiFhBGUxjEfDKWu104FLKZRgeH4ESuDwi5kbETu5xliSpdzLzLR0mHdimbgLH9jciSeqjdj0rdt5n+uNQ3w3LkeDHRcQCYB/gCqY4AqUkSZIkSa2GKgmOiC2BbwDvzcwHxqrapmyjESi9DIMkSZIkqdXQJMER8URKAvyVzDy3Fk9pBEovwyBJkiRJajUU5wRHRACnAisy89Mtk0ZGoFzCxiNQHhcRZwEvwhEoJWlCFixetlHZqiWHDCASSZKk6TUUSTDwEuDtwPURcU0t+zAl+T2njkZ5K3B4nXYh8FrKCJTrgHdMb7iSJEmSNA4H2xpKQ5EEZ+a/0/48X3AESklDqN2RVEmSJA2/oTknWJIkSZKkfhuKI8GSJEmSNHTadWfWjOeRYEmSJElSY3gkWJIkSZKmyqPGM4ZJsCRJ0jDyD7Uk9YVJsCRJkjTM3CEi9ZRJcMN4WRdJkiRJTWYSLEmSJE3SSctXbvB8zeZz+MQbnz+gaDQjdDqyv/M+0xtHgzk6tCRJkiSpMTwSLEmSJGnKPnTu9ey8buX4FaUB80iwJEmSJKkxTIIlSZIkSY1hd2hJkiRJGrR2A2Y5WFZfeCRYkiRJktQYHglWo7S7TvKqJYcMIBJJkiRpHB4d7guPBEuSJEmSGsMjwZIkSZpd2h09k6TKJFiSxtGuG70kSTOGXWqlDdgdWpIkSZLUGCbBkiRJkqTGsDv0LGYXTkkT4ejpkmajk5avHHQIkoaMSbAkSZIkzRSe4z1lJsFqPI9+SZIGypGMNRO12W53XudR94Hp9DtictyWSbAkSZLUIzuv+wmsebTNBJMRDYBHjdtyYCxJkiRJUmOYBEuSJEmSGsMkWJIkSZLUGJ4TLEmSNF0cBEuSBs4kWJLUkaOnS5JmJXdINZrdoSVJkiRJjeGRYElq0e7IpyRJml4nLV9/zeE1m5eU5RNvfP6gwtEsYxIsSZLUD3a3lHpi53U/KQ9ar7/stW41BXaHliRJkiQ1hkeCZwm7cEqSJEnS+EyCJTWSO44kacPzLkccf8CeA4hkdmm7XN9m911pWJgES5IkaUwzKVn+0LnXs/O6jeOVpBEmwZIkSZqw0YnxsCbF6o92O0akmcIkeIh16q65askh0xxJ87Rb9i53SZL6Y6OE2q7D0vRqN5r9LB6B2yR4BvJcxsFwp4QkqQn6fYTPI4iSBs0kWJIkqSH6mYCa3A5WX7une83r2cX1aRIsaXaxp0T/2StCamPAfypn0sBVPdVmuQ/toFgN624qDTOT4CHhH/eZy/OHpcLvgjRcPDI7e/V13XqUUA1gEiz1gcmAJElqNd3XDp71vQM8sq4pMAnuEZMeSZLUa7M+kemkKQlOU+ZTM1OnXgGzYBs1CR4Auz5LveF3afi5g1DqPbs5S/3RzXerETuhGsAkuI/8gy71ht8lSVI77hCYHsOynIehZ8RUYpjsCN7DMN+zzYxOgiPiIOCzwCbAP2fmkun4XP+QazI8IiYVE/kN9Tsy8wyqbZ6JhiWxmDEcsGnKNtzmymOTqamb7Hd5xia3s6Ab/4xNgiNiE+AfgFcDq4ErI2JpZv54sJFJ3WtKMuCOI01Wt9vOTP5+zCa2zZ2Z8E6My2u9D517/bRf9mkmLf/Rif1GSWSH5GxY53FY4xrXDEuMZ2wSDOwHrMzMmwEi4ixgEdD4hlaSVNgDY9rN3LbZo4wagLbdY0dti/1OgGds0tXBxvPTJjGehbpdj+2WxWS7aY9rIr+r05wwz+QkeBfgtpbnq4EXDSgWqe/8My91Zm+DoTG4tnmajkLMtoRBw8Xtqz9crut1syx6ubyGdQfETE6Co01ZblAh4hjgmPr0lxHx0zHeb3vg7h7FNgxm0/w4Lx3ECb16p0lz3Qwn52UMPfzePK1n7zR79LptnqzZ9B0YNi7b/nHZ9s+sW7Z/PugAinGX6wDi7KptnslJ8Gpg15bn84E1rRUy8xTglG7eLCKuysyFvQtvsGbT/Dgvw2s2zY/zMpxm07w0RE/b5slyu+kfl23/uGz7x2XbHzN5uT5h0AFMwZXAXhGxe0RsChwBLB1wTJIkNZltsyRp6M3YI8GZ+WhEHAd8h3IZhi9m5g0DDkuSpMaybZYkzQQzNgkGyMwLgQt79HZ97Zo1ALNpfpyX4TWb5sd5GU6zaV4aocdt82S53fSPy7Z/XLb947Ltjxm7XCMzx68lSZIkSdIsMJPPCZYkSZIkaUJmZRIcEV+MiDsj4kcdpm8dEd+MiGsj4oaIeEct3zsiLqtl10XEm1te86WIuCUirqm3vYd9fuq037bEvLSlfPeIuCIiboyIs+sAJkM7LxHx+y3zcU1EPBQRh9ZpA1k3XczLNhFxXt2Wvh8Rz2uZdlBE/DQiVkbE4pbyYV0vbeclInaNiEsiYkVdX+9pec3HIuI/W9bLa6djXqYyP3Xaqoi4vsZ8VUv5thFxUV03F0XENsM8LxHxzFHfmQci4r112kDWzVjbS0udiIjP1e/GdRGxb8u0o+ryvzEijmopf0FdZyvra9tdpkezTBffjb9s2cZ/FKU93Ha645yJJttWa3xTaZ/U2VTbF3XW5bJ9VpQc6jcR8YFBxDlhmTnrbsDLgX2BH3WY/mHghPp4HnAPsCnwDGCvWr4zsBaYW59/CThsJs1Pff7LDq85BziiPv4C8O5hn5eWOtvW8s0HuW66mJe/Bz5aHz8LuLg+3gS4CdijbnfXAs8Z8vXSaV52Avatj7cCftYyLx8DPjDd62Uq81OfrwK2b/OavwMW18eLR7bTYZ6XljqbALcDTxvkuhlre2mp81rgW5Trze4PXFHLtwVurvfb1Mfb1GnfB15cX/Mt4OBBbHfepn17GvO7MaruHwLLBx3zTLl18bszblvtbdLLdtzfdG9tl9uk2xdvPVm2OwAvBD4+qP9+E73NyiPBmfk9yg9yxyrAVvVowZa17qOZ+bPMvLG+xxrgTsqP+0BNdn46Va71DgC+XotOBw7tTbRj69G8HAZ8KzPX9SfK7nQxL88BLq51fwIsiIgdgf2AlZl5c2Y+DJwFLBry9dJ2XjJzbWb+sJY/CKwAdul3vOOZwroZyyLKOoEZsG5G1TkQuCkzf96fKLvT5fayCDgji8uBuRGxE/AHwEWZeU9m3gtcBBxUpz0lMy/L0hKfwTStGw1WF9+NVm8BzuxjOLNKr/93aL0+tU+NN8X2RWPoZtlm5p2ZeSXwyABCnJRZmQR34fPAs4E1wPXAezLzsdYKEbEf5SjdTS3FH6/dJ06MiM2mLdrxjTU/T4qIqyLi8qjdh4HtgPsyc6TBWs0QJC7VuOuGct3J0X9mhnHdXAu8ER7fnp4GzKcs69ta6o0s/2FeL53m5XERsQDYB7iipfi4ul6+OF3dh7s01vwk8C8R8YOIOKblNTtm5looDQJlr+cwGHfd0P47M9B102F7gc7fj7HKV7cplwCIiM2Bg4BvDDqWWaSbtlqT081vusYwifZFXRpj2c44TU2C/wC4htLleW/g8xHxlJGJda/Ql4F3tPyof4jSLeWFlO54H5zWiMc21vzslpkLgT8GPhMRT6d0AxltWIYJ72bdPJ9yDcoRw7pulgDbRMQ1wPHA1ZQ95Z2W/zCvl07zAkBEbEn5g/nezHygFp8MPJ2yHtcCn5rWiMc21vy8JDP3BQ4Gjo2Ilw8oxm6Nt242BV4PfK3lNQNdNx22l8cnt3nJWN+PYf7eaDj8IfAfmdntUWONb8y2WlMy5m+6xjbJ9kVdGGfZzjhNTYLfAZxbu0OsBG6hJFHUH/FlwF/XrhLA410BMjN/A5xG6dI6LDrOT+3WTWbeDFxK2XtzN6ULyMh1oudT9uYOg47zUr0JOC8zH+9uMazrJjMfyMx3ZObewJGUrvW3UPY87tpSdWT5D+16GWNeiIgnUn4Uv5KZ57a85o7M/G3dkfRPDMl6gbHnp+U7cydwHuvjvmOk21S9v3PaA29jrHmpDgZ+mJl3tLxmYOum0/bSotP3Y6zy+W3KpRHtekJoasZrqzVJXfymq4MptC8aRxfLdsZpahJ8K+UcOep5Fs8Ebq5HTM6jnC/QetSElj+/QTnfrO2ofgPSaX62GekaHBHbAy8BflzPm7uEcm4twFHA+dMedXtt56Vl+kbndQ3ruomIubF+dOd3At+re86uBPaKMhL0ppQ/aEuHeb10mpe6zE8FVmTmp0e9pvU8mzcwJOsFxpyfLSJiq1pnC+A1rI97KWWdwAxYNy1VOn5nqmlbN2NtLy2WAkfWUTz3B+6v3c+/A7ym/q5tQ1k336nTHoyI/ev7H8mQrBsNXkRsDbwCt4leG6+t1iR18ZuuNqbYvmgMXS7bGSfK/+7ZJSLOBF4JbA/cAXwUeCJAZn4hInamjCi8E6VrxJLM/D8R8TbKkcQbWt7uTzLzmohYTtkbF5QuQH+Wmb8c8vn5PeAfgccoOzw+k5mn1vfcgzIg07aUrjZvq0dSh3Je6msXAP8B7Np67tGg1k0X8/JiyiA9vwV+DBydZUAfolyS5jOUUXu/mJkfr+XDul7azktEvBT4N8o5YSPr5MOZeWFEfJnSTS4pIy6/a7oamynMzx6UHWEAc4Cvtqyb7Sijd+9G+QN4+HR0r5zidrY55fynPTLz/pb3HMi66bS9UJbpyPwE5XzDg4B1lNNSrqqv/9NaH+DjmXlaLV9I+d14MmXkz+NzNjZu2sB4341a50+AgzLziMFEOTNNpa3W2Kbym67Optq+qLMul+1TgauAp9Q6v6SMID20O3BmZRIsSZIkSVI7Te0OLUmSJElqIJNgSZIkSVJjmARLkiRJkhrDJFiSJEmS1BgmwZIkSZKkxjAJVs9ExMciIltut0fEBRHxO4OObSoiYtM6b3tP8+fuUD93QQ/f85MRsWqcOq3r8bGIuDciroyIj9ch8PsqIlbVz/5vbaa9rCW2Bf2OpRsR8f6IuKRN+Ssi4vyIuDMiHqn334yIg+tlGrp9/wsi4voxpn++rqPNIuLwiPhpRGwy2fmRNLvYNvf8c22bN55m27zxdNvmIWcSrF67H3hxvb0XeAZwUURsO9CopmZTynX8prWhBXaon7tgmj8X1q/H3wOOAM4F3g5cHxEvmIbP/yXwljblR9RpQyEitgQ+CCwZVf5e4BLKdR6PBw4EjqPEfgFwwAQ+5kzgeRHx3DafvwlwGHBuvZ70NyjX7Hz7hGdG0mxm29w7ts0bs23e8HNsm2cAk2D12qOZeXm9nQUcSWkwDhpwXNMiIp486Bh6pHU9ficzPwH8DrAWOHsa9mZeADwnIp43UtDSqCzt82dPxFuA3wD/MlIQEfsCnwT+R2a+MTPPzszvZeY5mfkW4KXA3RP4jPOBdZQ/GaP9PrAjpTEmMx8DzqA07pI0wrZ5drBt7o5ts8ZlEqx+u7be79paGBHbRsQ/RsQdEfFQRPy/iHjRqDqbRMSHIuJnSlrHHgAACn5JREFUEfGbiFgdEV8aVee4iLixTl8ZEX8xavrHIuLuiNgnIi6PiHURcXVEvGxUvddHxA8i4le1+8oVEfGKOvnBen9aa3efesuIeGtEnBER9wHfrO+XEXFcu1hGlT0tIs6sMa6LiOsi4o9rd6KRbjaXjHzuBJff3Ij4ap2nte26ME1EZt4H/BXwdODV3bwmIp4bEd+OiHtqHCsi4tguXvqfwL+zYeNyALAlbRra2u3pyoi4vy6Tb0bEnqPqvDQi/i0iHqi3ayLi8JbpY20DnRxF2dObLWXHA3cCf9vuBZl5WWZe21oWEe+MiBvqdvzziPirlvoje6jf3ObtjgDuoOzZHvENYN/WPymSNIpt86hYRpXZNrdn27y+vm3zDGcSrH7brd7fMlIQEZsB36X8WP8lcChwF/Dd2PC8ln8E/gY4B3gd8H5gi5b3+S/ASZQf3j8EvgZ8KiIWj4phc+D0+n5/RNk7eF5EbF7f5+nA14Hl9X3eSvlhG+kmNtI95m9Z351sbcv7f5LSGB8O/K+ulkr53B2Ay4AXAh+on30q5U/J2hoHwLEtnzuR5XcacDCl69sxwGtov8dyIi4BHgX277L+Ukq3o7cBr6esr626fO2ZbBjvWyh/ZH7Vpu584PPAIuC/AJsA/xERWwNExFMo6/RmyjZwGPBlYG6dPt42sJGI2AJ4EfD/Rk16ObA8Mx/tZiYj4i+Bk4H/S9nOTwb+56g/amcCe0VLd7eIeCLwBuCczPztSHlmrgDupXTzkqR2bJs7sG0el23zerbNM1lmevPWkxvwMUpXkjn19nTgIuBqYLOWekcDDwN7tZTNAW4C/r4+fxaQwJ93+KwnUPZInjaq/H9Tzpl5UktMCRzQUmfvWnZQfX4Y8Isx5mvLWv9PRpUvqOXntXlNAse1Wz4tzz9BaTR26vC5z6vv88pR5d0sv+fW17551HzcA6zqZj2OMX0tcHIX28P2NYbnT3A7WkX58zIPeITyR2RTSuNxKKUxSmBBh9dvAjyZ8ufnyFq2sL5mqw6vGXMb6PCa36vv+dxR5b8GPjGqLFq+F3OAJ9Typ1DORfroqPr/A7gd2KQ+36zO/9+31BlZDi9uE9ulwFcmMj/evHmbnTdsm1un2TbbNreW2TY3+OaRYPXadpQfx0eAlcA+wBuzDAww4lXAD4BbImJORMyp5f9K+UGEcj4FwJc6fM58YGfKHuZWZ1N+vJ7fUvYI5YdnxI9b3gNK16atI+L0iHhN3Ys4EcsmWH/EAcC3M3PtuDU31M3ye2G9f7x7UpauOxdNMtZW3Y6eeA9wG/CFiHhz3bvetcy8i7L39wjKeWsBfKttQBH7R8RFEfELyt7wdZQ/Fs+oVW6iNGhfjYhFETF31FtMZhsY2bPf7hyiHPX8j1j/vXgE+Lta/mLKEZSvjazLuj6XU84nmg9Qvz/nAW+KeHz0yjcDPwcub/P5d7fEJ0m2zd2zbR6DbbNt82xhEqxeu5/yI78/8C7KXsKvRkTrtrZ9nf7IqNs7WH9+0nbArzLzgQ6fs1O9v2NU+cjz1q4yD2QZlACAzHy4PnxSff5TSledPYALgbvr+Trzxp3b9jF0azs27LrVrW6W31OBBzPz16Nee+fkQi0i4kmUuMed57rMX0PZa/pF4PZ63s8+E/jIs4A3AX8M/N9Rf9hGYtqNMvhFULa5l1C2wTtZv47vrbE8kdKF766IWBYRe9Tpk9kGnlTvR8e0hvV/4kZcXGN6IRuu8+3r/Q1suC5HziNqPV/vTEoXxhfX9bAIODPr7uVRftMSnyTZNnfPtnl8ts3r2TbPUHPGryJNyKOZeVV9fEVE/JoyIt7hlD3BUPZCXgW8u83rR360fgFsERFP6dDYjvxYjd6DuWPLZ3QtM5cBy+p5KocAn6GcI9PNeTqdfug2HVU2+hyWX7D+D8NEdLP8bge2iognj2psJ7THt43fp/xuXNZN5cz8CfBH9RyZlwEnUJbz/NY/P2M4F/gCZfs5pEOdgyjnli3KzF8B1D22GyzvzLwMOCjKKKGvAj4NfJV6DtUktoGRbWwucF9L+feA10TEJlnPB6oN/VU1tofbvMfraP/n5actj5fXOkdQtputqCNPtjGXCX4HJM1qts2FbTO2zbbNAo8Eq//+D2VP2gdbyi4G9gRuzcyrRt1GRl1cXu+P7PC+qyl79Q4fVf4m4AHWj944IZl5f2Z+ldK95Tm1eIO9011aDTx75End2z76+nMXA38QETvSXqfP7Wb5XVnvX98Sw5Z0OXJkO7Wb0gmUrnTfnchrM/ORzFxOadx2og560cXr7q+f+Y0xPvPJwGOUrlYj3kSHnXyZ+evM/CZlD/hz2kxvtw20M9II7j6q/CTKH74Pj/HaEZdRzlPauc26vCozR0Y/pTbaX6Ns838MrMjM6zq87wLgZ118vqRmsm3Gttm2uSPb5gbwSLD6KjMzIv4X8JWIODAzL6bsff4z4NKI+CRlVMDtgP2A2zPzxMz8aUScQhlRcgfKHry5wGGZeURmPhYRHwP+sZ5rchHwCsoe2A9n5kPdxhgR76Kc//FtSuO9F+XH7Iw6Dw9HxC2Ucz5+BDwEdPqBG3EecGxEXF3n752U86FanUj5I/FvEfFxyjk6zwa2yMy/A26l/AgfFRH3A4/UPfndLL8bImIpcHIdfXEtZbTKdV0uljkRMTLK5FbACyjLdnPKoCW/7fjKKiJ+hzKIxtk1xm0of7iuzcyu94Rm5kfGqbKcMuDGaRFxKmXgkQ/Qsgc4Ig4B/pQyyuOtwC6U7lnL6/Qxt4EOcd0SEWspy+aSlvIfRsQHgE9HxN51/tcCW1P2uD+Vcg4UmXlf3Y4/GxFPo2znT6CcL/X7mfmGUR97JnAcZeTJtsulnjP1LOC/d4pdUrPZNts2Y9ts29x0OQSjc3mbHTc6jFxI+RH8GfCdlrKtgc9SGpeHKXtnzwVeMup1H6b8SI/UOW3Uex9H2fv5cK33F13G9PgIkZQf2GWUH9iHKJeMOIENR818DaVxfai+dgHrR6B8XZv335Jy6Yd7KN2f/rpdLMDTKD/E91IawWuBI1qmv7Uuu4fL13VCy28bynk7v6J01fkIpeFb1cV6zHp7jNJgXQV8HHjqBLaHHSiXOri5LrfbqefOjPO6VcAnx5i+0QiUlD8sN1H+mFxOuTzC4+8DPJNymYXbKN3SVlO6cm3b7TbQIZbPAxd3mPZKyuAnd1HOJbqTck7TEUCMqvs2yoAqv67bwhXA+9q8Z9TYEtizw+e+gTL65haD/k3w5s3b4G/t2p5abtts22zbbNvc2FvUFSNJmqA6kMiVwPzMvH3Q8QBExJmUgWveOehYJEmabrbN6oZJsCRNQUQsA67OzL8eglh2pZwP9TuZuXLQ8UiSNAi2zRqPA2NJmpSIeELr9fNG3wYd3zR6P6Vb1TCYD/yZjawkNZNt8+NsmzUmjwRLmpSI+BJw1BhVds/MVdMTjSRJsm2WumMSLGlSImIB6y8o3851mfnwGNMlSVIP2TZL3TEJliRJkiQ1hucES5IkSZIawyRYkiRJktQYJsGSJEmSpMYwCZYkSZIkNYZJsCRJkiSpMf4/YwbRfxvf++AAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + " \n", + "plt.suptitle('S/B selection from NN', fontsize='15')\n", + "Ds_mass_MC =[MC_Ds_sig_dict[\"Ds_ConsD_M\"][i][0]/1000 for i in range(m_s)]\n", + "Dplus_mass_MC =[MC_Dplus_sig_dict[\"Dplus_ConsD_M\"][i][0]/1000 for i in range(m_plus)]\n", + "NN_selected = X_dict[i][np.argmax(output_NN,1).astype(np.bool)]\n", + "Ds_mass_sel_NN = NN_selected[:,dim-1]/1000\n", + "Ds_mass_train_NN =X_dict[i][:,dim-1:dim]/1000\n", + "\n", + "plt.subplot(1,2,1)\n", + "plt.hist(Ds_mass_MC+Dplus_mass_MC,bins=70, label='MC signal events');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "plt.subplot(1,2,2)\n", + "\n", + "plt.hist(Ds_mass_sel_NN,alpha=0.6,bins=70, label='S selected from test set');\n", + "plt.hist(Ds_mass_train_NN,alpha=0.2,bins=70, label='Test set (S+B)');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "fig=plt.gcf();\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/Rphipi/'+PATH+'/D_s_NN.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7UAAAHoCAYAAACW1sg1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xu4XVV5L/7vSwAB0YpclCNq1B94QAwpDQEELwEBraCIykUuorYgfSiK16C/Wqu0IGqxerAcDkirciDKUfEUrFIKXiqKQSICKXIxQqyXiEpRuQXG+WPvpGGTZK+dfVlr7nw+z5NnrzXnWHO+e+2ZZH/XGHOMaq0FAAAAumiDfhcAAAAA60qoBQAAoLOEWgAAADpLqAUAAKCzhFoAAAA6S6gFAACgs4RaAAAAOkuoBQAAoLOEWgAAADprw34XsK622mqrNnPmzH6XAQAAwCS49tprf9la23q0dp0NtTNnzszChQv7XQYAAACToKp+3Es7w48BAADoLKEWAACAzhJqAQAA6Kwpvae2qj6Z5MAkv2it7Ty87UNJDkryQJLbkry+tfabqawLAACYHh588MEsXbo09913X79LoUebbLJJtttuu2y00Ubr9PqpnijqH5L8jySfWmXb5UlOaa0tr6oPJjklybumuC4AAGAaWLp0aR73uMdl5syZqap+l8MoWmu56667snTp0jzjGc9Yp2NM6fDj1trXk/xqxLavttaWDz/9dpLtprImAABg+rjvvvuy5ZZbCrQdUVXZcsstx9WzPmj31L4hyZfXtLOqjquqhVW1cNmyZVNYFgAA0BUCbbeM9+c1MKG2qt6TZHmSC9bUprV2TmttTmttztZbj7oGLwAAANPcVN9Tu1pV9boMTSC1b2ut9bseAABgejjz8h9O6PFO3m+Hte6/6667su+++yZJfvazn2XGjBlZ0SF3zTXXZOONN57Qesbr9a9/febPn5/tt98+Z5xxRubPn58keeihh/KiF70o3/jGN/pc4ej6Hmqr6iUZmhjqha213/e7HgAAgHW15ZZbZtGiRUmS973vfdl8883z9re//RFtWmtprWWDDfo/cPb8889Pkixfvjynn376ylA7Y8aMTgTaZIqHH1fVhUmuTvLsqlpaVW/M0GzIj0tyeVUtqqqzp7ImAACAyXbrrbdm5513zpve9KbsuuuuufPOO/OEJzxh5f6LLroof/Inf5Ik+fnPf55DDjkkc+bMydy5c/Ptb3/7Ucc799xz88pXvjIHHHBAnv3sZ+fUU09due+MM87IzjvvnJ133jkf//jHkyT33HNPXvrSl2aXXXbJzjvvnIsvvjhJsvfee2fRokWZP39+7rnnnsyePTvHHHNMli9fvrK+V73qVfnqV7+68vhHHXVULrnkkixfvjxvfetbM3fu3MyaNSvnnntukuQnP/lJ9t5778yePTs777xzvvWtb03wu/lIU9pT21o7YjWbz5vKGgAAAPrhpptuyvnnn5+zzz47y5cvX2O7k046Ke985zuzxx57ZMmSJTnwwANzww03PKrdNddckxtuuCEbb7xxdttttxx44IF54IEHcsEFF+Saa67JQw89lLlz5+aFL3xhFi9enJkzZ+bLXx6al/fuu+9+xLFOP/30nHvuuSt7mVet7/DDD8+CBQuy//7757777svXvva1nHfeeTnnnHOyzTbb5Jprrsn999+fPfbYI/vvv38uvPDCHHTQQXnXu96Vhx56KPfee+9EvH1r1PfhxwAAAOuDZz3rWdltt91Gbfcv//Ivufnmm1c+//Wvf5177703m2666SPaHXDAAdliiy2SJAcffHC++c1v5v7778+rXvWqbLbZZo/YPm/evMyfPz/z58/PQQcdlL322qvnul/2spflbW97Wx588MFceuml2WefffKYxzwmX/3qV7N48eJcdNFFSYaC8i233JLddtstxx9/fO67774cfPDB2WWXXXo+17oQagEAAKbAYx/72JWPN9hgg6w6R+6q67S21nqaVGrkUjhVlTXNu7vjjjtm4cKFueyyy/KOd7wjBx54YN797nf3VPdmm22WvfbaK5dffnkWLFiQ17/+9Svr/MQnPrFyYqxVXXXVVbn00ktz5JFH5pRTTsmRRx7Z07nWRf/vTAYAAFjPbLDBBtliiy1yyy235OGHH84XvvCFlfte/OIX56yzzlr5fMWQ4JG++tWv5je/+U1+//vf55JLLslee+2VF7zgBfnCF76Qe++9N7/97W9zySWX5PnPf35+8pOfZPPNN8/RRx+dt771rfne9773iGNtuOFQf+eahkUffvjhOe+883L11VfnxS9+cZKhnuJPfOITK19z88035957782Pf/zjPPnJT85xxx2XY489Ntddd926v1E90FMLAABMW6MtwdNPH/zgB/OSl7wkT3va07LTTjvl/vvvT5KcddZZOeGEE3L++edn+fLlmTdv3iNC7gp77713Xvva1+a2227L0UcfndmzZydJjjjiiJXDnE844YQ897nPzWWXXZb58+dngw02yMYbb5yzz370/LxvfOMbM2vWrMyZMyef/OQnH7HvJS95SV73utflNa95TTbaaKMkyfHHH5877rhj5Xm32WabXHLJJbniiivyt3/7t9loo42y+eab5zOf+czEvWmrUV1dFnbOnDlt4cKF/S4DAAAYIIsXL86OO+7Y7zIm3bnnnpsbbrghH/3oR/tdyoRY3c+tqq5trc0Z7bWGHwMAANBZhh8DAAB0zIo1bRFqB8OVp/XWbt4pk1sHAABAxxh+DAAAQGcJtQAAAHSWUAsAAEBnuacWAACYvnqdv6ZXPcxzM2PGjDz3uc9d+fyLX/xiZs6cudq2S5YsyYEHHpgbbrhhoipcZwsXLsynPvWpfOxjH8tVV12VjTfeOM973vOSJGeffXY222yzHHPMMX2u8tGEWgAAgAm06aabZtGiRf0uY8zmzJmTOXOGloW96qqrsvnmm68MtW9605v6WdpaGX4MAAAwyZYsWZLnP//52XXXXbPrrrvmW9/61qPa3HjjjZk7d25mz56dWbNm5ZZbbkmSfOYzn1m5/fjjj89DDz30qNfOnDkz73rXuzJ37tzMnTs3t956a5Lkxz/+cfbdd9/MmjUr++67b+64444kyec+97nsvPPO2WWXXfKCF7wgyVCQPfDAA7NkyZKcffbZOfPMMzN79ux84xvfyPve9758+MMfzuLFizN37txHfF+zZs1Kklx77bV54QtfmD/6oz/KAQcckJ/+9KdJko997GPZaaedMmvWrBx++OET+K4OEWoBAAAm0L333pvZs2dn9uzZeeUrX5kk2WabbXL55Zfne9/7XhYsWJCTTjrpUa87++yz8+Y3vzmLFi3KwoULs91222Xx4sVZsGBB/u3f/i2LFi3KjBkzcsEFF6z2vI9//ONzzTXX5MQTT8xb3vKWJMmJJ56YY445Jtdff32OPPLIled9//vfn6985Sv5/ve/ny996UuPOM7MmTPzpje9KSeffHIWLVqU5z//+Sv37bjjjnnggQdy++23J0kWLFiQQw89NA8++GD+/M//PBdffHGuvfbavOENb8h73vOeJMnpp5+e6667Ltdff33OPvvscb67j2b4MQAAwARa3fDjBx98MCeeeOLKYPrDH/7wUa/bc88989d//ddZunRpDjnkkGy//fa54oorcu2112a33XZLMhSYt9lmm9We94gjjlj59eSTT06SXH311fn85z+fJDn66KPzzne+M0my11575dhjj82hhx6aQw45ZEzf36GHHprPfvazmT9/fhYsWJAFCxbk5ptvzg033JD99tsvSfLQQw9l2223TZLMmjUrRx55ZA4++OAcfPDBYzpXL4RaAACASXbmmWfmSU96Ur7//e/n4YcfziabbPKoNq997Wuz++6759JLL80BBxyQc889N621vO51r8tpp40+4VVVrfbx6tqcffbZ+c53vpNLL700s2fPHtM9wIcddlhe85rX5JBDDklVZfvtt88PfvCDPOc5z8nVV1/9qPaXXnppvv71r+dLX/pSPvCBD+TGG2/MhhtOXBQ1/BgAAGCS3X333dl2222zwQYb5NOf/vRq74u9/fbb88xnPjMnnXRSXv7yl+f666/Pvvvum4svvji/+MUvkiS/+tWv8uMf/3i151iwYMHKr3vuuWeS5HnPe14uuuiiJMkFF1yQvffeO0ly2223Zffdd8/73//+bLXVVrnzzjsfcazHPe5xueeee1Z7nmc961mZMWNGPvCBD+Swww5Lkjz72c/OsmXLVobaBx98MDfeeGMefvjh3HnnnZk3b17OOOOM/OY3v8lvf/vbMb13o9FTCwAATF89LMEzFf7sz/4sr3rVq/K5z30u8+bNy2Mf+9hHtVmwYEE+85nPZKONNsqTn/zkvPe9780Tn/jEnHrqqdl///3z8MMPZ6ONNspZZ52Vpz/96Y96/f3335/dd989Dz/8cC688MIkQ5M0veENb8iHPvShbL311jn//POTJO94xztyyy23pLWWfffdN7vssku+9rWvrTzWQQcdlFe/+tW55JJL8vGPf/xR5zrssMPyjne8Iz/60Y+SJBtvvHEuvvjinHTSSbn77ruzfPnyvOUtb8kOO+yQo446KnfffXdaazn55JPzhCc8YULe0xWqtTahB5wqc+bMaQsXLux3GROj17WzBuQvJAAADKrFixdnxx137HcZU27mzJlZuHBhttpqq36Xsk5W93Orqmtba3NGe63hxwAAAHSW4ccAAAAdt2TJ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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + " \n", + "true_positives_NN=output_NN[:,1][np.where(Y_test==1)[0]]\n", + "false_positives_NN=output_NN[:,1][np.where(Y_test==0)[0]]\n", + "\n", + "true_positives_NN=output_NN[:,1][np.where(Y_test[:,1]==1)]\n", + "false_positives_NN=output_NN[:,1][np.where(Y_test[:,0]==1)]\n", + "plt.hist(true_positives_NN,alpha=0.5,bins=80,density=True,label=\"True positives\");\n", + "plt.hist(false_positives_NN,alpha=0.5,bins=80,density=True, label=\"False positives\");\n", + "plt.xlabel(\"NN BDT output\", fontsize='15')\n", + "plt.ylabel(\"Events (a.u.)\", fontsize='15')\n", + "plt.legend()\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/Rphipi/'+PATH+'/fp_vs_tp_NN.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SETTING UP XGBOOST" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n", + " colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n", + " max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n", + " n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n", + " reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n", + " silent=True, subsample=1)" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "PATH=l_flv[l_index]+'/test_'+str(test)+'/XG_'+str(i)\n", + "if not os.path.exists(PATH):\n", + " os.mkdir(PATH)\n", + "# fit model to training data\n", + "model = XGBClassifier()\n", + "\n", + "model.fit(X_train_2, Y_train[:,1])" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "output_XG=model.predict_proba(X_test_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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fl37zOx5YJCZHQOW440oaAncFrSfwcA8MxsPTMG7P/pvwDjn3Bb/WD4FpuMl1g7v3/E3vIQevGchx5v36KoVwB7n3IZTOnEiIpJvlASLiEiaJ4B2eMNaY/AmpPocuNU5t97MYoD6ePdNhvKwv4A3LPU7oKlzblk2dS7D6z3sDBQDNuINY/4HBJKpDniPHnoQL5HdhzeB0YtZ7dQ596n/+KWheI/9ifD3PRe/V9sfVns13iOCngcK4z3S6Sl//WH/cUODgcV495Qaod0NPIPXI1rCP/bWLv3jkfKEc26cfx/yg8D/4vUOP+yce+4MVfky3nl7PkM7/s/MXgGGmdm7zrk9zrkU/7nDffHuHX4Q72+RzXg985elDY8O8mzQ6514SW5v59zGoPjjwDG8ZD8e74uI/3HOTQlqz3z//t5BeI+/2gWMIuhZxng9wt3wZqZOBf6LNzN22mOppuI9cmoE3hc9E/nj3mQRETlHmHMZbycSERHJzMy6ACOccxknNhIRERE5ZygJFhERERERkbChibFEREREREQkbCgJFhERERERkbChJFhERERERETChpJgERERERERCRtKgkVERERERCRsKAkWERERERGRsKEkWERERERERMKGkmAREREREREJG0qCRUREREREJGwoCRYREREREZGwoSRYREREREREwoaSYBEREREREQkbSoJFREREREQkbCgJFhERERERkbChJFhERERERETChpJgERERERERCRtKgkVERERERCRsKAkWERERERGRsKEkWERERERERMKGkmAREREREREJG0qCRUREREREJGwoCRYREREREZGwoSRYREREREREwoaSYBEREREREQkbSoJFREREREQkbCgJFhERERERkbChJFhERERERETChpJgERERERERCRtKgkVERERERCRsKAkWERERERGRsKEkWERERERERMKGkmAREREREREJG0qCRUREREREJGwoCRYREREREZGwoSRYREREREREwoaSYBEREREREQkbSoJFREREREQkbCgJFhERERERkbChJFhERERERETChpJgERERERERCRt5mgSb2RtmtsvMVmSI329ma8xspZmNCIo/ambr/HXNguLN/dg6MxuQl8cgIiIiIiIi5y5zzuVdZWbXAb8CbzrnavqxG4CBQCvn3BEzi3PO7TKzi4HJQF2gLLAQqOrv6gegCbAFWAbc5pz7Ps8ORERERERERM5JBfOyMufcJ2ZWMUP4HuBp59wRv8wuP94OmOLH15vZOryEGGCdc+4nADOb4pdVEiwiIiIiIiLZOhvuCa4KXGtmX5rZYjO70o8nApuDym3xY1nFMzGzXma23F96nYG2i4iIiIiIyDkkT3uCs1AQKAnUB64EpprZhYCFKOsInbiHHNPtnBsLjAUoXbq0S0pKejVXWiwiImHvq6++2uOci83vdpzLSpcu7SpWrJjfzRARkT+JnF6bz4YkeAvwvvNuTl5qZseB0n68fFC5csA2/3VW8SxVrFiR5cuX506LRUQk7JnZxvxuw7lO12YREclNOb02nw3DoWcAjQDMrCpQCNgDzAI6m1lhM6sEVAGW4k2EVcXMKplZIaCzX1ZERERyiZlVM7Ovg5aDZvagmcWY2QIzW+v/LOmXNzN7wX9yw7dmVju/j0FERCSUvH5E0mRgCVDNzLaYWU/gDeBC/7FJU4CuzrMSmIo34dVcoK9zLtU5dwy4D5gHrAKm+mVFREQklzjn1jjnLnfOXQ7UAVKA6cAA4CPnXBXgI/89QAu8L6yrAL2AMXnfahERkRPL69mhb8ti1f9kUX4YMCxEfA4wJxebJiIiIllrDPzonNtoZu2Ahn58IvAx0B/vSQ1v+rc3fWFmJcysjHNue340WEREJCtnw3BoERERObt1Bib7r+PTElv/Z5wfz/HTG0RERPKTkmARERHJkj//Rlvg3RMVDRHL9PSG4McX7t69OzeaKCIiclLOhtmhReRP4ODBg+zatYujR4/md1NETltkZCRxcXEUL148v5tyNmgB/J9zbqf/fmfaMGczKwPs8uPZPdUhIPjxhUlJSSEfcSiSn3Q9Ezk75ea1WUmwiJy2gwcPsnPnThITEylSpAhmoTqERM4NzjkOHTrE1q1bAZQIw238MRQavCcydAWe9n/ODIrfZ2ZTgHrAAd0PLOcaXc9Ezk65fW3WcGgROW27du0iMTGRokWL6g8GOeeZGUWLFiUxMZFdu3adeIM/MTMrCjQB3g8KPw00MbO1/rqn/fgc4CdgHTAOuDcPmyqSK3Q9Ezk75fa1WT3BInLajh49SpEiRfK7GSK5qkiRImE/HNI5lwKUyhDbizdbdMayDuibR00TOSN0PRM5u+XWtVk9wSKSK/SNufzZ6DMtEp70f1/k7JVb/z+VBIuIiIiIiEjYUBIsIgIMGTIEM6NKlSoh11euXBkzY8iQIZnWvf/++zRq1IgSJUpQuHBhqlatyqBBg9izZ89ptad06dKnvH1uaNiwITfffHO+tuFUjB07lhkzZuR3M0RE8s2ECROoU6cOxYoVo2TJklxxxRX069fvjNf78ccfY2asWLEiV/c7f/58nn/++VzdZ+nSpUNe04Nt376dli1bcv7552NmfPzxx7nahtN1Jq93eXkt/f333xkyZAhff/11ntQHSoJFRAKioqJYv349y5cvTxdftmwZGzduJCoqKtM2Dz/8MJ06deLCCy/krbfeYv78+Tz00EP861//4u677z7lttx1113MmzfvlLcPZ0qCRSScPfXUU9x11100a9aM999/nzfffJN27doxa9as/G7aKTsTSXBODBs2jG+++YbJkyezZMkSateunedtyM6fKQkeOnRonibBmhhLRM6YigNm50u9G55udUrbRUdHU7t2baZMmUJSUlIgPmXKFBo1asRXX32Vrvy//vUv/v73v/P666/To0ePQPz666+nV69ezJ8//9QOAChXrhzlypU75e1FRCT3PPr+d/lS71MdLj3pbV566SV69+7N8OHDA7E2bdowePDg3GxaWFi9ejX16tWjZcuWWZZJTU0lNTWVQoUK5WHL5HSpJ1hEJEjnzp2ZOnUq3kS33nPppk6dSufOnTOVfe6556hdu3a6BDhNREQELVq0yLKe/fv3c9ddd1G2bFmioqKoUKFCup7jUMOhv/32W6666iqioqK45JJLmDNnDklJSXTr1i1Qplu3biQlJbFgwQJq1apFdHQ011xzDStXrky3r1GjRnHllVdy/vnnEx8fT5s2bVi3bl2OzlFGM2fOJCkpiaioKBISEkhOTg7M3Lho0SLMLFP9P//8M4UKFeL1118PxD799FOuv/56ihYtSqlSpbj77rv55ZdfAusnTJiAmfHdd9/RpEkToqOjqV69Ou+//8fTexo2bMhXX33FxIkTMTPMjAkTJgAwa9Ys6tSpQ3R0NCVLlqRevXosXrz4lI5ZRORstX//fhISEjLFTzSh0ImuSwArVqygVatWFCtWjGLFitGpUyd27NiR7X6PHz/O008/TeXKlQO3DE2cODFTuenTp1O3bl2KFClCqVKlaNmyJRs3bmTIkCGMGjWKjRs3Bn6vB1/3TnTtAPjkk0+47LLLiIqKok6dOnz++efZthm88/XRRx8xffp0zIyKFSsCf1xnZ8yYwSWXXEJUVBRffvklAF9//TWNGzemaNGilCxZkttvv52dO3cG9rlhwwbMjClTptC9e3eKFy9OuXLlePvttwEYMWIEZcuWJTY2lv79+3P8+PEs25fd9Q7gtdde45JLLqFw4cJccMEFjBgxIt32K1eupHnz5sTExBAdHU2NGjV4+eWXc7TvjJ566ikqV65MVFQU8fHxNG/ePN3nYt++ffTu3Zv4+HiioqK46qqrAucMoFixYgB07949UN+GDRuy/sfJBUqCRUSCdOjQgZ07d/Lpp58C8J///Ifdu3fTvn37dOWOHj3K559/TvPmzU+pnn79+vHpp5/y3HPPMW/ePIYPH57tHygpKSk0a9aMQ4cOMXnyZAYNGsRDDz3Epk2bMpXdtGkTf/nLXxg4cCCTJ09m165d3HLLLYHEHmDLli3cd999zJw5k3HjxpGamsrVV1/NgQMHTuo4pk6dSocOHahbty6zZs1i8ODBjB07lkcffRTwesXLlCnD1KlT0203ffp0gMB5/eyzz2jcuDEJCQlMmzaN559/njlz5tC9e/dMdXbp0oW2bdsyffp0qlSpQufOndmyZQsAo0ePpnr16rRs2ZIlS5awZMkSWrVqxY8//sjNN99Mo0aN+Ne//sWkSZNo3bo1+/btO6njFRE529WuXZsXX3yRiRMnsnfv3hxvd6Lr0rp167j66qs5fPgwb731FhMmTGDlypW0adMm3fUlo/vvv58nn3ySXr16MXv2bNq3b0+PHj344IMPAmXeeustOnTowEUXXcTUqVMZP348VatWZffu3dx111106dKFhISEwO/1xx57DMjZtWPbtm20aNGCmJgYpk2bRu/evbn99ttJSUnJ9nwsWbKEK664ghtuuIElS5YErlvgJbPJyck8+uijzJkzh0qVKrF7924aNmxISkoK//znP3nxxRdZvHgxTZo04ffff0+37/79+1OmTBnee+89rr32Wrp27crDDz/M0qVLeeONN3jwwQcZMWJEpmtnsKyudwAjR47knnvu4aabbuKDDz7gnnvu4bHHHuOll14KbN+2bVsiIiJ4++23mTVrFvfff3/gy4Ps9p3Rm2++yfDhw+nXrx/z5s1jzJgxVK5cmd9++w2AI0eOcOONN7JgwQJGjhzJjBkziI2N5cYbbwwkyv/+978BGDRoUKC+MmXKZPvvc7o0HFpEJEiJEiVo3rw5U6ZM4dprr2XKlCk0b96cEiVKpCu3d+9ejhw5QoUKFU6pnqVLl9K3b19uvfXWQOx//ud/siw/fvx49u7dy/Lly0lMTATgoosuol69epnK7tu3j88++ywwydfx48dp3749a9asoXr16oDXi50mNTWVJk2aEBcXx8yZM7nzzjtzdAzOOf7yl79w5513Mnr06EC8cOHC9O3bl0cffZRSpUrRqVMn3nnnHYYOHRoo884779C0aVNiYmIAGDBgAFdddRXvvPNOoExiYiKNGzdmxYoV1KxZMxB/6KGHAr3vderUIT4+ng8++IA+ffpw8cUXEx0dTWxsLPXr1w9ss3jxYooVK8bIkSMDseyGt4mInKtefvllbrrpJrp164aZUaNGDTp27MgjjzxC8eLFs9zuRNeloUOHkpCQwIcffhgY+lurVi2qV6/OnDlzQiZJ69atY8yYMYwfP56uXbsCcOONN7J9+3aGDh1K69atOX78OAMGDKB9+/ZMnjw5sG3btm0Dr8uUKUPhwoXT/V6HnF07nn/+eaKiopg9ezZFixYFvNufsrvmAtSvX5/ixYsTExOTqd69e/eycOFCLr/88nRtAZg3b17gPFetWpV69erx3nvvcdtttwXKNmrUKDBcvV69ekybNo1Zs2axevVqIiIiaN68OTNnzmT69OkhR6IBWV7vDh48yNChQxk0aFBgCHyTJk1ISUnhySef5J577uHnn3/mp59+YsaMGVx6qTfkvnHjxifcdyhLly6ladOm3HvvvYFYhw4dAq/ffvttVqxYwcqVKwN/l9x4441Uq1aNUaNGMXLkSK688krA+7vmRPXlFvUEi4hk0LlzZ6ZNm8aRI0eYNm1alhcgOPXn1V1++eWMHDmS0aNH88MPP5yw/LJly6hTp04gAQaoW7cu8fHxmcpWrFgx3SzXF198MUCgtxTgiy++oEmTJpQqVYqCBQtStGhRfv311xy1Jc0PP/zApk2buOWWWzh27FhgadSoEYcPHw7MDnrrrbeyZs0avvnmGwD27NnDv//978AfWikpKSxZsiTTfq655hoiIyMz3YvdtGnTwOtSpUoRFxeX7thCufTSSzlw4ABdu3Zl/vz5gW+oRUT+bGrVqsWqVauYNWsW9957L845/va3v5GUlMSvv/6a5XYnui4tXLiQ9u3bU6BAgcDv6UqVKlGxYsVME0qm+eijjyhQoADt27dP9/u9cePGfP3116SmprJmzRq2bdsWcuRPdnJ67Vi6dClNmjQJJMCQPkk7FYmJiekS4LR6mjZtmu6Lhrp161KxYsXA6LI0wQln8eLFiY2N5frrryciIiIQr1y5Mlu3bj3pti1ZsoTffvuNTp06Zbo279y5ky1bthATE0P58uXp06cP77zzDrt27TrpetJcfvnlzJkzh8GDB7N06VJSU1PTrV+4cCF16tShUqVKgbaAN1Isq89NXlASLHmq4oDZmRaRs03btm359ddfGThwIL/99htt2rTJVKZUqVIULlw45HDknHjppZe46aabeOKJJ6hWrRpVqlRhypQpWZbfsWMHsbGxmeKhYhl7rdO+sT98+DDgDZdu2rQpzjleffVVPvvsM5YtW0ZcXFygTE6kPQKqZcuWREZGBpZKlSoBsHnzZgAaNGhAhQoVAt/Uv/feexQsWJCbbroJ8O4PTk1N5d577023n8KFC3P06NHAfrI7vhO1u1q1asycOZOffvqJli1bUrp0abp06cLu3btzfLwiEiZ+T8m8HD+W3606KYULF6ZNmza89NJLfP/997z22musXbs23TwMGZ3ourRnzx6eeeaZdL+nIyMj+emnnzL9ng7eJjU1lfPPPz/dNt26dePYsWNs3749MGT7ZIe/5vTasWPHDuLi4tJtW6RIEc4777yTqi9YqC+gt2/fHjIeHx+f6dabUNexU7m2hZJ2bb7kkkvSnZcbbrgB8K7NBQoUYP78+SQkJNCjRw8SEhK49tpr+e9//3vS9fXo0YPhw4czdepU6tWrR3x8PI899lggGd6zZw9ffPFFps/N+PHjs/zc5AUNhxYRySA6OprWrVvz3HPP0alTJ6KjozOViYyM5Oqrr2bevHk8+eSTJ11HiRIleOGFF3jhhRf49ttvGTFiBLfffju1atUK9NwGS0hIYM2aNZnip5LEzZ07l5SUFGbOnBk4tmPHjp30/bFpQ5nHjh3LFVdckWl9WjJsZtxyyy288847DB8+nHfeeYcWLVoEJsIoUaJE4BnMoYYoly1b9qTalZVWrVrRqlUrDhw4wOzZs3nwwQe5//77s/3yQUTkz6Bnz54kJyezevXqLMuc6LoUExND+/btueuuuzJtm9Vz7WNiYihYsCCfffYZBQpk7nuLi4sL3Ie6ffv2kzqmnF47EhISMvV0Hjp0KNte8RMJNQqsTJkyIXtUd+7cSZ06dU65rpOVdm3+4IMPQibl1apVA6B69eq89957HD16lP/85z/079+fVq1asWXLlpD/VlkpUKAADz30EA899BCbN29m0qRJDBw4kMTERPr06UNMTAxJSUmMGTMm07aFCxc+xaM8fUqCRURCuOeeezhy5Ah9+vTJssyDDz5I27ZtmThxYuBepzTHjx9n/vz5OZo4q1atWowcOZJJkyaxevXqkEnwlVdeyaRJk9gXi0+xAAAgAElEQVS6dWtgSPTSpUvTzTqZU4cOHaJAgQIULPjHJWDq1KmBIUo5Va1aNRITE9mwYcMJn4ncuXNnnn32WT744AMWL16c7r6v6Oho6tevz5o1a3j88cdP7mBCONG35+effz5dunRh8eLFLFmy5LTrExE5m+zatStTz+fu3bs5cOBAyKQolFDXpbT7bOvUqZPjW4EaNWpEamoqBw4coEmTJiHLpF1LJk6cGHLkFYT+vZ7Ta8eVV17JG2+8QUpKSmBIdPBTBXJLvXr1GDNmDL/88kvgS95ly5axYcMGrrnmmlyvD0KflwYNGlCkSBG2bduW5WRWwSIjI2nUqBH9+vWjS5cu7N+/n5iYmFPqiS5fvjwDBgxg/PjxfP/994A39Hv+/PlUqFAh0+cy+DiAU+r5PlVKgkVEQmjYsCENGzbMtkybNm3o168fPXv25LPPPqNdu3acd955rF69mldeeYWKFStmmQRfc801tG/fnpo1a2JmjBs3jujoaOrWrRuyfPfu3XnyySdp3bo1gwcP5tChQwwePJjY2NiT+sYW/vijpHv37vTs2ZOVK1fy7LPPZhqKdSIFChRg1KhR3HHHHRw8eJAWLVpQqFChwGQb06ZNC/zBUadOHSpXrkyvXr0oUqQIrVu3TrevESNG0LhxYwoUKMDNN99MsWLF2LRpE7Nnz2bYsGFUrVo1x+2qXr068+bNY968eZQqVYpKlSoxbdo0lixZQvPmzSlbtixr167l3XffzfEkYCIi54pLL72Udu3a0bRpU+Li4ti4cSPPPvssRYsWzfSFbbATXZeGDBlC3bp1adWqFT169KB06dJs3bqVBQsW0K1bt5DXzGrVqtGnTx86d+5McnIySUlJHD58mJUrV/LDDz/w2muvUaBAgUCv8+23385tt92GmfHvf/+b2267jaSkJKpXr87OnTuZMGECNWvWpHTp0lSsWDFH144HH3yQl19+mdatW9OvXz+2bdvGU089RZEiRXL1vPfr148xY8bQrFkz+vfvz6+//sqAAQO49NJL6dixY67WlSbU9a5UqVIMGTKE//3f/2Xjxo1cd911HD9+nB9++IFFixYxffp0vv32Wx555BFuvfVWLrzwQn7++WeeeeYZLrvsskBPclb7zqh3796BycPOP/98Fi1axNq1a3nmmWcAuPPOO3nllVdo2LAhjzzyCBdeeCF79+5l6dKlJCQk8NBDD1GoUCEqVarE1KlTqVmzJlFRUdSqVeuMPntZSbCIyGkYNWoUV111FS+99BJdunTh0KFDVKxYkbZt2/LII49kuV2DBg2YMGECGzZsICIigiuuuIIPP/yQcuXKhSxftGhR5s6dyz333MOtt94auPgnJydnO9tnKJdeeinjx49n6NChTJ8+ncsuu4x333033YygOXXrrbdSvHhxhg8fzhtvvEFERAQXXnghrVu3znTxuvXWWxk2bBidO3dON0EJeH98ffLJJwwePJg77riD1NRULrjgApo3b57jnos0gwYNCkzYdfDgQcaPH0+tWrWYNWsW/fr1Y9++fZQpU4a7776bJ5544qSPWUTkbPb4448zc+ZMHnjgAfbt20dCQkJgBuW021RCOdF1qWrVqnzxxRcMGjSIXr16cejQocBMzJUrV85yvy+//DJVq1Zl3LhxPP744xQvXpyLL76Ynj17Bsp06dKFqKgohg0bxs033xzo5U2b9+KWW25h0aJFJCcns3v3brp27cqECRNydO1ITExkzpw5PPDAA3Ts2JEaNWrw9ttv065du9w43QGxsbEsWrSIhx9+mNtuu41ChQrRsmVLnnvuuTOWzIW63nXr1o3k5GTKli3Lc889x6hRo4iKiqJq1aqB63xCQgLx8fEMGzaMbdu2UaJECW644YZA4prdvjNq0KAB48aN49VXX+Xw4cNUrlyZcePGBeb9iIqKYtGiRTz++OMMHjyYnTt3EhcXR926ddPNAP7KK6/wyCOPcOONN3LkyBHWr18feDbzmWDZPdfrzyQpKcnl5wxk4gk1EdaGp088VEPObqtWraJGjRr53Yyws379eqpWrcrYsWNPelZNyZnsPttm9pVzLimPm/SnomuznG1WrVpFjYsuCL2yUNHQcRHJU7lxbVZPsIjIOeKpp56ibNmyXHDBBWzatImnnnqK2NjYMzbMSkREROTPSEmwiMg5wswYOnQo27Zto3Dhwlx77bU8++yzJz0cWkRERCScKQkWETlHDBgwgAEDBuR3M0RERETOaSc3paiIiIiIiIjIOUxJsIiIiIiIiIQNJcEikivCZaZ5CR/6TIuIiPw5KQkWkdMWGRnJoUOH8rsZIrnq0KFDREZG5nczREREJJcpCRaR0xYXF8fWrVtJSUlR75mc85xzpKSksHXrVuLi4vK7OSIiIpLLNDu0iJy2tEf0bNu2jaNHj+Zza0ROX2RkJPHx8Xr8lIiIyJ+QkmARyRXFixdXwiAiIiIiZz0NhxYRERER+RMwsxMuH3/8ca7U9f333zNkyBB+/fXXXNnficyZM4eXXnopx+U3bNjAeeedx+bNmwOxn376iS5dulC+fHmioqKoUKEC7du3Z8mSJafVtoSEhHTnOC4ujjZt2rBy5cp05Xr27Enfvn1Pqy7JHeoJFhERERHJzvZvIDIq7+ste8VJFQ9O5g4dOkSjRo0YNGgQrVq1CsQvvvjiXGna999/z9ChQ+nTpw/nnXderuwzO3PmzGHhwoXcd999OSo/dOhQOnXqRPny5QHYvXs39erVo1KlSowcOZL4+HjWr1/PjBkz+PLLL2nQoMFpta9bt2707t0b5xxbt27lySefpFmzZqxatYpixYoBkJyczOWXX07//v2pUKHCadUnp0dJsIiIiIjIn0D9+vUDr9N6aC+66KJ08XCwd+9e/vnPf7Jw4cJAbMqUKezfv5958+ZRsmRJAG644QZ69OiR7aSec+fO5aabbuLw4cPZ1pmYmJjuPF944YXUqVOHZcuW0ahRIwCqVatGnTp1ePXVVxk2bNjpHKKcJg2HFhEREREJM+vXr6dTp06UKFGC6OhoWrVqxY8//hhY75zjiSee4MILLyQqKoqEhARatmzJ3r17mTt3Lp06dQKgTJkymBnVq1fPsq5vvvmGJk2aULJkSc477zwuueQSxo0bl67MtGnTqF27NlFRUZQtW5aBAweSmpoKwIABA3j55ZdZs2ZNYMhxnz59sqxv8uTJxMTEcM011wRi+/fvp0iRIpx//vmZyptZzk7aSUjr/c04YWjHjh156623cr0+OTnqCRYRERERCSO7du3i6quvJjExkddee41ChQoxbNgwmjZtyqpVqyhUqBDjxo1j1KhRjBgxgho1arB7924WLlzIoUOHaNCgAcOHD+evf/0rs2fPJiYmhiJFioSs6/jx47Rq1YqkpCT++c9/UqhQIVatWsWBAwcCZd588026d+/Offfdx9NPP82aNWv461//ipnx5JNP0rdvX3788UeWLVvGlClTAIiPj8/y+D766CPq16+fLrmtXbs2v/zyC926daNfv35cdtlluZr8Ouc4duwYAFu3bmXAgAHExcVx9dVXpyt31VVX0a9fP9asWUO1atVyrX45OUqCRURERETCyMiRIzl+/DgLFy4M9Iw2aNCASpUq8dZbb9GzZ0+WLl1K69at6d27d2C7jh07Bl5XqVIF8JLLhISELOvatm0bW7duZdGiRYFtGjduHFifmppK//796dWrF//4xz8AaNq0KRERESQnJ5OcnEz58uWJj48nKioqR0O7v/rqK7p27Zou1qpVK+69915Gjx7NW2+9RfHixWnatCl9+/alYcOGgXLOuUAPNHhJPBBIcMHrOY6IiEi3/+HDhzN8+PDA+1KlSjFjxoxM90tfdtllACxdulRJcD7ScGgRERERkTCycOFCmjdvTnR0NMeOHePYsWOULFmSyy67jOXLlwNw+eWXM2PGDJ544gmWL18eSAZPVnx8PAkJCdx99928++677N69O936FStWsGPHDjp16hRoy7Fjx2jUqBG//fYbq1atOuk6d+7cSenSpTPF04ZUP/PMM1x77bXMnj2bRo0aMWHChECZV199lcjIyMDSqlUrjhw5ki4WHR2dad89evRg2bJlLFu2jLlz59KsWTPatWuXqf1RUVFER0ezY8eOkz4uyT1KgkVEREREwsiePXuYOHFiusQuMjKSzz//PPBIoXvuuYfBgwczadIkrrzyShISEhg6dOhJJ8ORkZEsWLCAEiVK0LVrVxISEmjYsCHfffddoC3g9Q4Ht6VGjRoA6R5xlBOpqakcPXqUwoULh1xftWpVkpOT+eCDD1i/fj2XXHIJjz76aGB9x44dA8nssmXLeOGFFyhUqFC62Oeff55pv2XKlCEpKYmkpCSaNWvGW2+9RWxsbMgJsAoXLnzCibbkzNJwaBERERGRMBITE0P9+vXp379/pnVpw6ODhyNv3LiRN998k8GD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.suptitle('S/B selection from XGBoost', fontsize='15')\n", + "Ds_mass_MC =[MC_Ds_sig_dict[\"Ds_ConsD_M\"][i][0]/1000 for i in range(m_s)]\n", + "Dplus_mass_MC =[MC_Dplus_sig_dict[\"Dplus_ConsD_M\"][i][0]/1000 for i in range(m_plus)]\n", + "XG_selected = X_dict[i][np.argmax(output_XG,1).astype(np.bool)]\n", + "Ds_mass_sel_XG = XG_selected[:,dim-1]/1000\n", + "Ds_mass_train_XG =X_dict[i][:,dim-1:dim]/1000\n", + "\n", + "plt.subplot(1,2,1)\n", + "plt.hist(Ds_mass_MC+Dplus_mass_MC,bins=70, label='MC signal events');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "plt.subplot(1,2,2)\n", + "\n", + "plt.hist(Ds_mass_sel_XG,alpha=0.6,bins=70, label='S selected from test set');\n", + "plt.hist(Ds_mass_train_XG,alpha=0.2,bins=70, label='Test set (S+B)');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "fig=plt.gcf();\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/Rphipi/'+PATH+'/D_s_XG.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA68AAAHoCAYAAACmWtkUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XucnWV5L/zfRQBB0XoAlBYxasENxRBpCCgoBgR0ixZREUQQtRu026J4DO1u66kvigfc+mLZbJTWihClVXhFq6mChwpiUKQg5SBGDmpFVApyDNzvH2slDpNJsoasWfNM5vv9fNZnZta653mutfKY+OO6n/uu1loAAACgyzaa7gIAAABgXYRXAAAAOk94BQAAoPOEVwAAADpPeAUAAKDzhFcAAAA6T3gFAACg84RXAAAAOk94BQAAoPM2nu4C1mXLLbdsc+fOne4yAAAAGLJLLrnkl621rQYZ2/nwOnfu3Cxbtmy6ywAAAGDIquong441bRgAAIDOE14BAADoPOEVAACAzuv8Pa8AAADj3Xvvvbnxxhtz1113TXcpDGCzzTbLtttum0022eRBH0N4BQAAZpwbb7wxD3/4wzN37txU1XSXw1q01nLLLbfkxhtvzBOf+MQHfRzThgEAgBnnrrvuymMe8xjBdQaoqjzmMY9Z7y658AoAAMxIguvMMYw/K+EVAACAznPPKwAAMOOdtPTqoR7vuP12WOvrt9xyS/bdd98kyc9//vPMmTMnW221VZLk4osvzqabbjrUetbXq171qixevDjbb799TjzxxCxevDhJct999+XZz352vvnNb05zhesmvAIAAEzSYx7zmFx66aVJkne84x3ZYost8pa3vOUBY1praa1lo42mf8Lr6aefniRZsWJF3vve964Kr3PmzJkRwTUxbRgAAGBorr322uy888557Wtfm1133TU33HBDHvnIR656/ayzzsqf/umfJkn+8z//MwcffHAWLFiQhQsX5qKLLlrteKeddlpe9KIX5YADDshTnvKUvOc971n12oknnpidd945O++8cz760Y8mSW677bY873nPyy677JKdd945Z599dpJkr732yqWXXprFixfntttuy/z583PkkUdmxYoVq+p78YtfnK985Surjv+KV7wi55xzTlasWJE3velNWbhwYebNm5fTTjstSXLTTTdlr732yvz587Pzzjvn29/+9pA/zQfSeQUAABiiH/7whzn99NNzyimnZMWKFWscd+yxx+Ztb3tb9thjjyxfvjwHHnhgLr/88tXGXXzxxbn88suz6aabZrfddsuBBx6Ye+65J2eccUYuvvji3HfffVm4cGH23nvvXHnllZk7d26+9KUvJUluvfXWBxzrve99b0477bRVXeOx9R166KFZsmRJ9t9//9x11135+te/no9//OM59dRTs/XWW+fiiy/O3XffnT322CP7779/zjzzzLzgBS/I29/+9tx333258847h/HxrZHwCgAAMERPfvKTs9tuu61z3L/+67/mqquuWvXzr3/969x5553ZfPPNHzDugAMOyKMe9agkyUEHHZRvfetbufvuu/PiF784D33oQx/w/KJFi7J48eIsXrw4L3jBC7LnnnsOXPfzn//8vPnNb869996b8847L/vss08e8pCH5Ctf+UquvPLKnHXWWUl6gfiaa67JbrvtlmOOOSZ33XVXDjrooOyyyy4Dn+vBEF4BAACG6GEPe9iq7zfaaKO01lb9PHav09baQIs7jd9mpqoecMyxdtxxxyxbtixf/OIX89a3vjUHHnhg/uIv/mKguh/60Idmzz33zNKlS7NkyZK86lWvWlXnxz72sVULVI11wQUX5Lzzzsvhhx+e448/PocffvhA53ow3PMKAAAwRTbaaKM86lGPyjXXXJP7778/n/vc51a99pznPCcnn3zyqp9XTuUd7ytf+Up+85vf5I477sg555yTPffcM8961rPyuc99LnfeeWduv/32nHPOOXnmM5+Zm266KVtssUWOOOKIvOlNb8r3vve9Bxxr4417/cs1TWc+9NBD8/GPfzwXXnhhnvOc5yTpdX4/9rGPrfqdq666KnfeeWd+8pOf5HGPe1yOPvroHHXUUfn+97//4D+oAei8AgAAM966traZTu973/vy3Oc+N9ttt1122mmn3H333UmSk08+Oa973ety+umnZ8WKFVm0aNEDwuxKe+21V17+8pfnRz/6UY444ojMnz8/SXLYYYetmp78ute9Lk996lPzxS9+MYsXL85GG22UTTfdNKeccspqx3vNa16TefPmZcGCBfnEJz7xgNee+9zn5pWvfGVe+tKXZpNNNkmSHHPMMbn++utXnXfrrbfOOeeck69+9av50Ic+lE022SRbbLFFPvWpTw3vQ5tArand3BULFixoy5Ytm+4yAACADrnyyiuz4447TncZU+60007L5Zdfng9/+MPTXcp6m+jPrKouaa0tGOT3TRsGAACg80wbBgAA6KiVe8IivHbP+ScMNm7R8VNbBwAAQIeYNgwAAEDnCa8AAAB0nvAKAABA57nnFQAAmPkGXTtmUAOsMTNnzpw89alPXfXz5z//+cydO3fCscuXL8+BBx6Yyy+/fFgVPmjLli3LJz/5yXzkIx/JBRdckE033TTPeMYzkiSnnHJKHvrQh+bII4+c5ipXJ7wCAAA8CJtvvnkuvfTS6S5j0hYsWJAFC3pbq15wwQXZYostVoXX1772tdNZ2lqZNgwAADAky5cvzzOf+czsuuuu2XXXXfPtb397tTFXXHFFFi5cmPnz52fevHm55pprkiSf+tSnVj1/zDHH5L777lvtd+fOnZu3v/3tWbhwYRYuXJhrr702SfKTn/wk++67b+bNm5d99903119/fZLks5/9bHbeeefssssuedaznpWkF1gPPPDALF++PKecckpOOumkzJ8/P9/85jfzjne8Ix/4wAdy5ZVXZuHChQ94X/PmzUuSXHLJJdl7773zx3/8xznggAPys5/9LEnykY98JDvttFPmzZuXQw89dIifao/wCgAA8CDceeedmT9/fubPn58XvehFSZKtt946S5cuzfe+970sWbIkxx577Gq/d8opp+QNb3hDLr300ixbtizbbrttrrzyyixZsiT/9m//lksvvTRz5szJGWecMeF5H/GIR+Tiiy/O61//+rzxjW9Mkrz+9a/PkUcemcsuuyyHH374qvO+613vype//OX84Ac/yLnnnvuA48ydOzevfe1rc9xxx+XSSy/NM5/5zFWv7bjjjrnnnnty3XXXJUmWLFmSQw45JPfee2/+/M//PGeffXYuueSSvPrVr85f/uVfJkne+9735vvf/34uu+yynHLKKev56a7OtGEAAIAHYaJpw/fee29e//rXrwqgV1999Wq/9/SnPz1/+7d/mxtvvDEHH3xwtt9++3z1q1/NJZdckt122y1JLxhvvfXWE573sMMOW/X1uOOOS5JceOGF+ed//uckyRFHHJG3ve1tSZI999wzRx11VA455JAcfPDBk3p/hxxySD7zmc9k8eLFWbJkSZYsWZKrrroql19+efbbb78kyX333ZdtttkmSTJv3rwcfvjhOeigg3LQQQdN6lyDEF4BAACG5KSTTspjH/vY/OAHP8j999+fzTbbbLUxL3/5y7P77rvnvPPOywEHHJDTTjstrbW88pWvzAknrHvhqaqa8PuJxpxyyin5zne+k/POOy/z58+f1D26L3vZy/LSl740Bx98cKoq22+/ff793/89f/RHf5QLL7xwtfHnnXdevvGNb+Tcc8/Nu9/97lxxxRXZeOPhRU7ThgEAAIbk1ltvzTbbbJONNtoo//iP/zjhfavXXXddnvSkJ+XYY4/NC1/4wlx22WXZd999c/bZZ+cXv/hFkuRXv/pVfvKTn0x4jiVLlqz6+vSnPz1J8oxnPCNnnXVWkuSMM87IXnvtlST50Y9+lN133z3vete7suWWW+aGG254wLEe/vCH57bbbpvwPE9+8pMzZ86cvPvd787LXvayJMlTnvKU3HzzzavC67333psrrrgi999/f2644YYsWrQoJ554Yn7zm9/k9ttvn9Rnty46rwAAwMw3wNY2o/Bnf/ZnefGLX5zPfvazWbRoUR72sIetNmbJkiX51Kc+lU022SSPe9zj8td//dd59KMfnfe85z3Zf//9c//992eTTTbJySefnCc84Qmr/f7dd9+d3XffPffff3/OPPPMJL3Fkl796lfn/e9/f7baaqucfvrpSZK3vvWtueaaa9Jay7777ptddtklX//611cd6wUveEFe8pKX5JxzzslHP/rR1c71spe9LG9961vz4x//OEmy6aab5uyzz86xxx6bW2+9NStWrMgb3/jG7LDDDnnFK16RW2+9Na21HHfccXnkIx85lM90pWqtDfWAw7ZgwYK2bNmy6S5jdAbdn6oj/+MEAIDpcOWVV2bHHXec7jJGbu7cuVm2bFm23HLL6S5l0ib6M6uqS1prCwb5fdOGAQAA6DzThgEAAGaI5cuXT3cJ00bnFQAAmJG6fgskvzOMPyvhFQAAmHE222yz3HLLLQLsDNBayy233DLhtkGTMfJpw1W1PMltSe5LsmLQm3MBAABW2nbbbXPjjTfm5ptvnu5SGMBmm22Wbbfddr2OMV33vC5qrf1yms4NAADMcJtsskme+MQnTncZjJBpwwAAAHTedITXluQrVXVJVR090YCqOrqqllXVMtMAAAAAmI7wumdrbdckz0vyP6vqWeMHtNZOba0t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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "true_positives_XG=output_XG[:,1][np.where(Y_test[:,1]==1)]\n", + "false_positives_XG=output_XG[:,1][np.where(Y_test[:,0]==1)]\n", + "plt.hist(true_positives_XG,alpha=0.5,bins=80,density=True,label=\"True positives\");\n", + "plt.hist(false_positives_XG,alpha=0.5,bins=80,density=True, label=\"False positives\");\n", + "plt.legend()\n", + "plt.xlabel(\"XGBoost BDT output\", fontsize='15')\n", + "plt.ylabel(\"Events (a.u.)\", fontsize='15')\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/Rphipi/'+PATH+'/tp_vs_fp_XG.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pAUC from NN 0.8580749753611944\n", + "pAUC from XG Boost 0.8659139890168011\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "threshold_range=np.linspace(0.0,1.,num=30)\n", + "sig_eps_vals_XG=[sig_eff(true_positives_XG,threshold_range[i]) for i in range(len(threshold_range))]\n", + "bkg_eps_vals_XG=[bkg_eff(false_positives_XG,threshold_range[i]) for i in range(len(threshold_range))]\n", + "if task=='TEST': \n", + "\n", + " \n", + " sig_eps_vals_NN=[sig_eff(true_positives_NN,threshold_range[i]) for i in range(len(threshold_range))]\n", + " bkg_eps_vals_NN=[bkg_eff(false_positives_NN,threshold_range[i]) for i in range(len(threshold_range))]\n", + " \n", + " plt.plot(threshold_range,threshold_range, 'black', linestyle='dashed')\n", + " plt.plot(bkg_eps_vals_NN,sig_eps_vals_NN, 'r', label=\"NN ROC Curve\")\n", + " pAUC_NN=roc_auc_score(Y_test,output_NN)\n", + " print(\"pAUC from NN {0}\".format(pAUC_NN))\n", + "\n", + "plt.plot(threshold_range,threshold_range, 'black', linestyle='dashed')\n", + "plt.plot(bkg_eps_vals_XG,sig_eps_vals_XG,'b',label=\"XG Boost ROC Curve\")\n", + "plt.xlabel(\"Background selection efficiency\", fontsize='15')\n", + "plt.ylabel(\"Signal selection efficiency\", fontsize='15')\n", + "pAUC_XG=roc_auc_score(Y_test,output_XG)\n", + "plt.text(0.69,0.1,\"NN AUC {0:.4g}\\n \\n XGBoost AUC {1:.4g}\\n\".format(pAUC_NN,pAUC_XG), bbox=dict(boxstyle=\"round\", facecolor='blue', alpha=0.10), horizontalalignment='center', verticalalignment='center',fontsize='15')\n", + "plt.legend()\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(8,8)\n", + "\n", + "print(\"pAUC from XG Boost {0}\".format(pAUC_XG))\n", + "plt.savefig('/home/hep/davide/Rphipi/mu/test_'+str(test)+'/roc_comparison_'+str(i)+'.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "# save XGBOOST model to file\n", + "pickle.dump(model, open(PATH+\"/XG_\"+str(i)+\"_.pickle.dat\", \"wb\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/BDT_select.ipynb b/BDT_select.ipynb new file mode 100644 index 0000000..1effbdf --- /dev/null +++ b/BDT_select.ipynb @@ -0,0 +1,366 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "import os\n", + "import pickle\n", + "import math\n", + "\n", + "trunc_normal= tf.truncated_normal_initializer(stddev=1)\n", + "normal = tf.random_normal_initializer(stddev=1)\n", + "\n", + "from xgboost import XGBClassifier\n", + "from architectures.data_processing import *\n", + "from architectures.utils.toolbox import *\n", + "from architectures.DNN import *" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "l_index=1\n", + "l_flv=['e','mu']\n", + "mother_ID=[\"Ds\",\"Dplus\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# DATA LOADING & PREPROCESSING" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "with open('/disk/lhcb_data/davide/Rphipi/NN_for_selection/'+l_flv[l_index]+l_flv[l_index]+'/'+'data_for_NN_'+l_flv[l_index]+l_flv[l_index]+'.pickle', 'rb') as f:\n", + " data_dict=pickle.load(f, encoding='latin1')\n", + "data_dict[\"Ds_ENDVERTEX_CHI2\"]=data_dict[\"Ds_ENDVERTEX_CHI2\"]/data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "data_dict[\"Ds_OWNPV_CHI2\"]=data_dict[\"Ds_OWNPV_CHI2\"]/data_dict[\"Ds_OWNPV_NDOF\"]\n", + "data_dict[\"Ds_IPCHI2_OWNPV\"]=data_dict[\"Ds_IPCHI2_OWNPV\"]/data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "del data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "del data_dict[\"Ds_OWNPV_NDOF\"]\n", + "\n", + "data_dict[\"phi_ENDVERTEX_CHI2\"]=data_dict[\"phi_ENDVERTEX_CHI2\"]/data_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "#data_dict[\"phi_OWNPV_CHI2\"]=data_dict[\"phi_OWNPV_CHI2\"]/data_dict[\"phi_OWNPV_NDOF\"]\n", + "data_dict[\"phi_IPCHI2_OWNPV\"]=data_dict[\"phi_IPCHI2_OWNPV\"]/data_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "\n", + "del data_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "#del data_dict[\"phi_OWNPV_NDOF\"]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "task='TEST'\n", + "\n", + "test=0\n", + "i=np.random.randint(5)\n", + "PATH=l_flv[l_index]+'/test_'+str(test)+'/NN_'+str(i)\n", + "\n", + "with open(PATH+'/variables_used.pkl', 'rb') as f: \n", + " branches_needed = pickle.load(f)\n", + " \n", + "#Number of input features\n", + "m=data_dict[\"Ds_ConsD_M\"].shape[0]\n", + "branches_needed.pop()\n", + "dim=len(branches_needed)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = extract_array(data_dict, branches_needed, dim, m)\n", + "\n", + "data_mean=data.mean(axis=0)\n", + "data_1=data-data_mean\n", + "data_std=data_1.std(axis=0)\n", + "data_2=data_1/data_std\n", + "data_2.std(axis=0)\n", + "#data_2=data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NN SELECTION" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "with open(PATH+'/hyper_parameters.pkl', 'rb') as f: \n", + " hyper_dict = pickle.load(f)\n", + " #for key, item in hyper_dict.items():\n", + " # print(key+':'+str(item))\n", + "\n", + "k=hyper_dict[\"k\"]\n", + "LEARNING_RATE=hyper_dict[\"LEARNING_RATE\"]\n", + "BETA1=hyper_dict[\"BETA1\"]\n", + "BATCH_SIZE=hyper_dict[\"BATCH_SIZE\"]\n", + "EPOCHS=hyper_dict[\"EPOCHS\"]\n", + "VAL_PERIOD=hyper_dict[\"VAL_PERIOD\"]\n", + "SEED=hyper_dict[\"SEED\"]\n", + "sizes=hyper_dict[\"sizes\"]\n", + "LAMBD=hyper_dict[\"LAMBD\"]\n", + "PATH=hyper_dict[\"PATH\"]\n", + " \n", + "if not os.path.exists(PATH+'/hyper_parameters.pkl'):\n", + " print(\"No saved sizes dict\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Input for propagation (?, 13)\n", + "Logits shape (?, 2)\n", + "Input for propagation (?, 13)\n", + "Logits shape (?, 2)\n" + ] + } + ], + "source": [ + "tf.reset_default_graph()\n", + "model_NN = DNN(dim, sizes,\n", + " lr=LEARNING_RATE, beta1=BETA1, lambd=LAMBD,\n", + " batch_size=BATCH_SIZE, epochs=EPOCHS,\n", + " save_sample=VAL_PERIOD, path=PATH, seed=SEED)\n", + "\n", + "vars_to_train=tf.trainable_variables()\n", + "vars_all = tf.global_variables()\n", + "vars_to_init = list(set(vars_all)-set(vars_to_train))\n", + "init_op = tf.variables_initializer(vars_to_init)\n", + "\n", + "saver = tf.train.Saver()\n", + "gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.33)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Evaluate model on test set...\n", + "INFO:tensorflow:Restoring parameters from mu/test_0/NN_1/NN_model.ckpt\n", + "Model restored.\n" + ] + } + ], + "source": [ + "output_dict_NN={}\n", + "batch_size=200\n", + "n_batches = data.shape[0]//batch_size\n", + "\n", + "with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:\n", + " sess.run(init_op)\n", + " print('\\n Evaluate model on test set...')\n", + " saver.restore(sess,PATH+'/NN_model.ckpt')\n", + " print('Model restored.')\n", + " model_NN.set_session(sess)\n", + " for j in range(n_batches):\n", + " \n", + " small_dataset = data_2[j*batch_size:(j+1)*batch_size]\n", + " output_dict_NN[j] = model_NN.predict(small_dataset)\n", + " \n", + " if data.shape[0]%batch_size != 0:\n", + " output_dict_NN[j+1] = model_NN.predict(data_2[(j+1)*batch_size: data_2.shape[0]-1])\n", + " \n", + " output_NN=np.concatenate([output_dict_NN[i] for i in range(len(output_dict_NN))])" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "a = data_dict[\"Ds_ConsD_M\"][0:output_NN.shape[0]][np.argmax(output_NN, axis=1).astype(np.bool)]\n", + "b = [data_dict[\"Ds_ConsD_M\"][0:output_NN.shape[0]][i] for i in range(output_NN.shape[0])]\n", + "\n", + "NN_selected=np.array([a[i][0] for i in range(len(a))])\n", + "full = np.array([b[i][0] for i in range(len(b))])\n", + "full=np.delete(full,np.where(full<0))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAJCCAYAAAD9ZftZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3XuYXVVhN/7vMoGIFcJVrsakQPuARqPmh1rEgigEfF+jRWoUbVAeEQHFCwLpKwSQFlBbQMUiKhcVkHorqaYGVNDaB5Eg8Eakvk0xYkBLSEK4VBKD6/fHnKSTZCY5CZOZWZPP53nmmX3WXmuddSY7Z8531tp7l1prAAAAoBXPGOoBAAAAwMYQZAEAAGiKIAsAAEBTBFkAAACaIsgCAADQFEEWAACApgiyAAAANEWQBQAAoCmCLAAAAE0ZPdQD2Bg777xzHT9+/FAPAwAAgAG28847Z86cOXNqrVM2VLepIDt+/PjMnTt3qIcBAADAZlBK2bmbepYWAwAA0BRBFgAAgKYIsgAAADRFkAUAAKApgiwAAABNEWQBAABoiiALAABAUwRZAAAAmjJ6qAcAAABsnOXLl2fJkiV57LHH8tRTTw31cKBPo0aNyrbbbpsdd9wxY8aMGdC+BVkAAGjI8uXLc//992eHHXbI+PHjs9VWW6WUMtTDgjXUWvP73/8+jz76aO6///6MGzduQMOspcUAANCQJUuWZIcddsjOO++crbfeWohlWCqlZOutt87OO++cHXbYIUuWLBnQ/gVZAABoyGOPPZbttttuqIcBXdtuu+3y2GOPDWifgiwAADTkqaeeylZbbTXUw4CubbXVVgN+LrcgCwAAjbGcmJZsjuNVkAUAAKApgiwAAABNEWQBAABoivvIAgDACHLtbfcP9RDW660vG/e0+1iwYEEmTJiQ6dOn56qrrnr6g1qP6667Lh/72Mcyf/78PP744znllFNy8cUXb9bnZMPMyAIAAPTh1ltvzTHHHJPHHnss73nPezJz5sxMmTJlqIe1QVdddVVKKSml5LTTTuuzzi233JJSSt72trcNWNvBZEYWAACgD9/+9rdTa80Xv/jF/Nmf/dlQD2eTfPKTn8xJJ52U5z3veYPadnMzIwsAANCHBx98MEmyxx57DPFINs0+++yT5cuX56//+q8Hte1gEGQBAIBm/fu//3ve8IY3ZMcdd8wf/dEf5ZWvfGVuvPHGfutfd911OeSQQ7LDDjvkmc98Zvbbb7+cd955Wb58+eo6q5bXXnnllUmSCRMmrF5uu2DBgtX17rjjjhx11FF5znOekzFjxuR5z3teTjzxxPzmN79Z53mPPfbYlFJy33335VOf+lRe+MIXZptttsnBBx+8Rr05c+bkyCOPzM4775wxY8Zk7733zoc//OE88sgjG/2z+cu//Mu8+MUvznXXXZe5c+cOWtvBIMgCAABN+uUvf5lXvOIVWbx4cd797nfn6KOPzh133JEjjjgi119//Tr1jzvuuLz1rW/N/Pnz8xd/8Rc56aSTsuOOO+bMM8/MlClTsnLlyiTJpEmTMnPmzLzoRS9KkpxyyimZOXNmZs6cme233z5J8q1vfSt/9md/ln/+53/Oa17zmnzwgx/Mn/7pn+Yf/uEfMnny5DUCb2+nnHJKzjzzzEycODGnnHJKDjzwwNX7zj333EyZMiW33XZbXve61+V973tf9tlnn3ziE5/IgQcemEcffXSjfj6llHziE59IrTWnnnrqoLUdDM6RBQAAmvTDH/4wp556aj7+8Y+vLjv55JPzile8IieccEKOOOKIbLfddkl6ZlmvuOKKvPGNb8w111yTbbbZZnWbs88+O+ecc04uvfTSnHLKKZk0aVImTZqUBQsW5O6778773//+jB8/fnX9xx9/PMcee2xWrlyZW265JQcddNDqfRdeeGHOOOOMHH/88X3ODP/0pz/NnXfemQkTJqxRfvPNN2fmzJl5xStekdmzZ68OzKvG/o53vCMzZ87MRRddtFE/o1e/+tV53etel29/+9uZNWtWXv/61w9K283NjCwAsGW6+fz+v4AmjB07NmedddYaZZMnT84xxxyTRx55JN/85jdXl19yySUZPXp0rrjiijVCbJKceeaZ2WmnnXLNNdd09bw33HBDFi9enDe/+c1rhNgk+dCHPpTx48fnpptuyv33r3srpNNOO22dEJv0XFgpST73uc+tEWKTnmXJkyZN6np8a/vYxz6WUaNG5fTTT1896zwYbTcnM7IAAECTXvKSl2Tbbbddp/zggw/O1VdfnTvvvDPTp0/Pf//3f+fuu+/Ozjvv3O89YMeMGZN77723q+f96U9/mqRnxnJto0ePzqte9aosWLAgd955Z8aNW/O+uQcccECffd56663Zaqut8tWvfjVf/epX19m/YsWKLFq0KIsXL85OO+3U1ThX2X///XPcccfl8ssvz+WXX54TTzxxUNpuToIsAADQpF133bXP8t122y1JsmzZsiTJ0qVLU2vNokWLcs455zzt513V7+67797n/lXlfV2gadXY1rZ48eKsXLlyg+N7/PHHNzrIJj3n31577bU555xz8va3v33Q2m4ulhYDAABN+q//+q8+y3/7298m6Vl63Pv7i1/84tRa1/vVjVX9rXqeta26avGqer2VUvrtc4cddtjg+Db1nq677rprPvzhD+ehhx7KBRdcMGhtNxdBFgAAaNJPf/rTPPbYY+uU33LLLUl6gmuSPPvZz87zn//83HPPPVmyZMnTft5V/a56nt5WrlyZH/3oR0l6lj536+Uvf3mWLl2ae+6552mPrz+nnnpq9thjj1x00UVZuHDhoLXdHARZAACgScuWLcu55567RtncuXNzzTXXZOzYsXnjG9+4uvyDH/xgVqxYkXe+8519LvldunTp6nNfN2TVfWuvu+66/PjHP15j38UXX5z77rsvr3nNa9Y5P3Z9PvCBDyRJ3vWud+XBBx9cZ/8TTzyxznNtrGc961n56Ec/mt/97ncbvcT66bTdHJwjCwAANOlVr3pVPv/5z+e2227LgQcemN/85je5/vrr84c//CGf/exnV996J0ne+c535o477shnPvOZ7L333jn88MMzbty4LFmyJL/85S/zwx/+MO94xzty2WWXbfB5n/3sZ+eKK67I0UcfnT//8z/P0UcfnXHjxuWOO+7IjTfemN122y2f/exnN+q1HHroobngggsyY8aM7LvvvjnyyCMzYcKEPP744/nVr36VH/zgB3nlK1+Z73znOxv9c+rt2GOPzcUXX5x58+YNatuBJsgCAMAI8taXdT8L2LoJEybksssuyxlnnJHLLrssy5cvz0te8pKcddZZOfzww9epf+mll+aII47IZZddlu9+97t55JFHsuOOO2bcuHH58Ic/nLe97W1dP/fUqVPzb//2b/nbv/3bzJkzJ8uWLctuu+2WE044IWeeeWb22GOPjX49p59+eg488MB88pOfzI9+9KPccMMNGTt2bPbcc88cf/zxeetb37rRfa7tGc94Rj7+8Y9nypQpg9p2oJVuT2geDiZPnlznzp071MMAAEaC9d0v9pAZgzcO2Ej33ntv9ttvv6EeBmyUbo/bUsodtdbJG6rnHFkAAACaIsgCAADQFEEWAACApgiyAAAANEWQBQAAoCmCLAAAAE0RZAEAAGiKIAsAAEBTBFkAAACa0lWQLaVMKaX8opQyv5RyRh/7x5RSru/sv62UMr5TfkAp5a7O192llDd22ycAAAD0ZYNBtpQyKsmlSY5Isn+St5RS9l+r2nFJltZa90lyUZILO+U/SzK51jopyZQkny2ljO6yTwAAAFhHNzOyBySZX2u9r9a6IslXkkxdq87UJFd3tr+W5NBSSqm1/netdWWn/JlJ6kb0CQAAAOvoJsjumeTXvR4v7JT1WacTXJcl2SlJSikvK6Xck2RekhM6+7vpEwAAANYxuos6pY+y2m2dWuttSZ5fStkvydWllH/pss+ejks5PsnxSTJu3LguhgsAAFuwm88f6hGs3yEzhuyp586dmxkzZuTOO+/M4sWL86IXvSh33XXXkI2HTdfNjOzCJM/t9XivJA/2V6eUMjrJ2CRLeleotd6b5IkkL+iyz1XtLq+1Tq61Tt5ll126GC4AAMCaHn300bzuda/LT37yk0ybNi0zZ87MCSeckCQ59thjU0rJggULhnaQSc4+++yUUlJKyWc+85k+61x11VUppeQjH/nIgLVtTTdB9vYk+5ZSJpRStk4yLcmsterMSjK9s/2mJN+vtdZOm9FJUkp5XpI/TbKgyz4BAAAGxE9+8pM89NBDOf300/PpT386Z5999uogO1ydffbZefTRRwe9bQs2GGQ757SenGROknuT/GOt9Z5SyrmllNd3qn0hyU6llPlJPphk1e10Xpnk7lLKXUm+meTEWuvD/fU5kC8MAABglQcf7FkAusceewzxSLqzzz77ZNGiRbnwwgs3XHkA27aiq/vI1lpn11r/pNa6d631bzplZ9VaZ3W2n6y1Hl1r3afWekCt9b5O+Zdqrc+vtU6qtb6k1vpP6+sTAACgG1dddVWOOuqo/PEf/3G22WabbLfddjnwwAPz5S9/eY16CxYsSCkl06f3LCB9xzvesXr57apltldf3XMDlgkTJqzeN378+DX6WbJkSWbMmJH99tsv22yzTcaOHZtDDz00N954Y59jW9X/d77znRx88MEZO3ZsSunrUkF9e+9735s99tgjF110URYuXLhRP5un07YV3VzsCQAAYFh5z3vek/333z+vetWrsvvuu2fx4sWZPXt23v72t+cXv/hFPvrRjyZJtt9++8ycOTN33XVXbrjhhkydOjWTJk1KkkyaNCkzZ87MP/3TP+Xuu+/OKaecku233351u1V+9atf5eCDD86CBQty0EEHZcqUKXniiSfyrW99K1OmTMlnP/vZvOtd71pnjF/72tfyne98J0cccUROOOGEjToH91nPelY++tGP5rjjjsv/+T//Z3XY3txtWyHIAgAAzfnZz36Wvffee42yFStW5IgjjsgFF1yQE044IXvuuWe23377nH322bnqqqtyww035A1veEOOPfbY1W0mTZqUBQsW5O6778773//+dWZik2T69On51a9+leuuuy7Tpk1bXf7II4/k4IMPzvve9768/vWvz6677rpGu9mzZ2f27NmZMmXKJr3GY489Npdcckm+/OUv5wMf+MDqAL6527agq6XFAAAAw8naITZJtt5665x00klZuXJlvve97w3I89x99935wQ9+kKOOOmqNEJv0zNqec845efLJJ/P1r399nbZTp07d5BCbJM94xjPysY99LH/4wx9y6qmnDlrbFpiRBQAAmnP//ffnwgsvzPe+973cf//9+d3vfrfG/gceeGBAnufWW29Nkixbtixnn332OvsXLVqUJLn33nvX2XfAAQc87ec//PDDc9hhh+XGG2/M7Nmzc+SRRw5K2+FOkAUAAJpy33335YADDsjSpUtz0EEH5bDDDsvYsWMzatSoLFiwIFdffXWWL18+IM+1ePHiJMlNN92Um266qd96jz/++Dplu+2224CM4ROf+EQmTZqU0047LYcffvigtR3OBFkAAKApf//3f5/FixfnyiuvXON81yS57rrrBvTiRmPHjk2SXHLJJXnf+963UW035irF6zNx4sRMnz49V155Za644opstdVWg9J2OHOOLAAA0JT58+cnSY466qh19v3gBz/Y6P5GjRqVJHnqqafW2ffyl788SfKv//qvG93vQDrvvPPyrGc9K2eddVaeeOKJQWs7XAmyAABAU1ZdWfiWW25Zo3zOnDn5/Oc/v9H97bTTTkl6zrtd2+TJk3PQQQflG9/4Rq644oo+28+bNy8PPfTQRj/vxthjjz3yoQ99KL/97W9z8cUXD1rb4UqQBQAAmnLiiSdm6623ztFHH51jjjkmp512Wo488sgcccQRedOb3rTR/R166KFJkne9610544wzct555+XTn/706v3XXntt9t577xx33HGZNGlS3v3ud+f000/PMccck4kTJ+aFL3xh7rvvvgF7ff057bTTsuuuu66ekR6stsORc2QBAGAkOWTGUI9gs3vhC1+Ym2++OR/5yEcye/bsrFy5Mi960YvyjW98I9tvv32uv/76jerv8MMPz9/93d/lc5/7XC666KKsWLEiz3ve83LyyScnSfbaa6/ccccd+dSnPpWvf/3rueaaa/LUU09lt912y/7775/3vve9mThx4uZ4qWt49rOfnXPOOScnnHDCoLYdjkqtdajH0LXJkyfXuXPnDvUwAICR4Obz+9+3BQQB2nXvvfdmv/32G+phwEbp9rgtpdxRa528oXqWFgMAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIr7yAIAI9f6brEDDau1ppQy1MOArmyOW76akQUAgIaMGjUqv//974d6GNC13//+9xk1atSA9inIAgBAQ7bddts8+uijQz0M6Nqjjz6abbfddkD7FGQBAKAhO+64Y5YuXZqHH344K1as2CzLNuHpqrVmxYoVefjhh7N06dLsuOOOA9q/c2QBAKAhY8aMybhx47JkyZIsWLAgTz311FAPCfo0atSobLvtthk3blzGjBkzoH0LsgAA0JgxY8Zk9913z+677z7UQ4EhYWkxAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFMEWQAAAJoiyAIAANAUQRYAAICmCLIAAAA0RZAFAACgKYIsAAAATRFkAQAAaIogCwAAQFO6CrKllCmllF+UUuaXUs7oY/+YUsr1nf23lVLGd8pfW0q5o5Qyr/P91b3a3NLp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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(full,alpha=0.4,bins=120, range=(full.min(),full.max()),density=True,label='before NN');\n", + "plt.hist(NN_selected,alpha=0.5,bins=120, range=(full.min(),full.max()),density=True,label='after NN');\n", + "plt.legend(fontsize=20)\n", + "fig=plt.gcf();\n", + "fig.set_size_inches(16,10)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "np.save('/disk/lhcb_data/davide/Rphipi/selected_data/'+l_flv[l_index]+l_flv[l_index]+'/'+'sel_data_NN_'+l_flv[l_index]+l_flv[l_index]+'.npy', NN_selected)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# XGBOOST SELECTION" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "PATH=l_flv[l_index]+'/test_'+str(test)+'/XG_'+str(i)\n", + "loaded_model = pickle.load(open(PATH+\"/XG_\"+str(i)+\"_.pickle.dat\", \"rb\"))" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "output_XG=loaded_model.predict_proba(data_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "a = data_dict[\"Ds_ConsD_M\"][0:output_XG.shape[0]][np.argmax(output_XG, axis=1).astype(np.bool)]\n", + "b = [data_dict[\"Ds_ConsD_M\"][0:output_XG.shape[0]][i] for i in range(output_XG.shape[0])]\n", + "\n", + "XG_selected=np.array([a[i][0] for i in range(len(a))])" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7IAAAJCCAYAAAD9ZftZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xu8VnWB7/HvL7agMypeS1IRMuulpXGK0Ro1MadC60SO+hJTE3U0NSebpilpMtSp1OacSS0bM0W8JDnZlE4xkaV2MSsxNTOnCQ0VrJMK4qVEwd/5gw3DZW94uMjmt3m/X6/94tlr/dZ6fouecH/2Ws+zSq01AAAA0IqX9PUEAAAAYFUIWQAAAJoiZAEAAGiKkAUAAKApQhYAAICmCFkAAACaImQBAABoipAFAACgKUIWAACApnT19QRWxTbbbFOHDRvW19MAAABgLdtmm20yderUqbXW0Ssb21TIDhs2LNOmTevraQAAAPAiKKVs08k4lxYDAADQFCELAABAU4QsAAAATRGyAAAANEXIAgAA0BQhCwAAQFOELAAAAE0RsgAAADSlq68nAAAArLp58+Zl9uzZeeqpp7JgwYK+ng4sZ8CAAdlss82y1VZbZdCgQWt130IWAAAaM2/evDz00EPZcsstM2zYsGy00UYppfT1tGCxWmuef/75PPnkk3nooYcydOjQtRqzLi0GAIDGzJ49O1tuuWW22WabDBw4UMSy3imlZODAgdlmm22y5ZZbZvbs2Wt1/0IWAAAa89RTT2XzzTfv62lARzbffPM89dRTa3WfQhYAABqzYMGCbLTRRn09DejIRhtttNbfxy1kAQCgQS4nphUvxmtVyAIAANAUIQsAAEBThCwAAABNcR9ZAADoZ6756UN9PYUVes9eQ9d4HzNmzMjw4cNzzDHHZNKkSWs+qRWYPHlyPvOZz2T69Ol5+umnc9ppp+X8889/UZ+TFXNGFgAAoBe33XZbjjzyyDz11FM5+eSTM2HChIwePbqvp7VCL7zwQvbbb7+UUjJ58uQexzzwwAPZbLPNstVWW2XWrFnLrX/mmWfy+c9/PqNHj86QIUMyaNCgbLrppnnVq16VI444IpMnT87zzz//Yh9Kr5yRBQAA6MW3vvWt1Fpz5ZVX5i//8i/7ejodeclLXpIrrrgir3vd6/L+978/++67b3bYYYfF6xcsWJCjjz46Tz/9dCZPnpztt99+qe1//OMf5/DDD8/MmTPzspe9LG95y1uy44475oUXXshDDz2Um2++OV/5ylfyL//yL7n99tvX9eElEbIAAAC9euSRR5IkL3/5y/t4Jqtm2LBhueCCC3Lsscdm3LhxufHGGxffBuecc87Jj3/847znPe/J2LFjl9ru3nvvzejRo/PMM8/kU5/6VD784Q9n4MCBS41ZsGBBvv71r+eiiy5aZ8ezLJcWAwAATfuv//qvvPvd785WW22VP//zP88+++yT73znO72Onzx5cvbff/9sueWW2XjjjbPrrrvmk5/8ZObNm7d4zKRJk1JKyeWXX54kGT58eEopKaVkxowZi8fdcccdOeSQQ/LSl740gwYNyk477ZRTTjklv/vd75Z73nHjxqWUkgceeCCf+9znsscee2STTTbJqFGjlho3derUHHTQQdlmm20yaNCg7LzzzvmHf/iHPPHEE6v09zJu3LgcfPDB+d73vpcLLrggSTJt2rScffbZ2XHHHXsM0VNPPTVPPfVUTj/99HzsYx9bLmKTZMCAATn00ENz4403rtJ81iZnZAEAgGb99re/zZve9Ka89rWvzfve97787ne/y7XXXpsDDzww11xzTQ4//PClxh9//PGZOHFidthhh/z1X/91tthii/zkJz/JGWecke9973u58cYb09XVlREjRmTChAn5xje+kbvvvjunnXZatthiiyRZ/Oc3v/nNHHLIIam15tBDD81OO+2UO+64I//6r/+a66+/PrfeemuGDRu23JxPO+20/PCHP8w73vGOHHTQQRkwYMDidWeffXYmTJiQrbbaKu985zvz0pe+NL/4xS/yf/7P/8mUKVNy2223ZfPNN+/47+eSSy7Jj3/844wfPz777LNPjjrqqMyfPz+TJk1afByL3H///bnllluyySab5CMf+chK993V1Xc5KWQBAIBm/eAHP8iHP/zh/PM///PiZaeeemre9KY35aSTTsqBBx64OPwmTZqUiRMn5uCDD86Xv/zlbLLJJou3OfPMM3PWWWfloosuymmnnZYRI0ZkxIgRmTFjRu6+++588IMfXCpKn3766YwbNy7z58/PLbfckn333XfxuvPOOy+nn356TjzxxB7PDP/85z/PnXfemeHDhy+1/Oabb86ECRPypje9KVOmTFkqNCdNmpRjjz02EyZMyGc/+9mO/3622WabXHbZZXnnO9+ZffbZJ/PmzcuHPvShvOUtb1lu7K233pokecMb3pDBgwd3/Bx9waXFAMCG6eZzev8CmjF48OB84hOfWGrZyJEjc+SRR+aJJ57I17/+9cXLL7jggnR1dWXixIlLRWySnHHGGdl6663z5S9/uaPnvf766/P444/n8MMPXypik+Tv//7vM2zYsNx444156KHlb4X0kY98ZLmITZILL7wwSfKlL31pubOl48aNy4gRIzqe35Le8Y53ZL/99su8efMydOjQfPrTn+5x3O9///skWe7DnxY5//zzc+aZZy71teRl1uuSM7IAAECzXv/612ezzTZbbvmoUaNyxRVX5M4778wxxxyTP/7xj7n77ruzzTbb9HoP2EGDBuW+++7r6Hl//vOfJ0mPZza7urry5je/OTNmzMidd96ZoUOXvm/unnvu2eM+b7vttmy00Ub56le/mq9+9avLrX/uuefy6KOP5vHHH8/WW2/d0TyT5KabbsoPfvCDJMnMmTPzk5/8JPvtt99y42qtSbL4Q6GWdf755+fBBx9catmoUaN6vHz6xSZkAQCAZr3sZS/rcfl2222XJJk7d26SZM6cOam15tFHH81ZZ521xs+7aL9Dhgzpcf2i5T19QNOiuS3r8ccfz/z581c6v6effrrjkH3iiScybty4dHV15cILL8ypp56acePG5Re/+MVyvwBYNOee7iubZKmzr0cdddRqnR1eW1xaDAAANOv//b//1+PyRZfJLnqv56I//9f/+l+pta7wqxOL9rfoeZa16FOLe3qvaW9nPAcPHpwtt9xypfPbaaedOppjkpxyyil5+OGHc9ZZZ+Wkk07KRz/60cyYMSN/93d/t9zYvffeO8nCTzZ+8sknO36OviBkAQCAZv385z/PU089tdzyW265JcnCcE2STTfdNK95zWty7733Zvbs2Wv8vIv2u+h5ljR//vz86Ec/SrLw0udOvfGNb8ycOXNy7733rvH8kuTaa6/N5MmTs/fee+ejH/1okoUfajVixIhcdtll+eY3v7nU+J133jmjRo3Kn/70p6U+PGt9JGQBAIBmzZ07N2efffZSy6ZNm5Yvf/nLGTx4cA4++ODFyz/0oQ/lueeey3HHHdfjJb9z5sxZ/N7XlVl039rJkyfnJz/5yVLrzj///DzwwAP5q7/6q+XeH7sii86SnnDCCXnkkUeWW//MM88s91y9mTVrVk4++eRsuummufLKK/OSlyxMv4022ihXXXVVBg0alBNOOCGPPfbYUtt97nOfy6abbppPf/rTOe+88/L8888vt+8XXnihz8/Yeo8sAADQrDe/+c259NJL89Of/jR777334vvIvvDCC/niF7+41D1XjzvuuNxxxx35whe+kJ133jlvf/vbM3To0MyePTu//e1v84Mf/CDHHntsLr744pU+76abbpqJEyfmsMMOy3777ZfDDjssQ4cOzR133JHvfOc72W677fLFL35xlY7lgAMOyLnnnpvx48dnl112yUEHHZThw4fn6aefzoMPPpjvf//72WefffLtb397hfuptWbcuHGZM2dOLr300rziFa9Yav1rX/va/NM//VM+8pGP5KSTTsp111231LqpU6fmsMMOy+mnn57zzz8/+++/f4YOHZoFCxbk97//fW6++ebMmjUrw4cPz4477rhKx7i2CFkAAOhn3rNX52cBWzd8+PBcfPHFOf3003PxxRdn3rx5ef3rX59PfOITefvb377c+IsuuigHHnhgLr744nz3u9/NE088ka222ipDhw7NP/zDP+Soo47q+LnHjBmTW2+9NZ/+9KczderUzJ07N9ttt11OOumknHHGGXn5y1++ysfz0Y9+NHvvvXcuvPDC/OhHP8r111+fwYMHZ/vtt8+JJ56Y97znPSvdx4UXXpjvfve7GTNmTI4//vgex/z93/99vvnNb+ZrX/tarr766qWO+y//8i/z3//935k4cWL+4z/+IzfddFNmz56djTbaKEOGDMnee++dgw8+OH/913+dgQMHrvIxrg2l0zczrw9GjhxZp02b1tfTAAD6gxXdL3b/8etuHrAa7rvvvuy66659PQ3oWKev2VLKHbXWkSsb5z2yAAAANEXIAgAA0JSOQraUMrqU8utSyvRSyuk9rB9USrm2e/1PSynDupfvWUq5q/vr7lLKwZ3uEwAAAHqy0pAtpQxIclGSA5PsluSIUspuyww7PsmcWusrk3w2yXndy3+ZZGStdUSS0Um+WErp6nCfAAAAsJxOzsjumWR6rfWBWutzSb6SZMwyY8YkuaL78XVJDiillFrrH2ut87uXb5xk0SdLdbJPAAAAWE4nIbt9koeX+H5m97Iex3SH69wkWydJKWWvUsq9Se5JclL3+k72CQAAAMvpJGRLD8uWvWdPr2NqrT+ttb4myV8kGV9K2bjDfS7ccSknllKmlVKmPfroox1MFwAAgP6sk5CdmWTHJb7fIckjvY0ppXQlGZxk9pIDaq33JXkmyWs73Oei7S6ptY6stY7cdtttO5guAAAA/VknIXt7kl1KKcNLKQOTjE1ywzJjbkhyTPfjQ5PcVGut3dt0JUkpZackr04yo8N9AgAAwHK6Vjag1jq/lHJqkqlJBiSZWGu9t5RydpJptdYbklyW5KpSyvQsPBM7tnvzfZKcXkp5PskLSU6ptT6WJD3tcy0fGwAAAP3QSkM2SWqtU5JMWWbZJ5Z4/GySw3rY7qokV3W6TwAAAFiZTi4tBgAAgPWGkAUAAKApHV1aDAAANOTmc/p6Biu2//g+e+pp06Zl/PjxufPOO/P444/nda97Xe66664+mw+rxxlZAABgg/Dkk0/mHe94R372s59l7NixmTBhQk466aQkybhx41JKyYwZM/p0jn/84x/z6le/OgMGDMitt97a45jbbrstXV1d2XnnnfP0008vt3727Nk599xzM2rUqLz0pS/NwIEDs9lmm+U1r3lNjj322PzHf/xHaq0v9qG8qJyRBQAANgg/+9nP8oc//CGf+tSn8rGPfayvp9OjP/uzP8tVV12VvffeO0cffXTuvvvubLbZZovXP/300zn66KOTJFdeeWU23XTTpba/4YYbcswxx+SJJ57IsGHDctBBB2XIkCF57rnncv/99+cb3/hGJk2alEMPPTRf/epX1+mxrU1CFgAA2CA88sgjSZKXv/zlfTyTFdtzzz3zj//4jznrrLPywQ9+MJdddtnidR/84Adz//3352Mf+1j23nvvpba76aabcsghh6Srqytf+tKXctxxx+UlL1n6Itxnn302V199db7zne+sk2N5sbi0GAAAaNKkSZNyyCGH5BWveEU22WSTbL755tl7771z9dVXLzVuxowZKaXkmGOOSZIce+yxKaWklJJJkyallJIrrrgiSTJ8+PDF64YNG7bUfmbPnp3x48dn1113zSabbJLBgwfngAMO6DEKF+130qRJ+fa3v51Ro0Zl8ODBKaV0dGwf//jH8xd/8ReZOHFivvGNbyRJrr/++lx22WV5/etfnzPPPHOp8QsWLMhJJ52U+fPn58ILL8zf/M3fLBexSbLxxhvnb/7mb3LNNdd0NI/1lTOyAABAk04++eTstttuefOb35whQ4bk8ccfz5QpU3L00Ufn17/+df7pn/4pSbLFFltkwoQJueuuu3L99ddnzJgxGTFiRJJkxIgRmTBhQr7xjW/k7rvvzmmnnZYttthi8XaLPPjggxk1alRmzJiRfffdN6NHj84zzzyTb37zmxk9enS++MUv5oQTTlhujtddd12+/e1v58ADD8xJJ53U8Xtwu7q6ctVVV+X1r399TjzxxLziFa/ICSeckE022SRXX311Ntpoo6XG33LLLfnNb36THXfcMccdd1xH+29Z27MHAAA2WL/85S+z8847L7Xsueeey4EHHphzzz03J510UrbffvtsscUWOfPMMzNp0qRcf/31efe7351x48Yt3mbEiBGZMWNG7r777nzwgx9c7kxskhxzzDF58MEHM3ny5IwdO3bx8ieeeCKjRo3KBz7wgbzrXe/Ky172sqW2mzJlSqZMmZLRo0ev8vG9+tWvzmc+85mceuqp2XPPPTNv3rxceOGF2XXXXZcbu+iDofbbb78MGDBglZ+rNS4tBgAAmrRsxCbJwIED8/73vz/z58/P9773vbXyPHfffXe+//3v55BDDlkqYpOFZ23POuusPPvss/na17623LZjxoxZrYhd5JRTTsmwYcMyb9687LXXXjn11FN7HPf73/8+SbL99tv3uP7MM89c7uuJJ55Y7Xn1NWdkAQCAJj300EM577zz8r3vfS8PPfRQ/vSnPy21ftasWWvleW677bYkydy5c5d7b2qSPProo0mS++67b7l1e+655xo996RJkxZfjvyLX/wiv/nNb/KqV71quXGLbqfT23twzzrrrOWWjRs3bqnLp1siZAEAgOY88MAD2XPPPTNnzpzsu+++edvb3pbBgwdnwIABmTFjRq644orMmzdvrTzX448/niS58cYbc+ONN/Y6rqd7um633Xar/bwzZsxY/J7dCRMm5O/+7u/y3ve+N7feeutylw8PGTIkSe/xvuR9Y/fZZ59e71HbCiELAAA051/+5V/y+OOP5/LLL1/q/a5JMnny5MWfQrw2DB48OElywQUX5AMf+MAqbdvppxQv64UXXsh73/vePPXUU7nmmmtyxBFH5Pbbb88111yTc845Jx//+MeXGr/oVjy33HJLXnjhhR4/sbg/6d9HBwAA9EvTp09PkhxyyCHLrfv+97+/yvtbdIZzwYIFy6174xvfmCT54Q9/uMr7XV2f+cxn8sMf/jBjx47NEUcckSS56KKLssMOO+Tss8/OnXfeudT4UaNG5ZWvfGUefvjhXH755etsnn1FyAIAAM1Z9MnCt9xyy1LLp06dmksvvXSV97f11lsnWfi+22WNHDky++67b/793/89EydO7HH7e+65J3/4wx9W+Xl7ctddd2XChAnZfvvt84UvfGHx8i222CITJ07M/Pnzc/TRRy916fSAAQNy8cUXp6urK3/7t3+byy+/PC+88MJy+37++efzxz/+ca3Msy8JWQAAoDmnnHJKBg4cmMMOOyxHHnlkPvKRj+Sggw7KgQcemEMPPXSV93fAAQckSU444YScfvrp+eQnP5nPf/7zi9dfc8012XnnnXP88cdnxIgRed/73pePfvSjOfLII7P77rtnjz32yAMPPLDGx/Xss8/mqKOOyvPPP59JkyZlyy23XGr9W9/61px88sm5995784//+I/LHcN1112XgQMH5rjjjsvOO++ccePG5WMf+1g+9KEPZezYsRkyZEjuvPPO7LHHHs1+0FPiPbIAAND/7D++r2fwottjjz1y88035+Mf/3imTJmS+fPn53Wve13+/d//PVtssUWuvfbaVdrf29/+9vzf//t/86UvfSmf/exn89xzz2WnnXZafLubHXbYIXfccUc+97nP5Wtf+1q+/OUvZ8GCBdluu+2y22675W//9m+z++67r/FxjR8/Pvfee28+8IEP5K/+6q96HPPP//zP+e53v5vPfvazede73pU3v/nNi9eNGTMm999/fy655JL853/+Z771rW/liSeeyMYbb5wddtgh73jHO3LYYYfloIMOavp9tGXJT69a340cObJOmzatr6cBAPQHN5/T+7oNIAJo23333Zddd921r6cBHev0NVtKuaPWOnJl49pNcAAAADZIQhYAAICmCFkAAACaImQBAABoipAFAACgKUIWAACApriPLADQf63oFjvQuFprSil9PQ1YqRfjlq/OyAIAQGMGDBiQ559/vq+nAR15/vnnM2DAgLW6TyELAACN2WyzzfLkk0/29TSgI08++WQ222yztbpPIQsAAI3ZaqutMmfOnDz22GN57rnnXpRLN2FN1Frz3HPP5bHHHsucOXOy1VZbrdX9e48sAAA0ZtCgQRk6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fbu/ju5pUK31klrryFrryG233XalkwUAAKB/6yRkZybZcYnvd0jySG9jSildSQYnmb2indZaZ3X/+VSSa7LwEmYAAABYoU5C9vYku5RShpdSBiYZm+SGZcbckOSY7seHJrmp1trrGdlSSlcpZZvuxxsleWeSX67q5AEAANjwrPRTi2ut80sppyaZmoW335lYa723lHJ2kmm11huSXJbkqlLK9Cw8Ezt20fallBlJNk8ysJTy7iRvS/JgkqndETsgyXeTfGmtHhkAAAD9Ukf3ka21TkkyZZlln1ji8bNJDutl22G97PYNnU0RAAAA/kcnlxYDAADAekPIAgAA0BQhCwAAQFOELAAAAE0RsgAAADRFyAIAANAUIQsAAEBThCwAAABNEbIAAAA0RcgCAADQlK6+ngAA7bpn1txe1+2+DucBAGxYnJEFAACgKUIWAACApghZAAAAmiJkAQAAaIqQBQAAoClCFgAAgKYIWQAAAJoiZAEAAGhKV19PAACgKTef0/Py/cev23kAbMCckQUAAKApQhYAAICmCFkAAACaImQBAABoipAFAACgKUIWAACApghZAAAAmuI+sgC8OHq712bifpsAwBpxRhYAAICmCFkAAACaImQBAABoipAFAACgKUIWAACApghZAAAAmiJkAQAAaIqQBQAAoClCFgAAgKZ09fUEAFi/3TNrbl9PAQBgKc7IAgAA0BQhCwAAQFOELAAAAE0RsgAAADRFyAIAANAUIQsAAEBThCwAAABNEbIAAAA0RcgCAADQlK6+ngAA64mbz+nrGQAAdMQZWQAAAJoiZAEAAGiKkAUAAKApQhYAAICmCFkAAACaImQBAABoipAFAACgKUIWAACApghZAAAAmiJkAQAAaIqQBQAAoClCFgAAgKZ09fUEAABacs+suT0u330dzwNgQ+aMLAAAAE0RsgAAADRFyAIAANAUIQsAAEBThCwAAABNEbIAAAA0RcgCAADQFCELAABAU4QsAAAATRGyAAAANEXIAgAA0BQhCwAAQFOELAAAAE0RsgAAADSlo5AtpYwupfy6lDK9lHJ6D+sHlVKu7V7/01LKsO7lW5dSbi6lPF1K+fwy27yhlHJP9zYXllLK2jggAAAA+reVhmwpZUCSi5IcmGS3JEeUUnZbZtjxSebUWl+Z5LNJzute/mySM5J8uIdd/2uSE5Ps0v01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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(full,alpha=0.4,bins=120, range=(full.min(),full.max()),density=True,label='before XG');\n", + "plt.hist(XG_selected,alpha=0.5,bins=120, range=(full.min(),full.max()),density=True,label='after XG');\n", + "plt.legend(fontsize=20)\n", + "fig=plt.gcf();\n", + "fig.set_size_inches(16,10)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "np.save('/disk/lhcb_data/davide/Rphipi/selected_data/'+l_flv[l_index]+l_flv[l_index]+'/'+'sel_data_XG_'+l_flv[l_index]+l_flv[l_index]+'.npy', NN_selected)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/DNN.ipynb b/DNN.ipynb deleted file mode 100644 index d608bb2..0000000 --- a/DNN.ipynb +++ /dev/null @@ -1,574 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import tensorflow as tf\n", - "import matplotlib.pyplot as plt\n", - "import os\n", - "import pickle\n", - "import math\n", - "\n", - "trunc_normal= tf.truncated_normal_initializer(stddev=1)\n", - "normal = tf.random_normal_initializer(stddev=1)\n", - "\n", - "from architectures.data_processing import *\n", - "from architectures.utils.toolbox import *\n", - "from architectures.DNN import *" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# IMPORTING THE DATASET" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "l_index=1" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Signal MC amounts to 6151 while bkg data amounts to 17665\n" - ] - } - ], - "source": [ - "MC_sig_dict, data_bkg_dict = load_datasets(l_index)\n", - "m=MC_sig_dict[\"Ds_ConsD_M\"].shape[0]\n", - "n=data_bkg_dict[\"Ds_ConsD_M\"].shape[0]\n", - "\n", - "print('Signal MC amounts to {0} while bkg data amounts to {1}'.format(m,n))" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "#Normalising the Chi2 vertex fits to the NDoF\n", - "\n", - "MC_sig_dict[\"Ds_ENDVERTEX_CHI2\"]=MC_sig_dict[\"Ds_ENDVERTEX_CHI2\"]/MC_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "MC_sig_dict[\"Ds_OWNPV_CHI2\"]=MC_sig_dict[\"Ds_OWNPV_CHI2\"]/MC_sig_dict[\"Ds_OWNPV_NDOF\"]\n", - "MC_sig_dict[\"Ds_IPCHI2_OWNPV\"]=MC_sig_dict[\"Ds_IPCHI2_OWNPV\"]/MC_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "\n", - "del MC_sig_dict[\"Ds_OWNPV_NDOF\"]\n", - "del MC_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "\n", - "\n", - "data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]=data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "data_bkg_dict[\"Ds_OWNPV_CHI2\"]=data_bkg_dict[\"Ds_OWNPV_CHI2\"]/data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", - "data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]=data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "\n", - "del data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", - "del data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "\n", - "\n", - "data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]=data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", - "data_bkg_dict[\"phi_OWNPV_CHI2\"]=data_bkg_dict[\"phi_OWNPV_CHI2\"]/data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", - "data_bkg_dict[\"phi_IPCHI2_OWNPV\"]=data_bkg_dict[\"phi_IPCHI2_OWNPV\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", - "\n", - "del data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", - "del data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "branches_needed = [\n", - " \"Ds_ENDVERTEX_CHI2\",\n", - " #\"Ds_ENDVERTEX_NDOF\",\n", - " \"Ds_OWNPV_CHI2\",\n", - " #\"Ds_OWNPV_NDOF\",\n", - " \"Ds_IPCHI2_OWNPV\",\n", - " \"Ds_IP_OWNPV\",\n", - " \"Ds_DIRA_OWNPV\",\n", - " #l_flv[l_index]+\"_plus_MC15TuneV1_ProbNN\"+l_flv[l_index],\n", - " #\"Ds_Hlt1TrackMVADecision_TOS\",\n", - " #\"Ds_Hlt2RareCharmD2Pi\"+l_flv[l_index].capitalize()+l_flv[l_index].capitalize()+\"OSDecision_TOS\",\n", - " #\"Ds_Hlt2Phys_TOS\",\n", - " \"phi_ENDVERTEX_CHI2\",\n", - " #\"phi_ENDVERTEX_NDOF\",\n", - " \"phi_OWNPV_CHI2\",\n", - " #\"phi_OWNPV_NDOF\",\n", - " \"phi_IPCHI2_OWNPV\",\n", - " \"phi_IP_OWNPV\",\n", - " \"phi_DIRA_OWNPV\",\n", - " \"Ds_ConsD_M\",\n", - " ] " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "#Number of input features\n", - "\n", - "dim=len(branches_needed)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "#Convert data dictionaries to arrays for NN\n", - "\n", - "MC_sig = extract_array(MC_sig_dict, branches_needed, dim, m)\n", - "data_bkg = extract_array(data_bkg_dict, branches_needed, dim, n)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "#Add 0/1 label for bkg/sig\n", - "\n", - "MC_sig_labelled=add_labels(MC_sig,signal=True)\n", - "data_bkg_labelled=add_labels(data_bkg,signal=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "#SOME CROSS CHECKS\n", - "#MC_sig_labelled.shape[1]==dim+1==data_bkg_labelled.shape[1]\n", - "#data_bkg_labelled[:,dim].sum()==0\n", - "#(MC_sig_labelled[:,dim].sum()/m)==1" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "#Merge MC sig and data bkg, shuffle it\n", - "\n", - "data=np.concatenate((MC_sig_labelled,data_bkg_labelled), axis =0)\n", - "np.random.seed(1)\n", - "np.random.shuffle(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "#Establish train/val/test sizes\n", - "train_size=m+n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "#Strip away the label column and convert it to a one-hot encoding\n", - "\n", - "X=data[:,0:dim]\n", - "Y_labels=data[:,dim].astype(int)\n", - "Y_labels=Y_labels.reshape(train_size,1)\n", - "Y_labels_hot = to_one_hot(Y_labels)\n", - "Y_labels=Y_labels_hot\n" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [], - "source": [ - "#Divide the dataset k \"equi populated\" sets\n", - "\n", - "k=2 #number of subsets\n", - "i=0 #number of subset that is test set\n", - "\n", - "X_train, Y_train, X_test, Y_test, X_dict, Y_dict = k_subsets(i, k, X, Y_labels)" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(11908, 10)" - ] - }, - "execution_count": 51, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "X_test.shape" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# SETTING UP THE NETWORK" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "#task='TRAIN'\n", - "task='TEST'\n", - "\n", - "PATH=l_flv[l_index]+'_test_'+str(i)" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "if task =='TRAIN' and os.path.exists(PATH+'/hyper_parameters.pkl'):\n", - " with open(PATH+'/hyper_parameters.pkl', 'rb') as f: \n", - " hyper_dict = pickle.load(f)\n", - " \n", - " k=hyper_dict[\"k\"]\n", - " LEARNING_RATE=hyper_dict[\"LEARNING_RATE\"]\n", - " BETA1=hyper_dict[\"BETA1\"]\n", - " BATCH_SIZE=hyper_dict[\"BATCH_SIZE\"]\n", - " EPOCHS=hyper_dict[\"EPOCHS\"]\n", - " VAL_PERIOD=hyper_dict[\"VAL_PERIOD\"]\n", - " SEED=hyper_dict[\"SEED\"]\n", - " sizes=hyper_dict[\"sizes\"]\n", - " LAMBD=hyper_dict[\"LAMBD\"]\n", - " PATH=hyper_dict[\"PATH\"]\n", - "\n", - "elif task=='TRAIN' and not os.path.exists(PATH+'/hyper_parameters.pkl'):\n", - " \n", - " \n", - " LEARNING_RATE = 0.001\n", - " BETA1 = 0.5\n", - " BATCH_SIZE = 64\n", - " EPOCHS = 20\n", - " VAL_PERIOD = 5\n", - " SEED=1\n", - " LAMBD=1.\n", - " \n", - " sizes = {\n", - " 'dense_layers': [\n", - " #(16, 'bn', 0.8, lrelu, tf.glorot_uniform_initializer()),\n", - " #(8, 'bn', 0.5, lrelu, tf.glorot_uniform_initializer()),\n", - " #(16, 'bn',0.8, lrelu, tf.glorot_uniform_initializer()),\n", - " (32, 'bn', 0.8, lrelu, tf.glorot_uniform_initializer()),\n", - " (16, 'bn', 0.8, lrelu, tf.glorot_uniform_initializer()),\n", - " (8, 'bn', 0.8, lrelu, tf.glorot_uniform_initializer()),\n", - " ],\n", - " 'n_classes':2,\n", - " }" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [], - "source": [ - "if task == 'TEST' and os.path.exists(PATH+'/hyper_parameters.pkl'):\n", - " with open(PATH+'/hyper_parameters.pkl', 'rb') as f: \n", - " hyper_dict = pickle.load(f)\n", - " #for key, item in hyper_dict.items():\n", - " # print(key+':'+str(item))\n", - " \n", - " k=hyper_dict[\"k\"]\n", - " LEARNING_RATE=hyper_dict[\"LEARNING_RATE\"]\n", - " BETA1=hyper_dict[\"BETA1\"]\n", - " BATCH_SIZE=hyper_dict[\"BATCH_SIZE\"]\n", - " EPOCHS=hyper_dict[\"EPOCHS\"]\n", - " VAL_PERIOD=hyper_dict[\"VAL_PERIOD\"]\n", - " SEED=hyper_dict[\"SEED\"]\n", - " sizes=hyper_dict[\"sizes\"]\n", - " LAMBD=hyper_dict[\"LAMBD\"]\n", - " PATH=hyper_dict[\"PATH\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [], - "source": [ - "def bkg():\n", - " dim=X_train.shape[1]\n", - " tf.reset_default_graph()\n", - " nn = DNN(dim, sizes,\n", - " lr=LEARNING_RATE, beta1=BETA1, lambd=LAMBD,\n", - " batch_size=BATCH_SIZE, epochs=EPOCHS,\n", - " save_sample=VAL_PERIOD, path=PATH, seed=SEED)\n", - " \n", - " vars_to_train= tf.trainable_variables()\n", - " \n", - " if task == 'TRAIN':\n", - " init_op = tf.global_variables_initializer()\n", - " \n", - " if task == 'TEST':\n", - " vars_all = tf.global_variables()\n", - " vars_to_init = list(set(vars_all)-set(vars_to_train))\n", - " init_op = tf.variables_initializer(vars_to_init)\n", - " \n", - " # Add ops to save and restore all the variables.\n", - " saver = tf.train.Saver()\n", - " gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)\n", - " \n", - " with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:\n", - " \n", - " sess.run(init_op)\n", - "\n", - " if task=='TRAIN':\n", - " print('\\n Training...')\n", - " \n", - " if os.path.exists(PATH+'/CNN_model.ckpt.index'):\n", - " saver.restore(sess,PATH+'/CNN_model.ckpt')\n", - " print('Model restored.')\n", - " \n", - " nn.set_session(sess)\n", - " nn.fit(X_train, Y_train, X_test, Y_test)\n", - " \n", - " save_path = saver.save(sess, PATH+'/CNN_model.ckpt')\n", - " print(\"Model saved in path: %s\" % save_path)\n", - " \n", - " if task=='TEST':\n", - " print('\\n Evaluate model on test set...')\n", - " saver.restore(sess,PATH+'/CNN_model.ckpt')\n", - " print('Model restored.')\n", - " \n", - " nn.set_session(sess)\n", - " nn.test(X_test, Y_test)\n", - " \n", - " batch_size_output=128\n", - " test_size=Y_test.shape[0]\n", - " n_batches_output = test_size//batch_size_output\n", - " \n", - " output_dict={}\n", - " \n", - " for i in range(n_batches_output):\n", - " small_dataset = X_test[i*batch_size_output:(i+1)*batch_size_output]\n", - " output_dict[i] = nn.predict(small_dataset)\n", - " \n", - " output=np.concatenate([output_dict[i] for i in range(n_batches_output)])\n", - " return output\n" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Input for propagation (?, 10)\n", - "Logits shape (?, 2)\n", - "Input for propagation (?, 10)\n", - "Logits shape (?, 2)\n", - "\n", - " Evaluate model on test set...\n", - "INFO:tensorflow:Restoring parameters from mu_test_0/CNN_model.ckpt\n", - "Model restored.\n", - "Test accuracy: 0.9982\n" - ] - } - ], - "source": [ - "if __name__=='__main__':\n", - "\n", - " if task == 'TRAIN':\n", - " if not os.path.exists(PATH):\n", - " os.mkdir(PATH)\n", - " \n", - " elif os.path.exists(PATH):\n", - " if os.path.exists(PATH+'/checkpoint'):\n", - " ans = input('A previous checkpoint already exists, choose the action to perform \\n \\n 1) Overwrite the current model saved at '+PATH+'/checkpoint \\n 2) Start training a new model \\n 3) Restore and continue training the previous model \\n ')\n", - " \n", - " if ans == '1':\n", - " print('Overwriting existing model in '+PATH)\n", - " for file in os.listdir(PATH):\n", - " file_path = os.path.join(PATH, file)\n", - " try:\n", - " if os.path.isfile(file_path):\n", - " os.unlink(file_path)\n", - " #elif os.path.isdir(file_path): shutil.rmtree(file_path)\n", - " except Exception as e:\n", - " print(e)\n", - " \n", - " elif ans == '2':\n", - " PATH = input('Specify the name of the model, a new directory will be created.\\n')\n", - " os.mkdir(PATH) \n", - " bkg()\n", - "\n", - " elif task == 'TEST': \n", - " if not os.path.exists(PATH+'/checkpoint'):\n", - " print('No checkpoint to test')\n", - " else:\n", - " output = bkg()" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "if task=='TEST':\n", - "\n", - " Ds_mass_MC =[MC_sig_dict[\"Ds_ConsD_M\"][i][0] for i in range(m)]\n", - " NN_selected = X_dict[k[i]][0:output.shape[0]][np.argmax(output, axis=1).astype(np.bool)]\n", - " Ds_mass_sel_NN = [NN_selected[i][dim-1] for i in range(NN_selected.shape[0])]\n", - " Ds_mass_train_NN =X_dict[k[i]][:,dim-1]\n", - "\n", - " plt.subplot(1,2,1)\n", - " plt.hist(Ds_mass_MC,bins=70);\n", - " plt.subplot(1,2,2)\n", - " plt.hist(Ds_mass_sel_NN,alpha=0.8,bins=70);\n", - " plt.hist(Ds_mass_train_NN,alpha=0.2,bins=70);\n", - "\n", - " fig=plt.gcf();\n", - " fig.set_size_inches(20,8)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [], - "source": [ - "if task=='TRAIN':\n", - " hyper_dict={\n", - " 'k':k,\n", - " 'LEARNING_RATE':LEARNING_RATE,\n", - " 'BETA1':BETA1,\n", - " 'BATCH_SIZE':BATCH_SIZE,\n", - " 'EPOCHS':EPOCHS,\n", - " 'VAL_PERIOD':VAL_PERIOD,\n", - " 'SEED':SEED,\n", - " 'sizes':sizes,\n", - " 'LAMBD':LAMBD,\n", - " 'PATH':PATH,\n", - " }\n", - " with open(PATH+'/hyper_parameters.pkl', 'wb') as f: \n", - " pickle.dump(hyper_dict, f)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/DNN_selection.ipynb b/DNN_selection.ipynb deleted file mode 100644 index b47498f..0000000 --- a/DNN_selection.ipynb +++ /dev/null @@ -1,391 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import tensorflow as tf\n", - "import matplotlib.pyplot as plt\n", - "import os\n", - "import pickle\n", - "import math\n", - "\n", - "trunc_normal= tf.truncated_normal_initializer(stddev=1)\n", - "normal = tf.random_normal_initializer(stddev=1)\n", - "\n", - "from architectures.data_processing import *\n", - "from architectures.utils.toolbox import *\n", - "from architectures.DNN import *" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "l_index=1\n", - "mag_index=1" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "with open('/disk/lhcb_data/davide/Rphipi/NN_for_selection/'+l_flv[l_index]+l_flv[l_index]+'/'+'data_for_NN_'+l_flv[l_index]+l_flv[l_index]+'_Mag'+mag_status[mag_index]+'.pickle', 'rb') as f:\n", - " data_dict=pickle.load(f, encoding='latin1')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "data_dict[\"Ds_ENDVERTEX_CHI2\"]=data_dict[\"Ds_ENDVERTEX_CHI2\"]/data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "data_dict[\"Ds_OWNPV_CHI2\"]=data_dict[\"Ds_OWNPV_CHI2\"]/data_dict[\"Ds_OWNPV_NDOF\"]\n", - "data_dict[\"Ds_IPCHI2_OWNPV\"]=data_dict[\"Ds_IPCHI2_OWNPV\"]/data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "\n", - "del data_dict[\"Ds_ENDVERTEX_NDOF\"]\n", - "del data_dict[\"Ds_OWNPV_NDOF\"]\n", - "\n", - "data_dict[\"phi_ENDVERTEX_CHI2\"]=data_dict[\"phi_ENDVERTEX_CHI2\"]/data_dict[\"phi_ENDVERTEX_NDOF\"]\n", - "data_dict[\"phi_OWNPV_CHI2\"]=data_dict[\"phi_OWNPV_CHI2\"]/data_dict[\"phi_OWNPV_NDOF\"]\n", - "data_dict[\"phi_IPCHI2_OWNPV\"]=data_dict[\"phi_IPCHI2_OWNPV\"]/data_dict[\"phi_ENDVERTEX_NDOF\"]\n", - "\n", - "del data_dict[\"phi_ENDVERTEX_NDOF\"]\n", - "del data_dict[\"phi_OWNPV_NDOF\"]\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "branches_needed = [\n", - " \"Ds_ENDVERTEX_CHI2\",\n", - " #\"Ds_ENDVERTEX_NDOF\",\n", - " \"Ds_OWNPV_CHI2\",\n", - " #\"Ds_OWNPV_NDOF\",\n", - " \"Ds_IPCHI2_OWNPV\",\n", - " \"Ds_IP_OWNPV\",\n", - " \"Ds_DIRA_OWNPV\",\n", - " #l_flv[l_index]+\"_plus_MC15TuneV1_ProbNN\"+l_flv[l_index],\n", - " #\"Ds_Hlt1TrackMVADecision_TOS\",\n", - " #\"Ds_Hlt2RareCharmD2Pi\"+l_flv[l_index].capitalize()+l_flv[l_index].capitalize()+\"OSDecision_TOS\",\n", - " #\"Ds_Hlt2Phys_TOS\",\n", - " \"phi_ENDVERTEX_CHI2\",\n", - " #\"phi_ENDVERTEX_NDOF\",\n", - " \"phi_OWNPV_CHI2\",\n", - " #\"phi_OWNPV_NDOF\",\n", - " \"phi_IPCHI2_OWNPV\",\n", - " \"phi_IP_OWNPV\",\n", - " \"phi_DIRA_OWNPV\",\n", - " #\"Ds_ConsD_M\",\n", - " ] " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "#Number of input features\n", - "m=data_dict[\"Ds_ConsD_M\"].shape[0]\n", - "dim=len(branches_needed)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "data = extract_array(data_dict, branches_needed, dim, m)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(106404, 10)" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [], - "source": [ - "task='TEST'\n", - "\n", - "PATH=l_flv[l_index]+'_Mag'+mag_status[mag_index]+'_test_3'" - ] - }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "if task == 'TEST' and os.path.exists(PATH+'/hyper_parameters.pkl'):\n", - " with open(PATH+'/hyper_parameters.pkl', 'rb') as f: \n", - " hyper_dict = pickle.load(f)\n", - " #for key, item in hyper_dict.items():\n", - " # print(key+':'+str(item))\n", - " \n", - " #m=hyper_dict[\"m\"]\n", - " test_size=hyper_dict[\"test_size\"]\n", - " LEARNING_RATE=hyper_dict[\"LEARNING_RATE\"]\n", - " BETA1=hyper_dict[\"BETA1\"]\n", - " BATCH_SIZE=hyper_dict[\"BATCH_SIZE\"]\n", - " EPOCHS=hyper_dict[\"EPOCHS\"]\n", - " VAL_PERIOD=hyper_dict[\"VAL_PERIOD\"]\n", - " SEED=hyper_dict[\"SEED\"]\n", - " sizes=hyper_dict[\"sizes\"]\n", - " LAMBD=hyper_dict[\"LAMBD\"]\n", - " PATH=hyper_dict[\"PATH\"]" - ] - }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "def bkg(data):\n", - " \n", - " batch_size_output=5000\n", - " n_batches_output = m//batch_size_output\n", - "\n", - " tf.reset_default_graph()\n", - " nn = DNN(dim, sizes,\n", - " lr=LEARNING_RATE, beta1=BETA1, lambd=LAMBD,\n", - " batch_size=BATCH_SIZE, epochs=EPOCHS,\n", - " save_sample=VAL_PERIOD, path=PATH, seed=SEED)\n", - " \n", - " vars_to_train= tf.trainable_variables()\n", - " vars_all = tf.global_variables()\n", - " vars_to_init = list(set(vars_all)-set(vars_to_train))\n", - " init_op = tf.variables_initializer(vars_to_init)\n", - " \n", - " # Add ops to save and restore all the variables.\n", - " saver = tf.train.Saver()\n", - " gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.333)\n", - " \n", - " with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) as sess:\n", - " \n", - " sess.run(init_op)\n", - " print('\\n Selecting signal events with model...')\n", - " saver.restore(sess,PATH+'/CNN_model.ckpt')\n", - " print('Model restored.')\n", - " \n", - " nn.set_session(sess)\n", - " output_dict={}\n", - " \n", - " for i in range(n_batches_output):\n", - " small_dataset = data[i:i+batch_size_output]\n", - " output_dict[i] = nn.predict(small_dataset)\n", - " output=np.concatenate([output_dict[i] for i in range(len(output_dict))])\n", - " return output\n" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Input for propagation (?, 10)\n", - "Logits shape (?, 2)\n", - "Input for propagation (?, 10)\n", - "Logits shape (?, 2)\n", - "\n", - " Selecting signal events with model...\n", - "INFO:tensorflow:Restoring parameters from mu_MagDown_test_3/CNN_model.ckpt\n", - "Model restored.\n" - ] - } - ], - "source": [ - "if __name__=='__main__':\n", - " if not os.path.exists(PATH+'/checkpoint'):\n", - " print('No checkpoint')\n", - " else:\n", - " output=bkg(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 55, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0.84979254, 0.15020742],\n", - " [0.8513052 , 0.14869481],\n", - " [0.84863734, 0.15136267],\n", - " ...,\n", - " [0.8504716 , 0.14952841],\n", - " [0.85030866, 0.14969133],\n", - " [0.8818852 , 0.11811486]], dtype=float32)" - ] - }, - "execution_count": 55, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "output" - ] - }, - { - "cell_type": "code", - "execution_count": 56, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.argmax(output, axis=1).astype(np.bool).sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 57, - "metadata": {}, - "outputs": [], - "source": [ - "a = data_dict[\"Ds_ConsD_M\"][0:output.shape[0]][np.argmax(output, axis=1).astype(np.bool)]\n", - "b = [data_dict[\"Ds_ConsD_M\"][0:output.shape[0]][i] for i in range(output.shape[0])]" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [], - "source": [ - "NN_selected=np.array([a[i][0] for i in range(len(a))])\n", - "full = np.array([b[i][0] for i in range(len(b))])" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [], - "source": [ - "full=np.delete(full,np.where(full<0))" - ] - }, - { - "cell_type": "code", - "execution_count": 60, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.hist(full,alpha=0.4,bins=100, range=(0,3000));\n", - "plt.hist(NN_selected,alpha=0.4,bins=100, range=(0,3000));\n", - "fig=plt.gcf();\n", - "fig.set_size_inches(16,10)" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "9" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.random.randint(14)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.6.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/XGBoost.ipynb b/XGBoost.ipynb new file mode 100644 index 0000000..664c94c --- /dev/null +++ b/XGBoost.ipynb @@ -0,0 +1,565 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import tensorflow as tf\n", + "import matplotlib.pyplot as plt\n", + "import os\n", + "import pickle\n", + "import math\n", + "\n", + "from xgboost import XGBClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import accuracy_score, roc_auc_score\n", + "from architectures.data_processing import *\n", + "from architectures.utils.toolbox import *\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# IMPORTING THE DATASET" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "l_index=1\n", + "mother_ID=[\"Ds\",\"Dplus\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bkg data amounts to 13821 while signal MC amounts to 5881 Ds and 9639 Dplus samples\n" + ] + } + ], + "source": [ + "MC_Dplus_sig_dict, MC_Ds_sig_dict, data_bkg_dict = load_datasets(l_index)\n", + "\n", + "m_plus=MC_Dplus_sig_dict[\"Dplus_ConsD_M\"].shape[0]\n", + "m_s=MC_Ds_sig_dict[\"Ds_ConsD_M\"].shape[0]\n", + "n=data_bkg_dict[\"Ds_ConsD_M\"].shape[0]\n", + "\n", + "print('Bkg data amounts to {0} while signal MC amounts to {1} Ds and {2} Dplus samples'.format(n,m_s,m_plus))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#Normalising the Chi2 vertex fits to the NDoF\n", + "\n", + "MC_Ds_sig_dict[\"Ds_ENDVERTEX_CHI2\"]=MC_Ds_sig_dict[\"Ds_ENDVERTEX_CHI2\"]/MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "MC_Ds_sig_dict[\"Ds_OWNPV_CHI2\"]=MC_Ds_sig_dict[\"Ds_OWNPV_CHI2\"]/MC_Ds_sig_dict[\"Ds_OWNPV_NDOF\"]\n", + "MC_Ds_sig_dict[\"Ds_IPCHI2_OWNPV\"]=MC_Ds_sig_dict[\"Ds_IPCHI2_OWNPV\"]/MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "del MC_Ds_sig_dict[\"Ds_OWNPV_NDOF\"]\n", + "del MC_Ds_sig_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "#del MC_sig_dict[\"Ds_M\"]\n", + "\n", + "MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_CHI2\"]=MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_CHI2\"]/MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "MC_Dplus_sig_dict[\"Dplus_OWNPV_CHI2\"]=MC_Dplus_sig_dict[\"Dplus_OWNPV_CHI2\"]/MC_Dplus_sig_dict[\"Dplus_OWNPV_NDOF\"]\n", + "MC_Dplus_sig_dict[\"Dplus_IPCHI2_OWNPV\"]=MC_Dplus_sig_dict[\"Dplus_IPCHI2_OWNPV\"]/MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "\n", + "del MC_Dplus_sig_dict[\"Dplus_OWNPV_NDOF\"]\n", + "del MC_Dplus_sig_dict[\"Dplus_ENDVERTEX_NDOF\"]\n", + "\n", + "data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]=data_bkg_dict[\"Ds_ENDVERTEX_CHI2\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "data_bkg_dict[\"Ds_OWNPV_CHI2\"]=data_bkg_dict[\"Ds_OWNPV_CHI2\"]/data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", + "data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]=data_bkg_dict[\"Ds_IPCHI2_OWNPV\"]/data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "del data_bkg_dict[\"Ds_OWNPV_NDOF\"]\n", + "del data_bkg_dict[\"Ds_ENDVERTEX_NDOF\"]\n", + "\n", + "data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]=data_bkg_dict[\"phi_ENDVERTEX_CHI2\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "#data_bkg_dict[\"phi_OWNPV_CHI2\"]=data_bkg_dict[\"phi_OWNPV_CHI2\"]/data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", + "data_bkg_dict[\"phi_IPCHI2_OWNPV\"]=data_bkg_dict[\"phi_IPCHI2_OWNPV\"]/data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "\n", + "#del data_bkg_dict[\"phi_OWNPV_NDOF\"]\n", + "del data_bkg_dict[\"phi_ENDVERTEX_NDOF\"]\n", + "del MC_Ds_sig_dict[\"phi_M\"]\n", + "del MC_Dplus_sig_dict[\"phi_M\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def return_branches(mother_index=None):\n", + "\n", + " branches_needed = [\n", + " #________________________________________\n", + " #D\n", + " #________________________________________\n", + " #D Geometric variables, pT and FD\n", + " \n", + " mother_ID[mother_index]+\"_ENDVERTEX_CHI2\",\n", + " mother_ID[mother_index]+\"_IPCHI2_OWNPV\",\n", + "\n", + " mother_ID[mother_index]+\"_OWNPV_CHI2\",\n", + " mother_ID[mother_index]+\"_IP_OWNPV\",\n", + " mother_ID[mother_index]+\"_DIRA_OWNPV\",\n", + " \n", + " mother_ID[mother_index]+\"_PT\",\n", + " mother_ID[mother_index]+\"_FD_OWNPV\",\n", + " \n", + " #________________________________________\n", + " #PHI\n", + " #________________________________________\n", + " #phi geometric variables, pT and FD\n", + " \n", + " \"phi_ENDVERTEX_CHI2\",\n", + " \"phi_IPCHI2_OWNPV\",\n", + " \n", + " \"phi_PT\",\n", + " \n", + " #phi Reconstructed mass\n", + " \n", + " #\"phi_M\",\n", + " \n", + " #________________________________________\n", + " #PION\n", + " #________________________________________\n", + " #pi Geometric variables and pT\n", + " 'pi_PT',\n", + " \n", + " #________________________________________\n", + " #LEPTONS\n", + " #________________________________________\n", + " #leptons Geometric variables and pT\n", + " \n", + " l_flv[l_index]+\"_plus_PT\",\n", + " l_flv[l_index]+\"_minus_PT\",\n", + " \n", + " \n", + " #D Reconstructed mass\n", + " mother_ID[mother_index]+\"_ConsD_M\",\n", + " ] \n", + " return branches_needed" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "#Number of input features\n", + "\n", + "dim=len(return_branches(mother_index=0))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "#Convert data dictionaries to arrays for NN\n", + "\n", + "MC_Ds_sig = extract_array(MC_Ds_sig_dict, return_branches(mother_index=0), dim, m_s)\n", + "MC_Dplus_sig = extract_array(MC_Dplus_sig_dict, return_branches(mother_index=1), dim, m_plus)\n", + "data_bkg = extract_array(data_bkg_dict, return_branches(mother_index=0), dim, n)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(MC_Ds_sig[:,dim-1],alpha=0.5,bins=30);\n", + "plt.hist(MC_Dplus_sig[:,dim-1],alpha=0.5,bins=30);\n", + "plt.hist(data_bkg[:,dim-1],alpha=0.5,bins=200);\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(16,8)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "#Cut on Ds Mass\n", + "\n", + "#data_bkg_cut=data_bkg[np.where(data_bkg[:,dim-1]>1915)]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "#Add 0/1 label for bkg/sig\n", + "\n", + "MC_Dplus_sig_labelled=add_labels(MC_Dplus_sig,signal=True)\n", + "MC_Ds_sig_labelled=add_labels(MC_Ds_sig,signal=True)\n", + "data_bkg_labelled=add_labels(data_bkg,signal=False)\n", + "\n", + "#Merge MC sig and data bkg, shuffle it\n", + "\n", + "data=np.concatenate((data_bkg_labelled,MC_Ds_sig_labelled), axis =0)\n", + "data=np.concatenate((data,MC_Dplus_sig_labelled), axis =0)\n", + "np.random.seed(1)\n", + "np.random.shuffle(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "#get train size\n", + "train_size=data.shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "#Strip away the label column and convert it to a one-hot encoding\n", + "\n", + "X=data[:,0:dim]\n", + "Y_labels=data[:,dim].astype(int)\n", + "Y_labels=Y_labels.reshape(train_size,1)\n", + "#Y_labels_hot = to_one_hot(Y_labels)\n", + "#Y_labels=Y_labels_hot\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "#Divide the dataset k \"equi populated\" sets\n", + "\n", + "k=5 #number of subsets\n", + "i=0 #number of subset that is train set\n", + "\n", + "X_train, Y_train, X_test, Y_test, X_dict, Y_dict = k_subsets(i, k, X, Y_labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.528952660100201" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.float((m_s+m_plus)/(train_size))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "#np.argmax(Y_train, axis=1).sum()/Y_train.shape[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_mean=X_train.mean(axis=0)\n", + "X_train_1=X_train-X_mean\n", + "X_std=X_train_1.std(axis=0)\n", + "X_train_2=X_train_1/X_std\n", + "X_train_2.std(axis=0)\n", + "\n", + "\n", + "X_mean=X_test.mean(axis=0)\n", + "X_test_1=X_test-X_mean\n", + "X_std=X_test_1.std(axis=0)\n", + "X_test_2=X_test_1/X_std\n", + "X_test_2.std(axis=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# SETTING UP THE NETWORK" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n", + " colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,\n", + " max_depth=3, min_child_weight=1, missing=None, n_estimators=100,\n", + " n_jobs=1, nthread=None, objective='binary:logistic', random_state=0,\n", + " reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,\n", + " silent=True, subsample=1)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# fit model to training data\n", + "model = XGBClassifier()\n", + "\n", + "y=Y_train.reshape(Y_train.shape[0])\n", + "\n", + "model.fit(X_train_2, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "output=model.predict_proba(X_test_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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X30lSfrmm2/UrFkzFS9eXKVLl1b37t21Y8eO4DE3bNggM9PUqVPVq1cvRUVFqUKFCnrjjTckSSNHjlT58uUVExOjAQMG6Pjx41m2L7v+TpJeeeUVXXjhhSpatKjOPfdcjRw5Mt3+q1atUuvWrRUdHa3IyEjVqlVLzz//fI6OndGIESNUtWpVRUREKC4uTq1bt073e7F3717dfvvtiouLU0REhC6//PLgZyZJJUqUkCT16tUreL4NGzZk/R8nFxCCASCNTp06aceOHfrss88kSZ9++ql27dqljh07pqt39OhRffHFF2rduvUpnad///767LPPNGbMGM2fP1/Dhw/P9g+UAwcOqFWrVjp48KCmTJmihx9+WPfff79+/fXXTHV//fVX/eMf/9CgQYM0ZcoU7dy5UzfccEMw2EvS5s2bdffdd2vWrFkaN26cUlJS1LhxY+3fv/+k3se0adPUqVMn1a9fX7Nnz9bgwYM1duxYPfTQQ5ICo+LlypXTtGnT0u03Y8YMSQp+rp9//rmaNWum+Ph4TZ8+XU8//bTmzp2rXr16ZTpnt27d1L59e82YMUPVqlVT165dtXnzZknSCy+8oJo1a6pNmzZaunSpli5dqqSkJP3888+6/vrr1bRpU7333nuaPHmy2rZtq717957U+/Whf0ua55yrKeliSaslDZT0oXOumqQPvdeSdK2kat6jr6QX87+5AOrWratnn31WkyZN0p49e3K834n6pXXr1qlx48Y6dOiQXn/9dU2cOFGrVq1Su3bt0vUvGd1zzz16/PHH1bdvX82ZM0cdO3ZU79699f777wfrvP766+rUqZPOP/98TZs2TRMmTFD16tW1a9cu3XrrrerWrZvi4+OD/64/8sgjknLWd2zdulXXXnutoqOjNX36dN1+++3q3r27Dhw4kO3nsXTpUl166aW65pprtHTp0mC/JQXCbHJysh566CHNnTtXVapU0a5du9SkSRMdOHBAb775pp599lktWbJELVq00JEjR9Ide8CAASpXrpzeeecdXXnllerRo4ceeOABLVu2TOPHj9d9992nkSNHZuo708qqv5OkUaNG6c4779R1112n999/X3feeaceeeQRPffcc8H927dvr7CwML3xxhuaPXu27rnnnuCXB9kdO6PXXntNw4cPV//+/TV//ny9+OKLqlq1qv766y9J0uHDh9W8eXMtXLhQo0aN0syZMxUTE6PmzZsHg/JHH30kSXr44YeD5ytXrly2/31OF9OhASCNUqVKqXXr1po6daquvPJKTZ06Va1bt1apUqXS1duzZ48OHz6sSpUqndJ5li1bpn79+unGG28Mlv3P//xPlvUnTJigPXv2aMWKFUpISJAknX/++WrQoEGmunv37tXnn38eXOTr+PHj6tixo9auXauaNWtKCoxip0pJSVGLFi0UGxurWbNm6ZZbbsnRe3DO6R//+IduueUWvfDCC8HyokWLql+/fnrooYdUpkwZdenSRW+99ZaGDh0arPPWW2+pZcuWio6OliQNHDhQl19+ud56661gnYSEBDVr1kwrV65U7dq1g+X3339/cPS9Xr16iouL0/vvv6877rhDF1xwgSIjIxUTE6OGDRsG91myZIlKlCihUaNGBcuym94GycyiJF0lqackOeeOSDpiZh0kNfGqTZL0saQBkjpIes0F/hr+0htFLuec25bPTQd87fnnn9d1112nnj17ysxUq1Ytde7cWQ8++KCioqKy3O9E/dLQoUMVHx+vDz74IDj1t06dOqpZs6bmzp0bMiStW7dOL774oiZMmKAePXpIkpo3b65t27Zp6NChatu2rY4fP66BAweqY8eOmjJlSnDf9u3bB5+XK1dORYsWTffvupSzvuPpp59WRESE5syZo+LFi0sKXP6UXZ8rSQ0bNlRUVJSio6MznXfPnj1atGiRLrnkknRtkaT58+cHP+fq1aurQYMGeuedd3TTTTcF6zZt2jQ4Xb1BgwaaPn26Zs+erTVr1igsLEytW7fWrFmzNGPGjJAz0SRl2d/9/vvvGjp0qB5++OHgFPgWLVrowIEDevzxx3XnnXfqt99+0y+//KKZM2fqoosCU+6bNWt2wmOHsmzZMrVs2VJ33XVXsKxTp07B52+88YZWrlypVatWBf8uad68uWrUqKHRo0dr1KhRuuyyyyQF/q450flyCyPBAJBB165dNX36dB0+fFjTp0/PsgOSTv1+dZdccolGjRqlF154QT/++OMJ6y9fvlz16tULBmBJql+/vuLi4jLVrVy5crpVri+44AJJCo6WStKXX36pFi1aqEyZMipcuLCKFy+uP//8M0dtSfXjjz/q119/1Q033KBjx44FH02bNtWhQ4eCq4PeeOONWrt2rb799ltJ0u7du/XRRx8F/9A6cOCAli5dmuk4V1xxhcLDwzNdi92yZcvg8zJlyig2Njbdewvloosu0v79+9WjRw8tWLAg+A01snWepF2SJpjZf8zsFTOLlBSXGmy9n7Fe/QRJm9Lsv9krA5CP6tSpo9WrV2v27Nm666675JzT//3f/ykxMVF//vlnlvudqF9atGiROnbsqEKFCgX/na5SpYoqV66caUHJVB9++KEKFSqkjh07pvv3vVmzZvrmm2+UkpKitWvXauvWrSFn/mQnp33HsmXL1KJFi2AAltKHtFORkJCQLgCnnqdly5bpvmioX7++KleuHJxdlipt4IyKilJMTIyuvvpqhYWFBcurVq2qLVu2nHTbli5dqr/++ktdunTJ1Dfv2LFDmzdvVnR0tCpWrKg77rhDb731lnbu3HnS50l1ySWXaO7cuRo8eLCWLVumlJSUdNsXLVqkevXqqUqVKsG2SIGZYln93uQHQjDyVeWBczI9gDNN+/bt9eeff2rQoEH666+/1K5du0x1ypQpo6JFi4acjpwTzz33nK677jo99thjqlGjhqpVq6apU6dmWX/79u2KiYnJVB6qLOOodeo39ocOHZIUmC7dsmVLOef08ssv6/PPP9fy5csVGxsbrJMTqbeAatOmjcLDw4OPKlWqSJI2bQrkoUaNGqlSpUrBb+rfeecdFS5cWNddd52kwPXBKSkpuuuuu9Idp2jRojp69GjwONm9vxO1u0aNGpo1a5Z++eUXtWnTRmXLllW3bt20a9euHL9fHyosqa6kF51zl0r6S/+d+hxKqG+EMs2RNLO+ZrbCzFbw+eOscvxY5scZqmjRomrXrp2ee+45/fDDD3rllVf0008/pVuHIaMT9Uu7d+/Wk08+me7f6fDwcP3yyy+Z/p1Ou09KSopKliyZbp+ePXvq2LFj2rZtW3DK9slOf81p37F9+3bFxsam27dYsWI655xzTup8aYX6Anrbtm0hy+Pi4jJdehOqHzuVvi2U1L75wgsvTPe5XHPNNZICfXOhQoW0YMECxcfHq3fv3oqPj9eVV16p//znPyd9vt69e2v48OGaNm2aGjRooLi4OD3yyCPBMLx79259+eWXmX5vJkyYkOXvTX5gOjQAZBAZGam2bdtqzJgx6tKliyIjIzPVCQ8PV+PGjTV//nw9/vjjJ32OUqVK6ZlnntEzzzyj7777TiNHjlT37t1Vp06d4MhtWvHx8Vq7dm2m8lMJEfPmzdOBAwc0a9as4Hs7duzYSV8fmzqVeezYsbr00kszbU8Nw2amG264QW+99ZaGDx+ut956S9dee21wIYxSpUoF78Ecaopy+fLlT6pdWUlKSlJSUpL279+vOXPm6L777tM999yT7ZcPPrdZ0mbnXOrqJdMVCME7Uqc5m1k5STvT1K+YZv8KkrZmPKhzbqyksZKUmJiY9YWEAHJNnz59lJycrDVr1mRZ50T9UnR0tDp27Khbb701075Z3dc+OjpahQsX1ueff65ChTKPvcXGxgavQ9227eSunMhp3xEfH59ppPPgwYPZjoqfSKhZYOXKlQs5orpjxw7Vq1fvlM91slL75vfffz9kKK9Ro4YkqWbNmnrnnXd09OhRffrppxowYICSkpK0efPmkP+tslKoUCHdf//9uv/++7Vp0yZNnjxZgwYNUkJCgu644w5FR0crMTFRL76YeZmIokWLnuK7PH2EYAAI4c4779Thw4d1xx13ZFnnvvvuU/v27TVp0qTgtU6pjh8/rgULFuRo4aw6depo1KhRmjx5stasWRMyBF922WWaPHmytmzZEpwSvWzZsnSrTubUwYMHVahQIRUu/N8uYNq0acEpSjlVo0YNJSQkaMOGDSe8J3LXrl311FNP6f3339eSJUvSXfcVGRmphg0bau3atXr00UdP7s2EcKJvz0uWLKlu3bppyZIlWrp06Wmf7+/KObfdzDaZWQ3n3FpJzST94D16SHrC+znL22W2pLvNbKqkBpL2cz0wkP927tyZaeRz165d2r9/f8hQFEqofin1Ott69erl+FKgpk2bKiUlRfv371eLFi1C1kntSyZNmhRy5pUU+t/1nPYdl112mcaPH68DBw4Ep0SnvatAbmnQoIFefPFF/fHHH8EveZcvX64NGzboiiuuyPXzSaE/l0aNGqlYsWLaunVrlotZpRUeHq6mTZuqf//+6tatm/bt26fo6OhTGomuWLGiBg4cqAkTJuiHH36QFJj6vWDBAlWqVCnT72Xa9yHplEa+TxUhGABCaNKkiZo0aZJtnXbt2ql///7q06ePPv/8c3Xo0EHnnHOO1qxZo5deekmVK1fOMgRfccUV6tixo2rXri0z07hx4xQZGan69euHrN+rVy89/vjjatu2rQYPHqyDBw9q8ODBiomJOalvbKX//lHSq1cv9enTR6tWrdJTTz2VaSrWiRQqVEijR4/WzTffrN9//13XXnutihQpElxsY/r06cE/OOrVq6eqVauqb9++KlasmNq2bZvuWCNHjlSzZs1UqFAhXX/99SpRooR+/fVXzZkzR8OGDVP16tVz3K6aNWtq/vz5mj9/vsqUKaMqVapo+vTpWrp0qVq3bq3y5cvrp59+0ttvv53jRcB87B5Jk82siKRfJPVS4FKqaWbWR9Kvkrp4dedKaiNpnaQDXl0A+eyiiy5Shw4d1LJlS8XGxmrjxo166qmnVLx48Uxf2KZ1on5pyJAhql+/vpKSktR6QALEAAAgAElEQVS7d2+VLVtWW7Zs0cKFC9WzZ8+QfWaNGjV0xx13qGvXrkpOTlZiYqIOHTqkVatW6ccff9Qrr7yiQoUKBUedu3fvrptuuklmpo8++kg33XSTEhMTVbNmTe3YsUMTJ05U7dq1VbZsWVWuXDlHfcd9992n559/Xm3btlX//v21detWjRgxQsWKFcvVz71///568cUX1apVKw0YMEB//vmnBg4cqIsuukidO3fO1XOlCtXflSlTRkOGDNH//u//auPGjbrqqqt0/Phx/fjjj1q8eLFmzJih7777Tg8++KBuvPFGnXfeefrtt9/05JNP6uKLLw6OJGd17Ixuv/324OJhJUuW1OLFi/XTTz/pySeflCTdcssteumll9SkSRM9+OCDOu+887Rnzx4tW7ZM8fHxuv/++1WkSBFVqVJF06ZNU+3atRUREaE6derk6b2XCcEAcBpGjx6tyy+/XM8995y6deumgwcPqnLlymrfvr0efPDBLPdr1KiRJk6cqA0bNigsLEyXXnqpPvjgA1WoUCFk/eLFi2vevHm68847deONNwY7/+Tk5GxX+wzloosu0oQJEzR06FDNmDFDF198sd5+++10K4Lm1I033qioqCgNHz5c48ePV1hYmM477zy1bds2U+d14403atiwYeratWu6BUqkwB9fn3zyiQYPHqybb75ZKSkpOvfcc9W6descj1ykevjhh4MLdv3++++aMGGC6tSpo9mzZ6t///7au3evypUrp9tuu02PPfbYSb9nP3HOfSMpMcSmZiHqOkn98rxRALL16KOPatasWbr33nu1d+9excfHB1dQTr1MJZQT9UvVq1fXl19+qYcfflh9+/bVwYMHgysxV61aNcvjPv/886pevbrGjRunRx99VFFRUbrgggvUp0+fYJ1u3bopIiJCw4YN0/XXXx8c5U1d9+KGG27Q4sWLlZycrF27dqlHjx6aOHFijvqOhIQEzZ07V/fee686d+6sWrVq6Y033lCHDh1y4+MOiomJ0eLFi/XAAw/opptuUpEiRdSmTRuNGTMmz8JcqP6uZ8+eSk5OVvny5TVmzBiNHj1aERERql69erCfj4+PV1xcnIYNG6atW7eqVKlSuuaaa4LBNbtjZ9SoUSONGzdOL7/8sg4dOqSqVatq3LhxwXU/IiIitHjxYj366KMaPHiwduzYodjYWNWvXz/dCuAvvfSSHnzwQTVv3lyHDx/W+vXrg/dmzguW3X29/k4SExNdQa5AhoBQC2FteOLEUzVwZlu9erVq1apV0M3wnfXr16t69eoaO3bsSa+qiZzJ7nfbzL52zoUKiMgh+macabLtz46EuK9skeKZywDkqdzomxkJBoCzxIgRI1S+fHmde+65+vXXXzVixAjFxMTk2TQrAACAvyNCMACcJcxMQ4cO1datW1W0aFFdeeWVeuqpp056OjQAAICfEYIB4CwxcOBADRyY3W1aAQAAcCInt6QoAAAAAABnMUIwAAAAAMA3CMEAcoVfVpqHf/A7DQDA3xMhGMBpCw8P18GDBwu6GUCuOnjwoMLDwwu6GQAAIJcRggGcttjYWG3ZskUHDhxg9AxnPeecDhw4oC1btig2NragmwMAAHIZq0MDOG2pt+jZunWrjh49WsCtAU5feHi44uLiuP0UAAB/Q4RgALkiKiqKwAAAAIAzHtOhAQAAgL8BMzvh4+OPP86Vc/3www8aMmSI/vzzz1w53onMnTtXzz33XI7rb9iwQeecc442bdoULPvll1/UrVs3VaxYUREREapUqZI6duyopUuXnlbb4uPj033GsbGxateunVatWpWuXp8+fdSvX7/TOhdyByPBAAAAQHa2/kc6eihzeXhE3p63/KUnVT1tmDt48KCaNm2qhx9+WElJScHyCy64IFea9sMPP2jo0KG64447dM455+TKMbMzd+5cLVq0SHfffXeO6g8dOlRdunRRxYoVJUm7du1SgwYNVKVKFY0aNUpxcXFav369Zs6cqa+++kqNGjU6rfb17NlTt99+u5xz2rJlix5//HG1atVKq1evVokSJSRJycnJuuSSSzRgwABV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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.suptitle('S/B selection from NN', fontsize='15')\n", + "Ds_mass_MC =[MC_Ds_sig_dict[\"Ds_ConsD_M\"][i][0]/1000 for i in range(m_s)]\n", + "Dplus_mass_MC =[MC_Dplus_sig_dict[\"Dplus_ConsD_M\"][i][0]/1000 for i in range(m_plus)]\n", + "NN_selected = X_dict[i][np.argmax(output,1).astype(np.bool)]\n", + "Ds_mass_sel_NN = NN_selected[:,dim-1]/1000\n", + "Ds_mass_train_NN =X_dict[i][:,dim-1:dim]/1000\n", + "\n", + "plt.subplot(1,2,1)\n", + "plt.hist(Ds_mass_MC+Dplus_mass_MC,bins=70, label='MC signal events');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "plt.subplot(1,2,2)\n", + "\n", + "plt.hist(Ds_mass_sel_NN,alpha=0.6,bins=70, label='S selected from test set');\n", + "plt.hist(Ds_mass_train_NN,alpha=0.2,bins=70, label='Test set (S+B)');\n", + "plt.legend(fontsize='15')\n", + "plt.ylabel('# events', fontsize=15)\n", + "plt.xlabel('Reconstructed D_s Mass (GeV)', fontsize=15)\n", + "fig=plt.gcf();\n", + "fig.set_size_inches(16,8)\n", + "plt.savefig('/home/hep/davide/D_s_NN.png', format='png', dpi=100)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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SaJVVFTo6aef1uOPP67169crJydHF198sSSprKxMXbp00YwZM5JcZUuBgtvMekv6saSHJM0PtaJ4avwGZuogEJrTTjvthKsdU1lhYaEKCyNTp9evX6+uXbtGg3v27NnJLK1NQYdKHpN0l6T6EGsBkEb27NmjESNGaNCgQRo0aFCrpzrdvn27ioqKVFBQoPz8fO3cuVOStHz58uj3Z82apePHj7f42dzcXN19990qKipSUVGRdu3aJUnau3evSkpKlJ+fr5KSEu3bt0+S9MILLygvL08DBw7UJZdcIikS1mPGjNGePXtUVlamRYsWqaCgQG+99Zbuu+8+/eY3v1FVVZWKioqatCs/P1+StHnzZl166aX64Q9/qFGjRumzzz6TJD3++OMaMGCA8vPzNXny5Dg+qxExg9vMxkj63Dm3OcZ2M82swswqDhw4ELcCAaS+mpoaFRQUqKCgQNdcc42kyHLwdevW6b333lN5ebnmzp3b4ufKysp0++23q7KyUhUVFerdu7eqqqpUXl6ud955R5WVlcrKytKKFStafdzTTz9dmzZt0pw5c3THHXdIkubMmaMZM2Zo69atmjp1avRx77//fr3yyit6//33tXr16ib7yc3N1ezZszVv3jxVVlZqxIgR0fv69++vr7/+Wrt375YklZeXa+LEiaqtrdXPfvYzrVy5Ups3b9bNN9+se++9V1LklLFbtmzR1q1bW11q31FBhkqGSbrazK6S1FnS6Wa23Dk3rfFGzrklkpZIkSXvca8UQMpqbaiktrZWc+bMiYbvRx+1vKTaRRddpIceekjV1dUaP368+vbtq9dee02bN2+OnnukpqZGvXr1avVxp0yZEv1/3rx5kqQNGzboj3/8oyRp+vTpuuuuuyRJw4YN04033qiJEydq/Pjx7WrfxIkT9fzzz6u0tFTl5eUqLy/Xjh07tG3bNl155ZWSIpc+O/vssyVJ+fn5mjp1qsaNG6dx48a167GCiBnczrl7JN0jSWZ2maQ7m4c2ADS3aNEifec739H777+v+vp6de7cucU2119/vYYMGaI1a9Zo1KhRWrp0qZxzuuGGG/Tww7EPsjY+zeuJrp7+zffLysr07rvvas2aNSooKGjXmPykSZN03XXXafz48TIz9e3bVx988IG+//3va8OGDS22X7Nmjd58802tXr1aDzzwgLZv3x49G2E8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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "true_positives=output[:,1][np.where(Y_test==1)[0]]\n", + "false_positives=output[:,1][np.where(Y_test==0)[0]]\n", + "plt.hist(true_positives,alpha=0.5,bins=80,density=True,label=\"True positives\");\n", + "plt.hist(false_positives,alpha=0.5,bins=80,density=True, label=\"False positives\");\n", + "plt.legend()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pAUC 0.8704610495805598\n" + ] + }, + { + "data": { + "image/png": "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10lEPAsXLuTGG2/k2WefdR1FRPxI5eyjHTvgv//VlLYEjtjYWDp16kTt2rUZMmSI6zgi4kcqZx8tWeLdx8S4zSEC8Mknn9C1a1fq16/PkiVLKFOmjOtIIuJHKmcfxcVB6dJw7bWuk0i4O3jwIAMGDKBhw4YsXryYUqVKuY4kIn6mRUh8YK1Xzi1bQh79OSOOFS9enEWLFnHllVdStGhR13FEJAeoanzw44+wbZv2N4tbEyZM4M033wQgMjJSxSwSwlTOPtAlIsW1f//73wwYMID58+eTlpbmOo6I5DCVsw/i4qBmTaha1XUSCUdvvfUW9957Lx06dGDOnDlERES4jiQiOUzlnIlTpyA+XqNmceO1117jwQcfpEuXLsyePZuCBQu6jiQiuUDlnIlvv4UjRyA62nUSCUcFChSgR48eTJ8+nfz587uOIyK5ROWciaQk7/6GG9zmkPBhreWXX34B4IEHHmDq1Knky5fPbSgRyVUq50wkJUH58nDZZa6TSDiw1vLEE09Qr1491q9fD4AxxnEqEcltKudMrFgBkZGg34+S06y1DBs2jJdffpm+fftSs2ZN15FExBGV8wUcOeKd43z99a6TSKhLT0/ngQceYOTIkQwePJjRo0eTRyveiIQt/fRfwPffe6uDRUa6TiKhbuLEiYwaNYqHH36YN954Q1PZImFOy3dewIoV3n3Dhm5zSOjr168fhQoVokePHipmEdHI+UKSkqByZShXznUSCUWpqak8+uijbN++nbx589KzZ08Vs4gAKucLSkrS/mbJGSdPnqRnz568+uqrfPbZZ67jiEiAUTmfx4EDsGGD9jeL/504cYLu3bsza9YsRowYwV133eU6kogEGO1zPo9vv/XuVc7iTykpKXTr1o358+czatQo7rvvPteRRCQAqZzP48zKYCpn8adjx46RnJzMe++9pxGziJyXyvk8kpLgiiugZEnXSSQUHDlyhPz581O6dGmSkpK0TraIXJD2OZ/HmZXBRLLr4MGDtGnThj59+mCtVTGLSKZUzhnYvRt+/VVHakv27d+/n9atW/PNN99w22236VQpEfGJprUzoIPBxB/27t1Lq1atWL16NbNmzaJTp06uI4lIkFA5Z2DFCu9CF9de6zqJBCtrLV27dmXt2rV8+umntGvXznUkEQkiPk1rG2PaGmPWG2M2GmMev8B2txpjrDEmqMecSUlw5ZVQrJjrJBKsjDG88sorxMbGqphFJMsyLWdjTAQwCmgH1AV6GWPqZrBdUWAw8LW/Q+Y2rQwmF+u3337j3XffBaBx48bExMQ4TiQiwciXkXMjYKO19mdr7UlgGtA5g+2eB14BjvsxX67bts27aX+zZNWWLVto3rw5Dz/8MNu3b3cdR0SCmC/lXBHYetbz5NMf+x9jzLVAZWtt7IW+kDHmHmNMkjEmaffu3VkOmxu0+IhcjJ9//pmbb76ZPXv2EBcXR4UKFVxHEpEg5ks5Z3Tuh/3fJ43JA4wEhmX2hay171prI621kWXLlvU9ZS5KSoKICGjQwHUSCRYbNmygefPmHD58mKVLl9K4cWPXkUQkyPlSzslA5bOeVwK2nfW8KFAPiDfG/ALcAMwN1oPCVqyAq66CQoVcJ5Fg8dVXX3Hy5EmWLVvGdddd5zqOiIQAX8p5BVDTGFPdGJMf6AnMPfNJa+1Ba20Za201a2014Cugk7U2KUcS5yBrvZGzprTFFydOnACgb9++/PTTT9SvX99xIhEJFZmWs7U2FRgELAR+BD621q4xxjxnjAmpVRW2bIE9e3SktmTu+++/p2bNmiQkJABQvHhxx4lEJJT4tAiJtXYeMO+cjz1znm2jsh/LjRUrvHuNnOVCvvnmG9q0aUOxYsWoVKmS6zgiEoK0tvZZkpIgXz64+mrXSSRQffHFF8TExFCyZEkSExO54oorXEcSkRCkcj5LUhLUrw8FCrhOIoHoxx9/pHXr1pQvX57ExESqVq3qOpKIhCiV82np6VoZTC7syiuvZMiQISQkJGg6W0RylMr5tE2b4OBB7W+WP1u8eDFbtmwhT548PP/881pgRERynMr5NK0MJhn5z3/+Q4cOHRg6dKjrKCISRlTOpyUlQcGC3gIkIgCzZs2ia9euXHPNNbz33nuu44hIGFE5n7ZihXf95ry6wrUAU6dOpUePHjRq1Ii4uDhKlizpOpKIhBGVM5CWBt99pylt8aSlpTFy5EiaNm3KggULtMCIiOQ6jROB9evh6FEdqS2Qnp5OREQE8+fPp2DBghQuXNh1JBEJQxo5o5XBxDN69Gg6derEiRMnKF26tIpZRJxROeMdDFakCNSq5TqJuPLGG29w//33kyePfiRExD39JsIr5+uu867jLOHnlVdeYciQIXTr1o2ZM2dSQEvEiYhjYV/Op07BypXa3xyuXn/9dR577DF69uzJtGnTyJ8/v+tIIiIq5zVr4Phx7W8OVy1atOD+++9nypQp5NV5dCISIMK+nLUyWPix1hIXFwfAddddxzvvvEOE9mmISAAJ+3JeuRKKFQNd+S88WGsZMmQIrVu3ZsGCBa7jiIhkKOzn8datg9q1wRjXSSSnpaenM2jQIMaMGcODDz5ImzZtXEcSEclQ2I+c16/3yllCW3p6OgMHDmTMmDE8+uijjBw5EqO/yEQkQIV1OR8+DMnJcOWVrpNITvviiy8YP348Tz/9NC+99JKKWUQCWlhPa//0k3evkXPoa9asGd999x0NGjRwHUVEJFNhPXJev96718g5NJ08eZLevXv/78AvFbOIBIuwLud16yBPHqhRw3US8bcTJ05w6623MnXqVDZs2OA6johIloT1tPb69XD55aDVGkNLSkoKXbt2ZcGCBYwePZp7773XdSQRkSwJ63Jet05T2qHm+PHjdOzYkaVLlzJu3DgGDBjgOpKISJaF7bR2erp3QJgOBgst+fPnp1atWkyaNEnFLCJBK2xHzlu2eGtqa+QcGg4ePMj+/fupVq0ao0ePdh1HRCRbwrac163z7jVyDn779++nTZs27N+/nzVr1ujKUiIS9MK2nHUaVWjYs2cPrVq1Yu3atcycOVPFLCIhIWzLed06KFkSypZ1nUQu1s6dO4mJiWHjxo18+umntG3b1nUkERG/CNtyPrOmtlZxDF6PPvoomzZtIjY2lpYtW7qOIyLiN2F7tLZOowp+b775JsuWLVMxi0jICctyPnQItm/XwWDB6JdffuHOO+8kJSWFEiVK0LhxY9eRRET8LizLWQeDBadNmzbRvHlzPvnkE37++WfXcUREckxYlrNOowo+69ev5+abb+bo0aMsXbqUq666ynUkEZEcE5YHhK1fD3nzwhVXuE4ivli7di3R0dFYa1m2bBlXX32160giIjkqbEfOl18O+fK5TiK+SE9Pp1y5csTHx6uYRSQshO3IWVPagS85OZmKFStSr149vv/+e/LkCcu/JUUkDIXdb7u0NO+CFzoYLLB9/fXX1KtXjxEjRgComEUkrITdb7xffoGTJzVyDmTLly+nVatWlC5dmltvvdV1HBGRXBd25azTqAJbfHw8bdq0oUKFCiQmJlK1alXXkUREcl3YlbNOowpc+/bto1OnTlStWpWEhAQqVqzoOpKIiBNhd0DY+vVQpgyULu06iZyrVKlSfPjhh9xwww2U1RVJRCSMhV05a03twDN37lwAOnXqRMeOHR2nERFxLyyntTWlHThmzZpFt27deO2117DWuo4jIhIQwqqc9++HXbs0cg4UU6dOpUePHjRq1IjY2FiMrt8pIgKEWTmfOVJbI2f3Jk2aRJ8+fWjWrBkLFy6kWLFiriOJiASMsCxnjZzdW7lyJdHR0cybN48iRYq4jiMiElDC6oCwdeu89bSrV3edJHwdPHiQ4sWLM2LECE6ePEmBAgVcRxIRCThhN3KuUUMXvHBl5MiR1K1bly1btmCMUTGLiJxHWJWzTqNy5+WXX2bo0KE0adKEChUquI4jIhLQwqacU1Nh40YdDObC888/z+OPP06vXr2YOnUq+TR1ISJyQWFTzps3w6lTGjnntvHjx/PMM89wxx13MHnyZPLmDavDHERELkrY/KbUmtpu3Hbbbezbt49hw4bpso8iIj4Km9+WOo0q91hrefvttzly5AhFixblkUceUTGLiGRB2PzGXLcOLr0USpZ0nSS0paenc9999zF48GCmTJniOo6ISFAKm2nt9es1pZ3T0tLSuPvuu3n//fd5/PHHGThwoOtIIiJBKaxGzprSzjmpqan89a9/5f333+fZZ59l+PDhWitbROQihcXI+fBh2LPHW4BEcsb27dtZvHgx//rXv/j73//uOo6ISFALi3Levt27v+wytzlC0alTp8ibNy+VK1dmzZo1lCpVynUkEZGgFxbT2jt2ePfly7vNEWqOHz9O165deeSRRwBUzCIifhJW5axVI/0nJSWFzp07ExsbS82aNV3HEREJKWE1ra2Rs38cPXqUjh07Eh8fz4QJE+jfv7/rSCIiISUsynnHDu9KVJp1zT5rLZ07dyYhIYEPPviAPn36uI4kIhJywmJae/t2b9SsM3uyzxjDfffdx9SpU1XMIiI5JGxGzprSzp59+/bxzTff0LZtW7p27eo6johISAuLct6+HapVc50ieO3Zs4dWrVqxYcMGNm/eTNmyZV1HEhEJaWExra2R88XbuXMnUVFRrFu3jtmzZ6uYRURyQciPnFNTYfdulfPF2LZtGy1btmTLli189tlnREdHu44kIhIWQr6cd+0Ca3WO88WYOnUqycnJLFiwgJtuusl1HBGRsBHy09paHSzr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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "\n", + "tp=output[:,1][np.where(Y_test==1)[0]]\n", + "fp=output[:,1][np.where(Y_test==0)[0]]\n", + "\n", + "def sig_eff(tp,threshold):\n", + " \n", + " sig_eps = np.where(tp>threshold)[0].shape[0]/tp.shape[0]\n", + " return sig_eps\n", + "\n", + "def bkg_eff(fp,threshold):\n", + " \n", + " bkg_eps = np.where(fp>threshold)[0].shape[0]/fp.shape[0]\n", + " return bkg_eps\n", + "\n", + "threshold_range=np.linspace(0.0,1.,num=30)\n", + "sig_eps_vals=[sig_eff(tp,threshold_range[i]) for i in range(len(threshold_range))]\n", + "bkg_eps_vals=[bkg_eff(fp,threshold_range[i]) for i in range(len(threshold_range))]\n", + "\n", + "\n", + "plt.plot(threshold_range,threshold_range, 'black', linestyle='dashed')\n", + "plt.plot(bkg_eps_vals,sig_eps_vals,'b',label=\"NN ROC Curve\")\n", + "fig=plt.gcf()\n", + "fig.set_size_inches(8,8)\n", + "pAUC=roc_auc_score(Y_test,output[:,1])\n", + "print(\"pAUC {0}\".format(pAUC))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "39.04553343189967" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "S=X_test[np.where(output[:,1]>0.6)].shape[0]\n", + "B=X_test[np.where(output[:,1]<0.6)].shape[0]\n", + "S/(np.sqrt(S+B))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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.6.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}