{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analysing FORC Data\n", "Assuming an Input as multiple csv files (with a space as separator) like the following Table: \n", "\n", " \n", " \n", " \n", " \n", "
$H_{ext}$$V_H$
unitsunits
$H_0$$V_0$
$H_i$$V_i$
$H_N$$V_N$
\n", "The unit row is being ignored by this script.\n", "Optional a third row with the temperature is valid (need to change code in the end).\n", "Adjust `folder` to the place where you've put your `*.dat` files.\n", "$V_i$ will be devided by `current` to determine the resistance $R_i$.\n", "\n", "## File structure\n", "The csv input files should use the following naming convention:\n", "* Every File contains `HA=` in the name to determine the reversal Field $H_A$\n", " * Immediately after `HA=` must be the field value followed by `.dat`\n", "* Down Sweeps: contain the word `down_to` in the name and will be ignored\n", "* Saturation Measurements at $H_S$ (containing only information about the saturation field value): contain the word `_sat_`\n", "* All other files are up sweeps from $H_A$ to $H_S$\n", "\n", "### Example\n", "```\n", "Some_Ignored_Informations_down_to_HA=1.500000.dat\n", "Some_Ignored_Informations_sat_HA=1.500000.dat\n", "Some_Ignored_Informations_upinformation_HA=1.500000.dat\n", "Some_Ignored_Informations_down_to_HA=0.000000.dat\n", "Some_Ignored_Informations_sat_HA=0.000000.dat\n", "Some_Ignored_Informations_upinformation_HA=0.000000.dat\n", "Some_Ignored_Informations_down_to_HA=-1.500000.dat\n", "Some_Ignored_Informations_sat_HA=-1.500000.dat\n", "Some_Ignored_Informations_upinformation_HA=-1.500000.dat\n", "```\n", "\n", "## Output\n", "The output will be a file `output.dat` which contains a header that is readable by FORCinel and a Table like the following:\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
$\\langle H_S\\rangle$$\\langle R_S \\rangle$
$H_{A_1}$$R(H_{A_1})$
$H_S$$R(H_S)$
$\\langle H_S\\rangle$$\\langle R_S \\rangle$
$H_{A_2}$$R(H_{A_2})$
$H_{i}$$R(H_i)$
$H_S$$R(H_S)$
\n", "With 2 entries for the first reversal field $H_{A_1}$ and one more entry with each following reversal field (ordered by the magnitude of the reversal fields starting at $\\max(H_{A_i})$ and ending at $\\min(H_{A_i})$)\n", "\n", "### Example\n", "```\n", "MicroMag 2900/3900 Data File (Series 0015)\n", "First-order reversal curves\n", "Configuration : VSM\n", "Hardware version: 0004\n", "Software version: 11/20/2006\n", "Units of measure: mks\n", "Temperature in : Kelvin\n", "01/11/2007 15:01\n", "bg1.11 frag c.03 taped sample forc\n", "\n", "Averaging time = +1.000000E-01\n", "Hb1 = -1.000000E+03\n", "Hb2 = +1.000000E+03\n", "Hc1 = 0.000000E+00\n", "Hc2 = +3.000000E+03\n", "HCal = +1.500000E-01\n", "HNcr = +2.000005E-03\n", "HSat = +1.500000E-01\n", "NCrv = 100\n", "PauseCal = +1.000000E+00\n", "PauseNtl = +1.000000E+00\n", "PauseSat = +1.000000E+00\n", "SlewRate = +1.000000E+04\n", "Smoothing = 5\n", "\n", "Field range = +1.500000E-01\n", "Moment range = +1.000000E-02\n", "Temperature = +0.000000E+00\n", "Orientation = +9.000001E+01\n", "Elapsed time = +6.436355E+06\n", "Slope corr. = N/A\n", "Saturation = N/A\n", "NData = 5250\n", "\n", "1.500000E+02,1.320206E+00\n", "\n", "+4.820400E+01,+1.226155E+00\n", "+1.500000E+02,+1.320205E+00\n", "\n", "1.500000E+02,1.320204E+00\n", "\n", "+4.620800E+01,+1.221773E+00\n", "+9.810400E+01,+1.293156E+00\n", "+1.500000E+02,+1.320204E+00\n", "\n", "1.500000E+02,1.320207E+00\n", "\n", "+4.421200E+01,+1.217202E+00\n", "+7.947467E+01,+1.275475E+00\n", "+1.147373E+02,+1.304538E+00\n", "+1.500000E+02,+1.320206E+00\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "__author__ = 'Jonathan Pieper'\n", "__license__ = 'tbd'\n", "__version__ = '0.1'\n", "__status__ = \"Development\"\n", "\n", "import os, sys, time\n", "from glob import glob\n", "import pylab as plt\n", "import numpy as np\n", "from scipy import stats\n", "import pandas as pd\n", "from scipy.interpolate import interp1d \n", "\n", "folder = \"C:\\\\Users\\\\user\\\\Documents\\\\cubes_theta_0deg\"\n", "header = ['H', 'V'] # Column names\n", "current = 1 #2.5e-6\n", "fit_data = True # Fitting gradiometry data (subtracting linear fit)\n", "out_name = \"output.dat\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def get_filenames(datadir):\n", " \"\"\"Returns all *.dat files in data directory\"\"\"\n", " os.chdir(datadir)\n", " return glob(\"*.dat\")\n", "\n", "def sort_files(filenames):\n", " \"\"\"Sorting files by filename key HA\"\"\"\n", " sort_dict = {}\n", " saturation_dict = {}\n", " for f in filenames:\n", " if(f.find(\"HA=\") == -1 or # File must have HA=\n", " f.find(\"down_to\") != -1): # File musn't have down_to\n", " continue\n", " \n", " pos1 = f.find(\"HA=\") + 3 # Cursor Position after HA=\n", " pos2 = f.find(\".dat\") # Cursor Position before .dat\n", " HA = float(f[pos1:pos2]) # Number between cursor positions\n", " \n", " if(f.find(\"_sat_\") != -1): # Saturation for Average\n", " saturation_dict[HA] = f\n", " else: # Up-Sweeps\n", " sort_dict[HA] = f\n", "\n", " new_filenames = []\n", " saturation = []\n", " for HA in sorted(sort_dict):\n", " new_filenames.append(sort_dict[HA])\n", " saturation.append(saturation_dict[HA])\n", " new_filenames.reverse() # From + to -\n", " saturation.reverse() # From + to -\n", " \n", " return new_filenames, saturation\n", "\n", "def load_file(filename):\n", " \"\"\"Loading File into an Array\"\"\"\n", " data = np.genfromtxt(filename, skip_footer=1, skip_header=5, delimiter='\\t')\n", " return data\n", "\n", "def write(name, H, R, T, sat):\n", " \"\"\"Writing results into file\"\"\"\n", " len_data = len(H)\n", " for i in range(len(H)):\n", " len_data += i+2\n", " num_curves = len(H)\n", " \n", " if not T:\n", " Temp = 0\n", " else:\n", " Temp = T[0][0]\n", "\n", " f = open(name, 'w')\n", " f.write('MicroMag 2900/3900 Data File (Series 0015)\\n' + \n", "'First-order reversal curves\\n' +\n", "'Configuration : VSM\\n' +\n", "'Hardware version: 0004\\n' + \n", "'Software version: 11/20/2006\\n' + \n", "'Units of measure: mks\\n' +\n", "'Temperature in : Kelvin\\n' +\n", "'01/11/2007 15:01\\n' +\n", "'bg1.11 frag c.03 taped sample forc\\n'+\n", "'\\n'+\n", "'Averaging time = +1.000000E-01\\n' +\n", "'Hb1 = -1.000000E+03\\n' +\n", "'Hb2 = +1.000000E+03\\n' +\n", "'Hc1 = 0.000000E+00\\n' +\n", "'Hc2 = +3.000000E+03\\n' +\n", "'HCal = +1.500000E-01\\n' +\n", "'HNcr = +2.000005E-03\\n' +\n", "'HSat = +1.500000E-01\\n' +\n", "'NCrv = %d\\n' % (num_curves) +\n", "'PauseCal = +1.000000E+00\\n' +\n", "'PauseNtl = +1.000000E+00\\n' +\n", "'PauseSat = +1.000000E+00\\n' +\n", "'SlewRate = +1.000000E+04\\n' +\n", "'Smoothing = 5\\n' +\n", "'\\n' +\n", "'Field range = +1.500000E-01\\n' +\n", "'Moment range = +1.000000E-02\\n' +\n", "'Temperature = +%.6E\\n' % (Temp) +\n", "'Orientation = +9.000001E+01\\n' +\n", "'Elapsed time = +6.436355E+06\\n' +\n", "'Slope corr. = N/A\\n' +\n", "'Saturation = N/A\\n' +\n", "'NData = %d\\n' % (len_data))\n", "\n", " fig = plt.figure()\n", " for i in range(len(H)):\n", " c = np.linspace(H[i][0], H[i][-1], i+2)\n", " # c = Array between beginning and end H with i+2 values.\n", " f1 = interp1d(H[i], R[i], kind = 'linear')\n", " if T:\n", " t = interp1d(H[i], T[i], kind = 'linear')\n", " y=[]\n", " if not T:\n", " f.write('\\n%.6E,%.6E\\n\\n' % (H[i][-1],sat[i]))\n", " else:\n", " f.write('\\n%.6E,%.6E,%.6E\\n\\n' % (H[i][-1],sat[i],T[i][-1]))\n", " for k in range(len(c)):\n", " val = f1(c[k])\n", " y.append(val)\n", " if not T:\n", " f.write('%+.6E,%+.6E\\n' % (c[k], val))\n", " else:\n", " f.write('%+.6E,%+.6E,%+.6E\\n' % (c[k], val, t(c[k])))\n", "\n", " plt.plot(c, y, linestyle=\"solid\", marker=\".\")\n", "\n", "# for i in range(len(H)):\n", "# f.write(\"\\n%.5E,%.5E,%.5E\\n\\n\" % (.15, sat[i], T[i][0]))\n", "# for j in range(len(H[i])):\n", "# f.write(\"%.5E,%.5E,%.5E\\n\" % (H[i][j], R[i][j], T[i][j]))\n", " f.close()\n", " \n", " plt.xlabel(\"$\\mu_0 H$\")\n", " plt.ylabel(\"$R_H$\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def cut_data(data):\n", " \"\"\"Cuts off the first and last values that are equal.\n", " Returns Index of first and last value.\n", " e.g.: [1,1,1,.5,0,0,0] -> (2, 4)\"\"\"\n", " min_A = max_A = 0\n", "\n", " if(data[0] == data[1]):\n", " for i in range(len(data)):\n", " if data[i] == data[i+1]:\n", " min_A += 1\n", " else:\n", " break\n", "\n", " if(data[-1] == data[-2]):\n", " for i in range(len(data)-1):\n", " if data[-(i+1)] == data[-(i+2)]:\n", " max_A += 1\n", " else:\n", " break\n", " return min_A, -max_A" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEOCAYAAABIESrBAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAIABJREFUeJzs3Xd4HNW9//H3mdlddcmy1W3Jso0b7rZsU00LoYOBBAjpgRBSbiA3IYXkJuTeJOQmJCG/NAKElkAgkEsAY2JjijFgjGVb7l29V6ustGVmzu+PWcmSkcEWslfl+3oeP57dnZ39juydj845M2eU1hohhBBiIIxoFyCEEGL4khARQggxYBIiQgghBkxCRAghxIBJiAghhBgwCREhhBADJiEihBBiwCREhBBCDJiEiBBCiAHzRLuAEy0tLU3n5+dHuwwhhBhWNm3a1Ki1Tv+g9UZ8iOTn51NYWBjtMoQQYlhRSpUdy3rSnSWEEGLAJESEEEIMmISIEEKIAZMQEUIIMWASIkIIIQZMQkQIIcSAjfhTfIUQYiT5wW9uwTTGUZ2VyZTKZkIeh4qsNCZUNYHSVOakMaG6CehebuRH3/jJCatHQkQIIT6E39xzPa1mPlU52eRXHcJRIcpzMsisPgRKU5edSl51A5bhoTorlbyqBrSpIgf+ZvI7aqnLTWSnnsqESj+xyQGKs+KYWNuG4Y1nT3YcGY3NmIaPivRxeCbO5Y0xS7ExMdIdABwMVLoDKBxU5HmFRuFND8NvfnDCgkRCRAgx6mz80w8p291E2cQJ7JgQw9jqWsaEfZTnp5FT04InaLvL9a14uzRleSnk1jZB0KQ0fyxZDY04ppfSrAw8k87m9VT3oK56HdSNXgd1la7pPqiTrlGAjjyfSBvtpLiF5UcKVAoyexWc2v9+2L1GJHSvZafXsqVNKnPSPuyP7KgkRIQQw9b9v7yXfRmt1CV6mHGwDR2TQvH4GHIrG/GSRGm2j7yqBhL0WHZM8DC+sQ28CezLzsGXPZ7Xkxf2OvhHDvhpvQ74kWUAuicAUerw8hHecyDXGpRCa334vRp0ZFlrMHAADcoA7Rz+vO5lpY5YdqND475X4YZJ97KDgcLuWfZgM6G6cbB+5O8hISKEGFIO/v4vFO78N9bYDCqnxrBdT2dmQw3e9Da2qilMO9CMzjTZn5OAPUXx5phLsTF5paBXEIzt/Zt/ZMNKQUb/n6nf54B/ePloB/j3HtT7HMi1EQmK9y57sLnG+QePG5/H0h6U1ijlfOB7rqp6jYAvlsmVTYQ9OqpjIqrnBzZCFRQUaJk7S4ih4cEnH6J53Vtkj/FSPS2enfYkpjfU48vys9M5hdz2JkKZQfbETsGb2MJ6tQwbA0WvUAD34N2fSBDQJwje/zd6oM9v7j0H7GNc9mBzVeVaAjEx5NYcQunghxoTiUsOUpIVw+SqQ8SSwM4JPjKrqom34ijPTyOttZHmwAbGhsZz9zcfGex/oh5KqU1a64IPWk9aIkKIQfXnTeW8tv4ZpleWMy0wkdjOatrHgJPYRfG0JHZedAZGQgcb1Jk4mKzO79VldJRw0EeGgqafVsAH/+Z/5G/0V1es41CcSVpVzTGNiRghL2V5KUyoqcEMQdnEHCY0BChPN8jwd/DD2390wn6uQ5WEiBBiQF665zHKWqop9rZwqLOE6e1ZTPFNJBwT5ALbJi12Lg2J7QR94PM0su8Mg4fMmw9voKfVEHncT0vBRKNRGNgAONrs0+XjweaG6o1YvhiyymoJ+cyjjonsmuAlv7qReCeZHRN8+DsVdouHR//z9pP+sxtJJESEEEdVVfV39j66jjEV09kfF6IouYmutipmOadQnQLao4nXcWTGzKczzqJItR9+ry7Hpz1kt0H8vACb1Tk9ryltY6DRum9A9F42tcPVdWtoDo59z5iImW5SkhXD9OJq5pRPpMVu4Mb7/+vk/nAEICEihIgof6ua5n8+gh2IZXNCDAe85Uz0O8yNP58945rYb7YQo2OJSZpCleo1lho522ick0i90Ubk/FUWhCcyXo9lY8IWkhqy8U4PgdYYOJja4dr6l2nuSuoZE9mlpzK5oR5feivveOajmw7x/277XrR+HOIYSYgIMUo1/+5rVG+sZ3vOmRxU7WT6A0xNmEt5fBNVZh1xxFGfCmvY4b6he+hCQ7Y1hnqzDQcHpSGxtoqF4y5kVcw2nEiX1L7wLjrCOXQljEEdSqSTBNLtemY27WDigWJ++YM/RHHvxWCREBFiFHhxXzHr3i0nv6SOllANqrOcnMA4PHlz2G/WoIGqGA9V7KKnkREJjGlWNpOdDF72bcfWNkprFlj5GJaixjhEmbWfzakNdLW/zmmdmdTGOmRMzuCiW78IwF9u/TXk+KlmDtMqD7Jww9t8949PR+tHIQaZhIgQI9Q9Dz9NQ1k5ttNKfqvFpfELKTGbqDUPQWIyxUmArnFXjgTGDCuHSU4Gq33bsLUN2qG1YRsBYxLT4uMoSm7C31nFxs5DnGWOZcnSdK745Ptfg2B3QiCljUbSuahiLRMrO8CQuV9HCgkRIUaITU+tYOPa1eCvIzF5IjlxU/HHtaOVQeMYH6+qHSjdfSotoDVTrCxKPQ1uF5R2aKnfxiRfNtkJY9lrVhMKVTMuI5sl115A/IIFXH+cNVkhC8f0UJPqoJVBXnEVnuwxg73rIookRIQYxgpb/Wx5aRdxOzZz0KxBp6dC+lgMFI6q6jOOMS2czRQns08ro7N+B6eMmUyxN8ChQAMpM8F79mRuXvyJQalv47Y64s0wxYleAN48tZ7vj1s2KNsWQ4OEiBDDzG//fC8lVV2MbapgXOw4kuJyqDCacRsZ7nUXaU4Sk5xMCj0HsbUD2qa9bhsefybjxvsoj+sgMWyRd/lHueSqq05YrZs27CDDo2mMT0ZphxhfgIDvKBNPiWFJQkSIYWDl7/+Xsn37MIwMJhvz8MVUUpeWQYOCBl1HihNPWFs4aJR2KAhPJluPYayTyCue7WTW72Bm40HGLF7EV77/4Emr2ymvxvQpGrxppDj1ZLcnknvpmSft88WJJyEixBD25EPPY+8q50B8Jzo1F4Aatefw2AZub9UpThaZVirrQ2XQspG6lHoaJ8wj74Il3Dn/xLU0Pkhsuw89NkCNmkp8uJqsjjRyps2MWj1i8EmICDHEPPvT71FTU4/Xk0Ne/Ey2xrehje7ZY2GSlcE0O4eXvUU4aNAaX+Ag6+LHET8lwJdvfjS6OxDh2A6hkIGd0kYN2WSGi0hiYrTLEoNMQkSIIWBTWQsvP/MSedUN7E/0oce5rY4qtY9kJw5DKxw0Jgaz7AmM08mkt1kErXpSkjpR11/MN5d8Ksp70de+reVop52GsWFs5UUHa8ifKYPqI42EiBBRtPsfL/LOW2/QFPZRMGYWmxP8aHW41TEjnMMZ1gxqjUNs7FxHvAnx6Sbp50/ny0vPjWrtH2Td2iISVICDySYAY9vqqZnzgTOLi2FGQkSIKNj54g72vbWT7Z5dOGPiAHhT7SHRie1pdaBt2q09vOXzUeKtJuX0+XxkwTJyc3OjXP2xCZRCugrTGJ8AgM8f5pndzXxmcXTrEoNLQkSIk6i1dTMvP76JWWX51PqqcZTquY5jajiLs6wZ1BltFHatI8nbRs6ULpLyHT5x8Z3RLv2Y/e7NHby5poSzA0l4YqEhZhzJdguhrgxyYo9yMykxbA2ZEFFKPQRcDtRrrWf387oCfgtcCnQCn9Nabz65VQoxcHWP3sXqt/bRnDGPXbHV7um4RG7Cp23aG7azKc2mPTPAFdd8fdi0OLpV79vNow+vp7gjhwVWHEopiLeoNfJIDTTR6KRyU3JitMsUg2zIhAjwCPB74LGjvH4JMDXyZynwp8jfQgxpa55ZQ3B9BRWeeGqzpwFdKOC80CziiKWoaw3ZgW1MOCOXyVefTkrKwmiXfFxKV63imRVvsj88ldlMZD4Kjcax/egxbVQznvHhQlTmy2RNXx7tcsUgGzIhorV+QymV/z6rXAU8pt37ZL6jlBqjlMrWunsGOSGGli1vrWPtS2+QozM4mFhHEMt9Qbm3e93BAbaPK+OyPB9XnP6/kLskugUfh8JWP49u2E3bK1tJr3NIiT+Hue5tpgB3thVP6ya25isCKh6lOkFZbFp7N+fPXxHd4sWgGjIhcgzGAxW9HldGnntPiCilbgFuAcjLyzspxQnR29v3/YLVNX4wFYdUFWl2EkusCbzl3R0ZNHeoyTvErdfeyvyM+dEu95hU79vNK+/sZEOlQ1dVK0lqIjOsiSTHGmhHY0cixNQOSjs0n9rEQ1mfA6A08XwWdWxlZvnOqO6DGHzDKUT6G5HT/TyH1vp+4H6AgoKCftcR4kR4o3AjlX9/h5p4G8zDp+pOdNKZ4mRT0VxIcKyHJRddyoIzz45uscfopY17eOP5zXiqO9icPIEpYQ8L7HGoSLeVexd09+yAHT6LrOzNNGRavJl3BY5yT+91MMiJmYWfA9HdGTHohlOIVAK9RxonANVRqkWIPv71wiq2v/s2WcEU6hL9aByUVpG/NdXhAFtPaePi6++iICUh2uUes9+9uYMn/1XGdR2ZmN5MLu1S2L1+d3MifxtagwHpU3bwyJwLCOONPG8DGg82eU0WCafJmMhIM5xC5Hnga0qpJ3EH1FtlPEREXcW7rHnkMYrCY8EwqIpvI91O5nxrNn4C7Gt7l5aE/cz87KV8adZp0a72uDy1egtvvNnCWV1eTEDhXr+yyxNmhuXFox2Ugox8H1sTd1E3zs/ucZPcAFEKpW3O7dhKajBIQV0MY/ztXH7Lr6K9W2KQDZkQUUr9HTgXSFNKVQI/AvfXGa31fcBK3NN7D+Ce4vv56FQqhKt2/XoqHl/B/qQ88HX2XO+Ra48jwYklHi/GbA9TbvzOsDvjavvrW6l7tolztELhwenutnJsmhObiG1v5pTcqVQHX6RYax479bNYeCLh4Y6JeLAYX7qL8yvT8cUc4oL/kQAZiYZMiGit3/cuOJGzsr56ksoR4n29UbiRqifq6UrNps5sRGn3jCu0piSmHTvbYfKZp7Jw1nnRLnVAnlu5hzE6zR3r0JrS2HYmdrUSuziTb1+3HOu+n/BWbBMbp89ka/J0LOV2Xylts9S/keRgJ2mNbYztqic5J5Yzb787ynskTpQhEyJCDBdrNzxP4d/foSs1DlvZLA1PJd1JZF9bIQlzJ3HVl74Q7RI/lAeffpvqrjGkRrqvDG1xsXOQZd//Ik+s+gWPrtxIeEo+z48twMG9V7o79gEeLBbtryGx2U9njp+v3Hr7sGuFieMjISLEcTjwr2fZvm4z7Sk+wMZAke4kk6mTmLr8KlIuHN4TDN73wKvsLwoyy45hn8eizrCZXfsOxTkH2P74d/n1aZ/Diox5oDUohaFtlkRaH+kNbWSVv4t52VV848Jbo7074iSQEBHiGNQWt1L2XBG7G8ppTDJ77l3uaIeS7DbmXHUOMROTo13mgFVs3M9f/rGRse2ZTMKHg2aTz2IKTXjOMHnxlPPZEzcZS/ncN2gHAwc0eLBZWlJPWkOA9PgGlt/7UnR3RpxUEiJCfIDa4lZev/dNWlMOUONrYYqVSbFRg0ZhmAanXb2MmNzhGSDlz/+L9Su2ssOYRRIZmChiY9qomVLJ9GxNfXwy98ZdDsoArft0Wy0vfwV/vElGcztT/W187JZPDaur7sXgkBAR4n1U79vNqidWUjOmi7CyOCd0KqfYmWQ0VhE4LZeFF1867CZKBNi6YgfvrtnDgfYAE7xnkYWifnIt+/P8+L1+Xk892x3v6O62Agycw91WjW0YFY1kJWRz+yXXEr9gQZT3SESLhIgQR1G9bzdP//b3tKSlgwIDRZKOAwWn3bB8WI5/rHz8OV5dX0+eNRmDVIwsL29nmKTE7GPFtNk9p+l2j3egbUw0uqfbqg6/30d7cgy//envo707YgiQEBGiH8GyNsqf30VbWibguOMfaOryLOZcumBYjn+sfPw5bivSLDRzyeuqpi47zF/Pm4ulDGC+GxrwnvGOTxa/QkOywZzKffh2mXzvwQeiuh9iaJEQEeIIwbI29t7/Nq979uDBwNHuRB+mx8PcywuG7fjH25sPssA3gWm5u1kzOYP9sROxlNnT8ugz3lHxOp0ezZSDRYyp8vDptZsIexSP3PTlKO+FGGokRITopaKigs2r17PTsxcPHi4LL6Qp/RDt+R7mFiwZluMf3ZJ9QfIm7uIv0yITI2rdq8VhcUXLCtr1WGYWV5BbvpNQpsFjYyr40xM22/Ph8ctuZNHsSdHeDTHESIgIEVFRUcGjjz6KZbn3/TjLmskYM5FTrjl9WHZf9Va9bzepwTA7MxIPXyCIw7l6DeNo5FRnF0n7puDXmi/d+Wtqi1v5j1eu4Ywt7vsDZ42B5CJy0rKiuBdiKJIQESKitLS0J0CUUoSmxZJ27pxhHyAAFTu3Y7fXkdWcghrTPVBuMbe0kXnsYExCFqd/7//1rL9+yxvs8dbzpe0eYsd2EfTlUm2WUJA5/E4mECeWEe0ChBgq8vPz8Xg8KKUwPSbTz583IgIEIHfWHPwdFcypi2MiJYy1WvjS1ldYMOk8LrnpJU6/4eE+66/quJfcZhjfEMTK89CRvYwHPvrAsLmBljh5pCUiRERubi6f/exnKS0tJT8/f1iPfxwpZ9pMEmfPI9Yw8RFiXIfFxHqYkHrqe9YtaTnA27qeHxd1AR5ycxu5ZfEsEiRARD8kRIToJTc3d0SFR2/a68PRYSy8+GwNhkVqYkqfdYrqi/jv127D0A6z9ihi0kP4EmyMhs0wY3jOSCxOLAkRIUYJKxBGx2nCeInTgGHjjTl8CCiqL+ILq75A2A6T36Cw2zwkLvKjDS/kD49b+YqTT0JEiFFChyx0gsbCg2krtGHhjTEpqi/ijco3WF26mrATBgVn7HZwFPwt+0Iy80/nBpkTSxyFhIgQo4Rj2TiG7YaIA9p02Nu+h1vX34TluGelGZGbay3bpqlPSOLfbYuJ32dwZkXFiO3mEx+OnJ0lxCihwhqt3BAxHAMMm1dr1vQEiNJwRoeXe5/vYqwfMjra+dmb9zO/eT+lpaXRLV4MWdISEWK0cDTaCBPGi8cOoU2b9ORxgBsgY7psvvqcH7MiBo37G6ZXW8xoKic/Pz+alYshTEJEiFHCsB20YWHhxbDDaMOhtqENgE+sT+bK9Y0YIR9jpnXQWJwMDmAYLP7CF6QrSxyVhIgQo0Br62Z3enfD6hlYx7DZumMV85sdrlrbjEKhDEjIC7Hy/Ok0Fjdx8fKvkn/+RdEuXwxhEiJCjAItLRvwOKY7sK68kRDRdOR6OONdA4UDKLTWvN06nfDEU7joxh8yTy4wFB9ABtaFGAVSU5diYGAb7l0KTVuhlCbeaaBqXBwQuW28AcVjF3BZwX/IFCfimEiICDEKpKQsxNQmViREDFthaI2y22lNiQWgdWoiY88NcsW3viVjIOKYSYgIMUqYGNhmpCViGZgoOhxFQtAHgJpuYKbHSICI4yIhIsQoYWJgme4tcE1H4cHA70BsJERSvH7CRmw0SxTDkISIEKOEgYET+cZ7bPDgocNWxIY82MogxduJ40mIbpFi2JEQEWKU8GgDy+huiYAHLxaKhKCiwxtLivKjfBIi4vgMqRBRSl2slNqrlDqglPpuP69/TinVoJQqivy5ORp1CjEcGaheIaIxdQwA8V0avzeOBBXAiEuNZoliGBoy14kopUzgD8CFQCWwUSn1vNZ61xGrPqW1/tpJL1CIYc7AxOkeE7EB7QUgIWAR8LrjIr6UzGiVJ4apodQSWQIc0FoXa61DwJPAVVGuSYgRw1AGjnK/8h5HY0W+/oldFmGv+/ukb+yEqNUnhqehFCLjgYpejysjzx3pWqXUNqXUM0opORdRiGOgtUahsA33K286EFQ2AAldISyvCYA3rb+vnBBHN5RCRPXznD7i8QtAvtZ6LrAGeLTfDSl1i1KqUClV2NDQMMhlCjH8aB3GUAqnJ0Q0fkIAJHYFcLzu8960vKjVKIanoRQilUDvlsUEoLr3ClrrJq11MPLwAWBRfxvSWt+vtS7QWhekp6efkGKFGE4cJ4ihTCzltjhMG9oJYGCQEOgCd0gElSohIo7PUAqRjcBUpdQkpZQPuAF4vvcKSqnsXg+vBHafxPqEGLYsO4BS4PQ6xbfF8BOjfcSFQ5hex10xflwUqxTD0ZA5O0trbSmlvgasAkzgIa31TqXUfwOFWuvnga8rpa4ELKAZ+FzUChZiGLGCHaBM7EhLxONoGs0OkkJxQAden42lTTxynYg4TkMmRAC01iuBlUc898Ney98Dvney6xJiuAuH/KCMXmMi0Gy2Eh90rxWJ8YYJEotH9Tc0KcTRDaXuLCHECRIKdoBSPS0R07Jo8XYSH3SngY/3BQkSF80SxTAlISLEKBAMdIAyegbWfY5Fi/ITG3JbIgm+AGElISKOn4SIEKNAsMuPNnpdJ6ItOj0hYkPurL1Jvi4sCRExABIiQowCgUhLxCZyUaETxjLCxATdqU+SfX6ZwVcMiISIEKNAwO8HpbAME0PbmNoGpYkJuefWpPj8aF9SlKsUw5GEiBCjQDDQiUZhY2JqG6UsAOKCCksZxHgszHiZwVccPwkRIUaBkqY6tAJLefA6Ngo3ROIDNl3eGJQCr8zgKwZAQkSIUaDyUANaga08eLSNUu4V6omd4Z5p4GPHyuSL4vhJiAgxCqSqWDBsLDyYjoNS7kTwCZ2BnmngveMkRMTxkxARYhSIdUwc0yGMF4/joHCINT0kdXZi+yJnbGVOjHKVYjiSEBFiFAiEwmBGWiLaQSkbn+ElsasT7XWnOvGMkxARx09CRIhRIBC00KaNhRePo1HKxmPEktDlR3kjt+2JHxvdIsWwJCEixCgQDttoZRHG43ZnKQel4kkMdGH6HAI6BkxvtMsUw5CEiBCjgBW0wbSx8WA6oJSN144n1grh8dkEZPJFMUASIkKMAo4FjmERxovpaFAOvqA7zUmsN0xIS4iIgZEQEWI0sEy0YWHhxXQAHGJC8YA7DXxIJl8UAyQhIsQooGwTbYQj14mAUpqYoDuDb4IvgGVIiIiBkRARYhRQjtGrOwu0cvBEbkiV5O2UGXzFgEmICDEKGNpAK7clYjgGKI0v5E53khzTBTKDrxggCREhRgHTMdHd057Y4CiNN+Se0mt4HQy5RkQMkISIEKOAiYE2wu60J7bCMRx8QXcSRtOn8SbJDL5iYCREhBgFTG2CYWHjwbDBUjaJXV3YSqFMTczYnGiXKIYpCREhRgFTG2jDdgfWbUXYtEjs9BP0+lAKYtMnRLtEMUxJiAgxwmmtMTCwlY2jTDdEPBaJfv/haeAz86NbpBi2JESEGOEcJ4SpDGzTnWjRtA1afV0kdvqxfe4hwJchM/iKgZEQEWKEc5wghlZY7m1DMG1FiydEot8PXrC1gYpLiW6RYtiSEBFihHOcAF5tYkW+7aZloFSYpK5DKC90EgdKRbdIMWwdd4goJf/bhBhOHCeAiYndHSKOoosOkrqa6IoL06Xjo1ugGNYG0hJ5Sin1tFLqt0qpzyilZg1WMUqpi5VSe5VSB5RS3+3n9Ril1FOR1zcopfIH67OFGKlsO4CJ0as7S9NlBkkIQmu8RVCmgRcfwnGHiNb6Oq31x4EUoBH42GAUopQygT8AlwCnAp9QSp16xGo3AS1a61OA3wD/OxifLcRI5rZEDBzD7UQwHciy/PgsSDdsLBUb5QrFcPZhxkQ6tdYrtdY/HqRalgAHtNbFWusQ8CRw1RHrXAU8Gll+BrhAuteEeH+2E8REYRvu1910NDNtNzhyjSC2Id1ZYuAGMibyL6XUH4FTlVKLlFKeQaplPFDR63Fl5Ll+19FaW0ArMG6QPl+IEcmxAygM7EhLxGNDVazbC53o7cI2ZQZfMXDHHQBa6+VKqQnAIuBK4E7g2kGopb8WhR7AOiilbgFuAcjLy/vwlQkxjDlOAEMZOL1aIqWGO81JTIwFvuRolieGuQ9siSilPq2UalBKVSqlPht5egKwGLhcaz0YAQJuyyO31+MJQPXR1om0gFKA5iM3pLW+X2tdoLUuSE9PH6TyhBie7EiI2Ko7RECHIuMjPgclM/iKD+FYurN+CFwKzAcmKaVeBp4GvMDtg1jLRmCqUmqSUsoH3AA8f8Q6zwPdQfYx4FWt9XtaIkKIw2wrgOo1JuJxNMqyADC9mkRvOJrliWHuWLqzOrTWGwGUUj8G6oBpWutDg1mI1tpSSn0NWAWYwENa651Kqf8GCrXWzwN/Af6qlDqA2wK5YTBrEGIkCoe7UEr1nJ1lODCxrdxd9jlk1T4LFV+E3CXRLFMMU8cSIlmRMYa9kT+Vgx0g3bTWK4GVRzz3w17LAeDjJ+KzhRipQsEulDKwlXuhiMfWTG0vAdyWiNI2lK6TEBEDciwh8iNgLvBJYA6QpJRaA2wBtmitnziB9QkhPqRAoBMMo9cpvlBPChja/eOJgfyzo1ylGK4+MES01vf3fhw5M2subqBcAkiICDGEBbo6QSX1tERM28YOGpheh11MYeYn/4AprRAxQAM5xbcS9yyplR+0rhAi+to7OkClYBtuiHjtMKccKsP0aZ6wruJnk06PcoViOJNZfIUY4dr9nWileo2JOExoryPsNWnSGVGuTgx3EiJCjHD+zgD0uk7E41gkd3XQ4EkhDifK1YnhTkJEiBGusyuAVgorMkORx7FxwooKbwaxWlG7fn2UKxTDmYSIECNcIGhFTvE1MB0LA5tQyEutZxwNmDz99woJEjFgEiJCjHCBoI1WYCkPHm0DDnYQJrTXU9scZndKBdvf3RHtMsUwJSEixAgXDlmRgXU3RJS2MTXMai7hJ2/ej7ehjXCaTAcvBkZCRIgRLhQEbWgsTDyOg2GG0bhffo9jMa+pmDnLlkW7TDFMSYgIMcLZlkIrGwsvHsfGE+snMAUsZaA9Juff/Clyc3M/eENC9GOwbiglhBiCNtdtJmQptGlh4cHjOCgjTNPHYmgtnMSlN/+Q+AULol2mGMYkRIQYof69/n6ctY+hrAkQZ2MRh6k1yrCJT20l6c47iB8vASIAuQ03AAAgAElEQVQ+HAkRIUag3bvXct7q7+DTDm84eTiGTRgvHsfB7vTROeleLhx/RrTLFCOAjIkIMQI1738dr3bc+0k7CkwbCw+mo1Hay4Xzrop2iWKEkBARYgQK5Z0J4E5qYiu0YUVCBEyffO3F4JH/TUKMQJvicwgaBge9WXi0F0dZhPFiOhqU3FFaDB4JESFGoH27/kmc4/Bq12K8joE2wz0tkVDQpra4NdolihFCQkSIEcZv25xeugIAoyqIiYFjWFh4MR2FBqr2tUS3SDFiSIgIMcK83dLBGYFKmryJTKkux9QmqMNjIkoZjJ+WGu0yxQghISLECLOyahf54U4KmUVa+BCmdlsiYbyYtiI1J5GsySnRLlOMEBIiQowwnTueIMZ2KKnNRnvBVAb0OjsrPiU22iWKEURCRIgRpKwryMW1awFILG6nMSUeU5toIzKwbis8Md4oVylGEgkRIUaQ15paWRSqpyImjZnlxZSONzExwHAnYDRthbLkFF8xeCREhBhBVpVvJCcUoLB1JvHhIJXZJiame52I8mHaCqu4nWBZW7RLFSOEhIgQI0TIccje9Tc8WhPe4uCgCMT5MbXCNhwADFvh0Qadm+uiXK0YKSREhBghCls7uezQZtrqfcwqK0GhOX9nCEOZWKa7jmkrTGUgHVpisEiICDFC7Nn9Cos6DlH1bhoGoICwDzzaOBwiloGpPCQszIxmqWIEkRARYgTYvXstN678PK2vJUCHxjIMLAVdsQoTA7tXS2TMWXnETEyObsFixBgS9xNRSo0FngLygVLgOq31e+ZlUErZwPbIw3Kt9ZUnq0Yhhqrdu9dS9bsf4d0wjrDfJHNpKw9OO4f28u2kzkonc4OJpdx1TQficsZEt2AxogyVlsh3gVe01lOBVyKP+9OltZ4f+SMBIka9zlVP8Oqv/8r4V2sJ+00wwJPssGNyE/86w2D8zLnuFes9LRHwxcVFt2gxogyJlghwFXBuZPlR4HXgO9EqRojhYO0Tf6D1rRVc8FYxGgUoHAf+3biAaqeL+enzsR0HLwaW4TZFTEfjkRARg2iotEQytdY1AJG/M46yXqxSqlAp9Y5SavnJK0+IIaTiXX73lS+R/Mf7mfpKKd4EG2WAjSJkemledD51VjPn5Z1HZyiAgcIx3K+6xwFfbEyUd0CMJCetJaKUWgNk9fPS949jM3la62ql1GTgVaXUdq31wX4+6xbgFoC8vLwB1SvEUNPaupnmf3+X6n938JH1zYACpclafAjbMHi5dQm1s68g9bIkeBfOyz2PFbWvME6Z2N0tEVtjeofK745iJDhpIaK1/sjRXlNK1SmlsrXWNUqpbKD+KNuojvxdrJR6HVgAvCdEtNb3A/cDFBQUyCnxYth74s8/JfHN1SyoLWNsRd8JFDsbY0iZ3UXMR87iq8u/xA0rbmBMzBhag62RloiBY7iDIqYDpkdCRAyeofK/6Xngs5HlzwLPHbmCUipVKRUTWU4DzgR2nbQKhYiCYFkb99z5W+b89gmmbqyjoyKOuLQQynTvnx4yPOzKn8T+C+7m8uXf5S/b/8LOpp20Blv54uovEvK3YiiFrdyWiEdCRAyyoTKw/nPgH0qpm4By4OMASqkC4Fat9c3ATODPSikHN/x+rrWWEBEjUueWLex4+F6aVQuXvb0PHHfgHDTxOSFSFgR4pP1SnJnL+OZ3PgPAE7uf4N7N9wKg0YSdMFagC4XRMyZiOhrTo6K0V2IkGhIhorVuAi7o5/lC4ObI8tvAnJNcmhAn3RNP/pvZ/3MHibZFEhoMDQpsbWCbJlsyp3NgznKWnnM9Z0zPYEv9Fu7ddC+b6zezMGMhO5t2YjkWXsNLfBiUobCVdGeJE2NIhIgQAoqevZO9pXuYueIgXjuM2/KAcTP8xOaEeLl1CRvGzeXia5bz1WVLAFhfvZ5b19yKox1MZXLbwtswlEFhXSEFmQW88n9fAWVid7dEbI0hISIGkYSIEFG2ancdL/7tz1y3cQ0L6lqwg+7X0gFME+JzgvjSNLELlvGLm77d875tDdv41tpv4Win57nN9Zu5ec7NzM+YD8CrIRuUwu4eWLcdDEO6s8TgkRARIkrqNj7J+o0vkLa2mC9vbQEUNiaZCw/hTbVZXbuIN9PmsDz9XZaedTOXXfApADbXbebP2/7MhuoNpMSm4DN82NrGa3gpyCzo8xk6CCijpzvL61gneS/FSCchIsRJ9uCGQoqef5HrNq1kVn0zVmevr6EC2zJISLdYP/5MZi5dyjkX/KLn5VUlq7jjjTvQaAxl8LOzfkaCN6Gn+6q7BdJNW8ptiajIxYaWhIgYXBIiQpwklX/+Tw68tYm5DR2cWeIHFBYmKZP9tJXFY9tgGR5KM6cx74xPc89HvwBAUX0RG2o2UN9Zzz/3/xMduRuIQrG7eXef7qsj2TZgGIfHRByn3/WEGCgJESFOoNriVu597RXC+97hC8+/RKbWdA+Yg7voTbTJPq+VZxvPoeO0s/ja7V/rebmovoibVt1EyAkBMCN1BiVtJT1nXx3ZfXUkrQ20MrAiX3WPLS0RMbgkRIQ4AV544jmK1r7GopYdfKK1Dl9FCHT3raLcU3Yd3d3ymE7GhdfzuSu/1GcbjV2N3L3h7p4AMTC4aNJFFGQWHLX7qjetbRzbREcG1pV2MLW0RMTgkhARYhBteflR9q9fSdsezbVbtqO02/XkS7Xoao3B1A7K0Ixb4Gdl6ExCcxfxxR98u882CmsLeWD7A2yq24TlWJjKRKPxGb6e4Hi/8Ohm2wGI3OPQxsSjbQxln4C9FqOZhIgQH1JFRQV/feKfjD34NpeVbiT5kEmozQt0d11pkiYEeWXeYgINXs7Ka8C8+nY+u+ziPtuxHZs/bf0T92+7v2fg/Bdn/4LMhMxjankcyXGCKMOLVmApDx5to5CWiBhcEiJCDFD1c4+wd+VTdPgslu1vZVxpGx3EAprE3E7aqhIwIi2PmEyL4uxZnPepy1l41oI+2ymqL+LJvU9SVF9EVUdVz/MKRUVHBRdNuui4wqOb4wTAMNAKbGVi2jZKWiJikEmICHEcClv9PLN1B4kvPsPyF14kq+dsp+65rdy/PKma+5Z+nIsq32F+XgxxV3yDny8+r8+2tNY8svMRfrPpN2g0CsW1U69lRfGKYx44fz/+rlZQBhgOFh482sFW8dQWt5I1OWXA2xWiNwkRIY7BprIWVj72FOklb3F1y26Sizv6TIqYmNtJa3Ui2BplwopZ1zB90VlcfvmP37OtLfVbeGrvU+xo2EFZe1nP84YymJA0gQc/+uCAuq+O1NTchFYKbdpYeDA1WDqJZ39VyNXfLJAgEYNCQkSIoyiqL2LjtheJLdpNYEuIazd3D5QrPPE2IeXB0G5oJM4I84/pS5gdbGbm0kv4zIU3EjMxuc/2wnaY+7bexwPbH+hpeVw5+UpWla3q0/I41oHzD9LS2ozCDZFmUgkaXirTNOObQux69V2yJl/4oT9DCAkRIY6w4YFfsWJPPWld1Szf+ybhNpNwe9+B8pQpXTw37ky6GnxMmOxnXcGZfPP6b/a7vfXV63ls52PsbNpJS7Cl53lDGUwaM4kHpw9Oy+NIrS2HUMDOMTHsYTbao/jbeV4++ZrFKcEdgISI+PAkRITAvfXspsf+iLOhDh3TzvLiFuJrgnRGBsqTcjtp7TNQHqYhZgwzzjiLaz7z6T7bKqovorCukNzEXFaXrWZ12WrAvc7jxhk38n/7/4+wEx70lseRgo1+Au1pvD07Hk1k+hMDaidsZNbiwf88MTpJiIhR7aXNq+l852FCNQ3M/WcVhhNpbSgHjeEOlSswUzUrZp/NksYDxGWHOHj+p7jz4v96z/a21G/hplU3EXbCuG89fHW6Uor0+HQe+OgDJ6TlcaRtu7eycd5F7EicjkKjtIMHiwXed8kt+M4J+1wxukiIiFHpr+tepeH5p7hu9yqcTvDXxPS5ojxpYheHKpIiA+WKdXmnMSd/Muf95s/v2VZRfRHrKtfREe7gxeIX+wTI5ZMv5+Wyl09Ky6O3X911J386+2YsZQKaG+1HCRs+Zjm7yEpZeEI/W4wuEiJi1OjcsoWd9/+CWl8zmSVdFOyrp504QBObFqKzOcYdKDcgYarF36cvY0ZrE2MXzOO6277fs53u7qqCzAL2Nu/lZ+/+rOeeHrlJuXRanTjawWt4uW76dVw3/bqT0vLods8Pvs7a+fPdAFEKQzsEm+ZwQ+tWGtVclt/yPye8BjF6SIiIEa2iooLS0lLK1r3G/L89SaLjcArQZxJEIDbb4t5TP86UxhrGT7dYc/knOG/2+RSkJPRZr6i+iJtX30zIduez6p5RF9wxj2umXtPv3FYnIzwA/udHP2DjjCVsHRvZS23jweLUjhoOdV7A1d9YflLqEKOHhIgYkRr2rqP8lcepWV9CeqCJRQf97q0CI91VCeO7aKtNiHRXGbyQ+VHMzDTm33Y1y2ad1mdb3VOxew0vzx18jqAd7HmtIKuA7Q3bT8gpusfrl3fdwZ+XXR/pwoKP2U+gDJjp7AZrFldIgIgTQEJEjCirVzxIR8Va7OJaZq2oZErkug4zxsJSHlTkuo6kU0P8c+45nFJnkL3sI9xy6yd7ttG7u6q8rZwfvv1DbO1OFxLviXcnRNQan+njtgW3AZzU7qr+3Hvnf7Bm6eJeXVg2umk617dupbBrNt+4/edRqUuMfBIiYkR4Zd1r7F3xJFfuWIXdbtBZ74u8ErmuY1oXz0eu68ib3MbW7Mlcf/kt5Eyb2Wc7H9Rd9YXZX2Bp9tKodVcdqbV1M79/5o+8dvoF7EiY1ucsrFM7athWM5lv3PWNqNQmRgcJETGsbXj0t/hfXUmoPsR5JTU9A+XxWUE66uMi13WAL8uhJncyeRfMZfnHP9FnG0X1RayvXo9Gs7JkZZ/uqvnp89ndvLunu2pp9tKodVcd6a3Hf8mWjLX8YdJdOMqD0g6ftB8maMQy09mNP5TGHXc9Eu0yxQgnISKGpTd2vsPevz/CWf98nWQNRw6U+9Jt7p92JVMaq8mf2EH9aefww+vdrqfu7qoFGQvY1biLezbd03N2VbIvuU931TcL3KvQo91ddaTv/OS/qJs6jg3mN3CU+zVWQGfNGXyi6202BRdxx9ffO2+XEINNQkQMK7uffZiml56hs9bP2SU1aG1EXtE4ykBrUKbB2jmfITHzKmbOzeLC03N73n/k7WZ7MzD43KzPsThr8ZDprurPz371VR4//XNYkfAwtAUoTEczsdRmU9ol3P71S6NbpBg1JETEsLCprIU9T/2ZhY88wjgHxqHQ8YCt3bvNGrD17IVMSR3PnOtuYNaCBdzQ6/0vl73M03ufZkfjjj4Bcnr26Wyu39zTXbU4a/GQ6a460sbHn2B7ybu8fvoiN0CUQmmHgrYiYjs0U0trOH/5R1g894xolypGEQkRMeRtKmvhbz//JV9a/0+0c7jlsXtSPm+mz+WK0A7iz7mYGz97W897iuqLeKvqLcJOmHVV69jXsq/ntd63m/3K/K8AQ6+76kiP/epG9mXm8/zpF1NvZKG0jdJgapv52wNk+pv46s9/FO0yxSgkISKGtPYnfkPSHx/klkYHfIBxuOXRsnAWy5dfy7JZv+xZ33IsHt/9OL/e9OuecY5Eb6I7JToaU5lcO/VashOzh2x3VW//uv/7NDa0sfG0STynPgaAqcN8xnmQDlLwFlkk2AG++vM/RrlSMVoNiRBRSn0cuAuYCSzRWhceZb2Lgd8CJvCg1lpOfh/BWn7/E2p//zf3gYK/Lb6ITl8CH1P7Sb3wMm66+vM9664sWck/9v6Dgy0HORQ61PO8gcElky7hhYMv9MxfdcWUK4ZsaHR77q8P0Fi7moPjp/LilEupM7JxB3wUWhu0tcxnWtnbnDphLhfecEe0yxWj2JAIEWAHcA3w3tntIpRSJvAH3JsgVAIblVLPa613nZwSxcnUvmYNtX98IvLIvdbjGk8V+rsPsmhiKkX1Rdy39T5sx+bVild7uqsMZXDdtOt47uBzPeMcV065kiunXDnku6y6/fSuH7JvQi5NC8+jUJ0OuIPnBg6ONjEdTfwOi9t+/NcoVyrEEAkRrfVucKfKfh9LgANa6+LIuk8CVwESIiNI55YtND34IB2vvoYvL4dwZSXacSdFnHHNtcRPTGV16Wq+/ca3e64i791dpVBkJ2b3e4vZoR4e/++nDxNIbOBPy67Ewr3yvLv1gVac1bqX+IZmxjTX8ssf3x3tcoUAhkiIHKPxQEWvx5XA0ijVIk6Azs1bKPv0p8G2wTDIuusnqLZiOl9/iapFc7gn+QAl//48m+o29VxJ3l93VTTnrxqInz/0aUJGCsUzC9g4Zn7PqbtoGxON1u7puzlFrXzrkx99z1X2QkTTSQsRpdQaIKufl76vtX7uWDbRz3O6n+dQSt0C3AKQl5d3zDWK6PKvW+cGCIBSdG3bRtqXbuG5iYq7N9yN3uf+c5+ZcyaFdYXDtruq2/fvf42shrWwxOY+8/M4uGeeGZEWlqkdbmxYR0ObyczWFu748V1RrFaI/p20ENFaf+RDbqISyO31eAJQfZTPuh+4H6CgoKDfoBFDT8Kys2l66CG0ZaE9Js8k7mHdi59kW+O2nnVMZVKQVcCt824ddt1V3Xb86jsUOw5Gjo+/T1pIiXkFGqNn4sRz9RrG6SZyt6fS1pjCQz/9SrRLFuKohlN31kZgqlJqElAF3ADcGN2SxGCKX7CAvEceZu8r/8dPQ/9ir/UyNMKFeRfyRtUbQ2K69Q/j7z+5mrr0DLbnn86BMV72qlMBULgTJjrawNQOs0pKSWmqIi93Nld+43tRrlqI9zckQkQpdTXwOyAdeFEpVaS1vkgplYN7Ku+lWmtLKfU1YBXuKb4Paa13RrFscQLEL1hAoVnI3i3uY0MZnJp2Kp+Z9Zlh113V7eZ7HsZODuNZOocXzat6uq2AyKA5LGzbSmyHw+Q9lZyesZDzv/On6BUsxHEYEiGitX4WeLaf56uBS3s9XgmsPImliShYnLWYGDNmWLc8fvw/vyatoYHGqfG8tPASbExQS3rOtlLaxug1aL50ew2XjWth/k9+He3ShTguQyJEhOhtfsb8fk/RHQ5W3PWfdMR0EpqSzN+XLKbMm4fdc7aVg4njBod2uLL6Rdr9Ps5t13zhv/4ruoULMUASImJIGk4tj/t+dgeNKXGUpKUSWpDF/qTJlKpT3FYHDqa20ChMbXNp4ypawpnEHWhlakw8t3/v29EuX4gPRUJEiAF44H+/TG1iGmXjUmmZNYn1SUvdsQ6liNV+0A4oA0NrztGvkKabyN8xBk9TF3HLMvjip26J9i4IMSgkRIQ4Bge2vcvqZx+mKS2HsnFJtMyYxfqk03uCo/dYxxn6Td5U52JpD6bWLCwpIaV+F1+8841o74YQg05CRIijWH33F6hp8lKWn0tJZjLNi+azMb7gPcFx+Mpy8GAz50Aj882/UehZzKk+L9+6+b5o74oQJ4yEiBARf/rTg2yyUpja2khrUjkHZyykOTaJHTFz0Kj3DY7lFa/T5TVJLj1ERUcuf/zZ16O9O0KcFBIiYtR69uffo9CnqM3JJLnNx9PTFmMpA5gMnOaGBXxAcChSSttIbE/hrru/Fc3dESIqJETEqFC9bzcb/vQgigQ251lUZKcRnJrB2tSzsPFABn1DI+Lw9Ry9g8PDmNJ68mo8/MfvfhqdHRJiiJAQESNObXErLzz9H9SmJ3NQL2RuWzVtaYcoOqeAVp9mT+yMw91T3bSDitwJ0cSdANHRhhsclevo9HpILakhtyOJr//sO9HYLSGGJAkRMaz95TefoMaXzEHvIk7tqieUWMPOxFMxF83gVeOj2Jj8mwXvbWUoBdrBQAMaDzafdB6mQyVxqrOLhpKpFCdOJKEizLmnzeeacz4atX0UYiiTEBFD3r7N/+KFF1+lMxuK1VRmdjZixzexJ24antnT+bd5GTYmLwEc2cIA95oNTeR5p8+4xg3VG2nxhJla5ycp4Cchdj9e3zy+/GWZfkSIYyEhIoaELQ8/xVtb3yY5HaqyTPapSUzqbMUb08S2lKl4Ts+KtCyM9wmLXrP+dw+CozB6uqfcW8tecvAt7BTNgpouwi0lXD7rXJbdJhNCCzEQEiLihHvm6Wdo27wXK66GmhxFsZrG1I5WvAkt7FYTyQl3EBzbxc4LF+CJDbBZLX7vTLe9HREWbpdU37DwaM0nGt6guXMsM1srCaTUsIXF5LYF+PXtt534nRZilJAQEQP2wq+uZ39KGjs9i5jQXEJCcgv7PAsY31JOYnIre9Us0oN1qDTN1jNy8MUnskGdiYPBKqDnZpX9hURkzKJnnaOEhaEdLmv8Ny3hTOY112Ek1LFHz2VOg0NGWyWfufs/T84PQ4hRSkJEsO7hJ9i3diN75yXRlJXArGqbZo+mLsPDjBqbFtOhNsvLlDqbDitMRW4y44NtWPMy+LvxGSxMVN5cQLl36MtbwAcHRN8B7u7uqd5TpPfXsmjqTGCavxo7vom9ejZTmmFsqIUrL15CboHMRyXEySYhMowV1RexZ8WvqFap7NLzGH+ohJjkJnap2cxsb8GXVM9Wpvcs79DTmNfaRnBsLTv0dGZ0dtA59hB746dhXzmTTWMWYGHyUqZ7UHdQvJCpUSj3lNh03hsKEVr3Co3u3qZjDIg+Yxba4dqal2kNJTGps5XYmCb2M4npbWGm6xqu+NY9J/RnKoQ4PhIiJ8jrLxeyoqyWlOBWYuJrKNUFZHZW4kuooVwvJtNfTkxCHWW6gCx/Bb7EOsr1IrI6KvElucuZHRXEJNZRTgHZHWV4UlrY61lIhr8ab1IbxXGnEJc3jTXGxdiYKObRffB/JXIk1xiscSMAjYp0IwFK8cpRancw+rQYdGT93mc5KW0zT29mp5qHjXnUUDgyIC6vfpHO0LieMZG9Kp9JHa14klopNSZwyqEgd9x+5wn5NxFCDD4JkaMobPXz9qEO5nqqyA9voNS7lDcaE8lu2UKsqmVb5zTS2ktQZjV7mUtaRwWe2BZK1AzQXbyRvgB7cg4GWYB7YFbMpvsgr5iN6lnu7gpSwPyeAz4s6FVRr2sd6P8+G7rXYLTu011E3yDoGWc43Eo4fM0EKGwU7sV2Bu4FeEcue7BZVL6XpZ7tlFtzyWspe8+YyD5jNjktZcQmN7NHTWS2Ucodn//jh/lnEUIMMRIi/Shs9XPNlgOEIgfZeD2bThTgB6a5f2IVxGYfftPYaf1uy+59YO9zkFc9B/YPPOAf0Qro+7z7CRowcNyDP8YxtQz6jDk4cH35DlrjG5lRFTzqmEjAsqjOjmFSQ5D4A14CZiz//Z8XkZub+yF+4kKI4UpCpB9vH+rA0u6ZQGiHGEJ0okEZ7/ub/Psd2G2MD3WQP+py5OyksP//t3d3IXbcZRzHv7+N2bRsm7ZJk7okabshm8SEpjE5SFQUL3wtaLQiBIQGtb5ceNmLSEAKvVLwptQqCoG2FAsWX4IgWoUoBbVubJN0bZLuxjXNC5to7as2je7jxfxPO1nO7Nmd7DkzZ/P7wHDm/GcGnmdm/zw7L2f+g6x5aWLW90RGpzaw7aWXs/sjGmbjv5YzPLCCXbt2d2MXm9kC4SLSwvuuv4b+PnFxaopFusid8WMe0Re4GO/IvVdphv/q+S+fn9rHa1zHTRNT9C9647Lviax67QWWLD3PUTVY/eJJrl16mqOLG9ww8QrrBgb52j13V7a/zOzK5SLSQuO6AR7fui53T+R2PrJ48Vv3RK7uO8fov9cz+PpJ+vtOcnxqOytfOcVA/0nGp7ay/PUzDF09yerhzXzobo8rYWYLlyL/698FqNFoxMjISNVhmJn1FEkHI6LRbr2+diuYmZkVcRExM7PSXETMzKw0FxEzMyvNRcTMzEpzETEzs9IW/CO+ks4Dfy+5+Y3AP+YxnCo5l/pZKHmAc6mry8nllohY0W6lBV9ELoekkdk8J90LnEv9LJQ8wLnUVTdy8eUsMzMrzUXEzMxKcxGZ2Q+qDmAeOZf6WSh5gHOpq47n4nsiZmZWms9EzMysNBcRQNLnJI1KmpLUyLXfKuk/kp5J0/dzy7ZLOiJpTNL90ltj11aqKJe07Bsp3mOSPpZr/3hqG5O0p/tRtyfpXkmnc8fijtyylnnVWS/s85lImkh//89IGkltyyQ9Ien59HlD1XG2ImmfpHOSns21tYxdmfvTcTosaVt1kV+qII/u95OIuOIn4F3ABuAA0Mi13wo8W7DNU8B7yYY5/CXwiarzaJPLJuAQsAQYAsaBRWkaB9YC/WmdTVXn0SKve4F7WrS3zKvqeNvk0hP7vE0OE8CN09q+DexJ83uAb1UdZ0HsHwS25ft2UezAHal/C9gB/Knq+Nvk0fV+4jMRICKei4hjs11f0iCwNCL+ENkRehj4dMcCnIMZctkJPBYRFyLib8AY8J40jUXEiYh4E3gsrdsrivKqs17f50V2Ag+l+YeoSZ+YLiJ+D7w4rbko9p3Aw5H5I3B96v+VK8ijSMf6iYtIe0OSnpb0O0kfSG2rgFO5dU6ltjpbBbyQ+96Muai9jr6eLinsy10q6aX4m3ox5ukC+LWkg5K+ktpuioizAOlzZWXRzV1R7L14rLraT66Y4XEl/QZ4Z4tFeyPi5wWbnQVujoh/StoO/EzSZrJT2+m69phbyVyKYm71j0Qlj+zNlBfwPeA+stjuA74DfJGKj0VJvRjzdO+PiDOSVgJPSDpadUAd0mvHquv95IopIhHx4RLbXAAupPmDksaB9WRVfHVu1dXAmfmIc5ZxzTkXspjX5L7nYy5q76rZ5iXph8Av0teZ8qqrXoz5EhFxJn2ek/RTsksjk5IGI+JsuuRzrtIg56Yo9p46VhEx2ZzvVj/x5awZSFohaVGaXwsMAyfS6e6rknakp7LuAorOAOslqS8AAAJvSURBVOpiP7BL0hJJQ2S5PAX8GRiWNCSpH9iV1q2VadehPwM0n0gpyqvOemKfF5E0IOna5jzwUbLjsR/YnVbbTf37RF5R7PuBu9JTWjuAl5uXveqokn5S9RMGdZjSzj5FdtYxCfwqtX8WGCV7quEvwCdz2zTSARoHHiD9cLPqqSiXtGxvivcYuafJyJ5AOZ6W7a06h4K8HgGOAIdThxhsl1edp17Y5zPEvjb1iUOpf+xN7cuB3wLPp89lVcdaEP+PyC5VX0x95UtFsZNdBvpuOk5HyD3xWPVUkEfX+4l/sW5mZqX5cpaZmZXmImJmZqW5iJiZWWkuImZmVpqLiJmZleYiYmZmpbmImJlZaS4iZjUg6auSHpzWNippY1Uxmc2Gi4hZPWwBnm5+kXQVcDPZL6jNastFxKxDJB2QtCHNL8+PQNfCbWSv1sl/Px4R/+tkjGaX64p5i69ZBdbx9pnEFrJ3GhXZDPxEUvM9RNfw9htYzWrLRcSsAyTdApyOiKnUtAU4nN56+yDwJnAgIh6VtAY4HxEbc9s/AJzodtxmc+XLWWadsZXsTapN29P3O4HHI+LLwKfSsi1kb8PN28TMZy5mteAiYtYZtwNXAUgaJhvj+gjZYEDNYUqb9ztuA/46bfvNXFqEzGrJRcSsM7YCfZIOAd8EniMb7Cg/Kmaz/11SRCQtIxufZhKzmvN4ImYdIGkMeHdEvDqtfYBsELM3gCcj4tEq4jObLy4iZvMsDR17MCLWVx2LWae5iJiZWWm+J2JmZqW5iJiZWWkuImZmVpqLiJmZleYiYmZmpbmImJlZaS4iZmZWmouImZmV9n+GrIhvGbRKSAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "all_files = get_filenames(folder)\n", "all_files_sorted, saturation = sort_files(all_files)\n", "#fig = plt.figure()\n", "H_list = []\n", "R_list = []\n", "T_list = []\n", "for f in all_files_sorted:\n", " data = pd.read_csv(f, sep=' ', header=2, names=header, index_col=False)\n", " H = np.array(data.H)\n", " V = np.array(data.V)\n", " \n", " if fit_data:\n", " fit_area = data[data.H < data.H.min() + 150]\n", " fit = scipy.stats.linregress(fit_area.H, fit_area.H)\n", " fitting_line = (data.H*fit.slope + fit.intercept)\n", " V = V - fitting_line\n", " \n", " #data = filehandler.load_file(f)\n", " #H = [data[i][H_idx] for i in np.arange(len(data))]\n", " #V = [data[i][V_idx] for i in np.arange(len(data))]\n", " #T = [data[i][T_idx] for i in np.arange(len(data))]\n", "\n", " # Cut of unneccessary data and calculate R_H\n", " #min_H, max_H = cut_data(H)\n", " #H = np.array(H[min_H:max_H])\n", " #V = np.array(V[min_H:max_H])\n", " #T = np.array(T[min_H:max_H])\n", " R = V/current\n", "\n", " H_list.append(H)\n", " R_list.append(R)\n", " #T_list.append(T)\n", "\n", " #plt.plot(list(H) ,list(R))\n", "\n", "sat_avg = []\n", "for sat in saturation:\n", " sat_data = pd.read_csv(sat, sep=' ', header=2, names=header, index_col=False)\n", " sat_V = np.array(sat_data.V)\n", " sat_R = sat_V/current\n", "\n", " sat_avg.append(np.average(sat_R))\n", "\n", "write(out_name, H_list, R_list, T_list, sat_avg)\n", "\n", "plt.show()" ] }, { "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.7.3" } }, "nbformat": 4, "nbformat_minor": 2 }