├── .gitignore ├── Guides ├── Pump │ ├── Initial Blade Profile.docx │ ├── Pump+Calculations.ipynb │ └── Readme.md ├── RadiationEffects │ └── README.md ├── SubinitialStacks │ ├── Demos.ipynb │ ├── motor_demo.ipynb │ └── motor_wave.ipynb ├── admin │ ├── NewMemberProgram.md │ ├── clubRegistration.md │ └── internalPositions.md ├── algorithms │ ├── Graphs.ipynb │ ├── Search.ipynb │ ├── Sorting.ipynb │ └── linked-lists.ipynb ├── evolvableHardware │ └── evolutionaryAlgorithms.md ├── experimentalTechniquesAndSensors │ ├── ADC.ipynb │ ├── DAC.ipynb │ ├── Filters-FirstOrder.ipynb │ ├── OpAmps.ipynb │ ├── README.md │ ├── Temperature.ipynb │ ├── assets │ │ ├── hpfilter.png │ │ ├── lpfilter.png │ │ └── thermopile.png │ └── sensorsOLD.md ├── filtering │ ├── Calibration of an Accelerometer Using GPS.ipynb │ └── State Estimation Using a GPS and Accelerometer.ipynb ├── general │ ├── README.md │ ├── acronyms.md │ ├── assets │ │ ├── Thermal Stresses Chart.jpg │ │ └── Variables.jpg │ ├── heatTransfer.md │ └── thermalStresses.md ├── heatTransfer │ ├── Conduction.ipynb │ ├── Convection.ipynb │ └── assets │ │ ├── HeatTransferConduction_1Drod.gif │ │ ├── HeatTransferConduction_CompositeSlab.PNG │ │ └── HeatTransferConduction_Example1.PNG ├── jetEngine │ └── CompressorAnalysis.ipynb ├── launch_ascent_guidance │ └── Launch Ascent to Orbit.ipynb ├── python │ ├── README.md │ ├── assets │ │ ├── coolingExample.csv │ │ ├── coolingExample.xlsx │ │ └── example.xlsx │ ├── betterGraphs-bokeh.ipynb │ ├── csvToPandas.ipynb │ ├── dataAnalysis.ipynb │ ├── excelToPandas.ipynb │ ├── intro.md │ ├── jupyternotebooks.md │ ├── plotly-basic-plotting.ipynb │ ├── timing.ipynb │ └── values.md ├── sensors │ ├── accelerometer.ipynb │ └── load_cell.ipynb ├── stacksGuides │ ├── DMM_example.ipynb │ ├── Source_Meter_example.ipynb │ └── Stacks_Getting_Started.ipynb └── styleGuides │ ├── rpl_c_style_guide.md │ └── rpl_python_style_guide.md ├── LICENSE ├── README.md └── index.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.DS_Store 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | env/ 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *,cover 48 | .hypothesis/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # IPython Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # dotenv 81 | .env 82 | 83 | # virtualenv 84 | venv/ 85 | ENV/ 86 | 87 | # Spyder project settings 88 | .spyderproject 89 | 90 | # Rope project settings 91 | .ropeproject 92 | -------------------------------------------------------------------------------- /Guides/Pump/Initial Blade Profile.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/Pump/Initial Blade Profile.docx -------------------------------------------------------------------------------- /Guides/Pump/Pump+Calculations.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Pump Calculations" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 4, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np" 19 | ] 20 | }, 21 | { 22 | "cell_type": "markdown", 23 | "metadata": {}, 24 | "source": [ 25 | "## Power Input" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": null, 31 | "metadata": { 32 | "collapsed": false 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "#Constants and inputs\n", 37 | "g = 32.174; #gravitational acceleration, ft/s^2\n", 38 | "rho_LOx = 71.27; #Density of Liquid Oxygen- lbm/ft^3\n", 39 | "rho_LCH4 = 26.3; #Density of Liquid Methane- lbm/ft^3\n", 40 | "\n", 41 | "Differential = #Desired pressure differential (psi)\n", 42 | "\n", 43 | "mLOx = #Mass flow of Liquid Oxygen (lb/s)\n", 44 | "mLCH4 = #Mass Flow of Liquid Methane (lb/s)" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": null, 50 | "metadata": { 51 | "collapsed": false 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "#Head Calculations\n", 56 | "HLOx = (((Differential)*144)/(rho_LOx * g))*32.174 #Head of Liquid Oxygen - ft\n", 57 | "HLCH4 = (((Differential)*144)/(rho_LCH4 * g))*32.174 #Head of Liquid Methane - ft" 58 | ] 59 | }, 60 | { 61 | "cell_type": "code", 62 | "execution_count": null, 63 | "metadata": { 64 | "collapsed": false 65 | }, 66 | "outputs": [], 67 | "source": [ 68 | "#Power Calculations - Assume a 75% effiency (Minimum value that we can reach)\n", 69 | "Power_LOx = (((mLOx * g * HLOx)/0.75)/32.174) * 1.36; #Output is in Watts\n", 70 | "Power_LCH4 = (((mLCH4 * g * HLCH4)/0.75)/32.174) * 1.36; #Output is in Watts" 71 | ] 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "metadata": {}, 76 | "source": [ 77 | "## Impeller Calculations" 78 | ] 79 | }, 80 | { 81 | "cell_type": "markdown", 82 | "metadata": {}, 83 | "source": [ 84 | "### Constants" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": null, 90 | "metadata": { 91 | "collapsed": true 92 | }, 93 | "outputs": [], 94 | "source": [ 95 | "QLOx = mLOx/rho_LOx #Volumetric flow rate of Liquid Oxygen in ft^3/s\n", 96 | "QLCH4 = mLCH4/rho_LCH4 #Volumetric flow rate of Liquid Methane in ft^3/s\n", 97 | "\n", 98 | "Eff_Vol = #Volumetric effiency is a measure of how much fluid is lost due to leakages, estimate the value\n", 99 | "\n", 100 | "QImp_LOx = QLox/Eff_Vol #Impeller flow rate of Liquid oxygen in ft^3/s\n", 101 | "QImp_LCH4 = QLCH4/Eff_Vol #Impeller flow rate of Liquid methane in ft^3/s\n", 102 | "\n", 103 | "n = #RPM of impeller, pick such that nq_LOx is low but not too low\n", 104 | "\n", 105 | "nq_LOx = n * (QImp_LOx ** 0.5)/(HLOx ** 0.75) #Specific speed of Liquid Oxygen\n", 106 | "nq_LCH4 = n * (QImp_LCH4 ** 0.5)/(HLCH4 ** 0.75) #Specific speed of Liquid Methane\n", 107 | "\n", 108 | "omegas_LOx = nq_LOx/52.9 #Universal specific speed\n", 109 | "omegas_LCH4 = nq_LCH4/52.9 #Universal specific speed\n", 110 | "\n", 111 | "tau = #Shear stress of desired metal (Pa)\n", 112 | "\n", 113 | "fq = 1 #Number of impeller inlets, either 1 or 2\n", 114 | "f_t = 1.1 #Given earlier in the text\n", 115 | "\n", 116 | "PC_LOx = 1.21*f_t*(np.exp(-0.408*omegas_LOx))* nq #Pressure coefficient of static pressure rise in impeller of Liquid Oxygen, the equation given uses nq_ref, but I just use nq because I didn't define an nq_ref\n", 117 | "PC_LCH4 = 1.21*f_t*(np.exp(-0.408*omegas_LCH4))* nq #Pressure coefficienct of static pressure rise in impeller of Liquid Methane\n" 118 | ] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": {}, 123 | "source": [ 124 | "#### Shaft diameter" 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": null, 130 | "metadata": { 131 | "collapsed": true 132 | }, 133 | "outputs": [], 134 | "source": [ 135 | "dw_LOx = 3.65(Power_LOx)/(rpm*tau) #Shaft diameter of Liquid Oxygen Impeller\n", 136 | "dw_LCH4 = 3.65(Power_LCH4)/(rpm*tau) #Shaft diameter of Liquid Methane Impeller" 137 | ] 138 | }, 139 | { 140 | "cell_type": "markdown", 141 | "metadata": {}, 142 | "source": [ 143 | "#### Specific Speed" 144 | ] 145 | }, 146 | { 147 | "cell_type": "code", 148 | "execution_count": null, 149 | "metadata": { 150 | "collapsed": true 151 | }, 152 | "outputs": [], 153 | "source": [ 154 | "q_LOx = QLOx * 3600 * (.3048 ** 3) #converts ft^3/s to m^3/h\n", 155 | "q_LCH4 = QLCH4 * 3600 * (.3048 ** 3) #converts ft^3/s to m^3/h\n", 156 | "\n", 157 | "\n", 158 | "ps = 200 #static pressure in fluid close to impeller in psi\n", 159 | "pv_LOX = \n", 160 | "pv_LCH4 = \n", 161 | "A_LOx = #see two lines below to see what to do \n", 162 | "A_LCH4 = #see two lines below to see what to do\n", 163 | "v_LOx = (mLOx / rho_LOx) / A_LOx #Define A above as the area of the inlet pipe in ft^2\n", 164 | "v_LCH4 = (mLCH4 / rho_LCH4) / A_LCH4 #Define A above as the area of the inlet pipe in ft^2\n", 165 | "\n", 166 | "\n", 167 | "NPSH_LOx = ps/rho_LOx * (v_LOx ** 2)/(2*9.81) - pv/rho_LOx #substitue pv as Vapor Pressure of Oxygen at temperature in psi above \n", 168 | "NPSH_LCH4 = ps/rho_LOx * (v_LOx ** 2)/(2*9.81) - pv/rho_LOx #substitue pv as Vapor Pressure of Methane at temperature in psi above \n", 169 | "\n", 170 | "\n", 171 | "nss_LOx = n*(q_LOx ** 0.5)/(NPSH_LOx ** 0.75)\n", 172 | "nss_LCH4 = n*(q_LCH4 ** 0.5)/(NPSH_LCH4 ** 0.75)" 173 | ] 174 | }, 175 | { 176 | "cell_type": "markdown", 177 | "metadata": {}, 178 | "source": [ 179 | "#### Inlet diameter" 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": null, 185 | "metadata": { 186 | "collapsed": true 187 | }, 188 | "outputs": [], 189 | "source": [ 190 | "#Note: The equation given in the book uses a (1+tan(Beta1)/tan(alpha1)) term, but since the impeller is radial, alpha1 is 90 so the term goes to infinity and therefore results in a multiplication by 1\n", 191 | "#Beta1 is determined by finding the specific suction speed** and reading off of the graph, or using:\n", 192 | "#kn = 1 - (dn ** 2)/(d1 ** 2); Just choose a value (I assumed inlet diameter ~ 1.15x the size of dn, the hub diameter) since d1 depends on the value of kn and vice versa\n", 193 | " tan_Beta1_LOx = (kn) ** 1.1 * (125/nss_LOx) ** 2.2 * (nq_LOx/27) ** 0.418 #Calculates Beta with a 40% std deviation, so a large amount of values is determined with this formula\n", 194 | " tan_Beta1_LCH4 = (kn) ** 1.1 * (125/nss_LCH4) ** 2.2 * (nq_LCH4/27) ** 0.418 #Calculates Beta with a 40% std deviation, so a large amount of values is determined with this formula\n", 195 | "\n", 196 | "d1_LOx = 2.9 * (QImp_LOx/(fq*n*kn*tan_Beta1_LOx))^(1/3)\n", 197 | "d1_LCH4 = 2.9 * (QImp_LCH4/(fq*n*kn*tan_Beta1_LCH4))^(1/3)" 198 | ] 199 | }, 200 | { 201 | "cell_type": "markdown", 202 | "metadata": {}, 203 | "source": [ 204 | "#### Exit Diameter" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 9, 210 | "metadata": { 211 | "collapsed": false 212 | }, 213 | "outputs": [ 214 | { 215 | "ename": "NameError", 216 | "evalue": "name 'n' is not defined", 217 | "output_type": "error", 218 | "traceback": [ 219 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 220 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 221 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0md2_LOx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m60\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m9.81\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mHLOx\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m0.3048\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mPC_LOX\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0md2_LCH4\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m60\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m9.81\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mHLCH4\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;36m0.3048\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mPC_LCH4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 222 | "\u001b[0;31mNameError\u001b[0m: name 'n' is not defined" 223 | ] 224 | } 225 | ], 226 | "source": [ 227 | "d2_LOx = 60/(np.pi * n) * (2 * 9.81 * (HLOx * 0.3048)/(PC_LOX)) ** 0.5\n", 228 | "d2_LCH4 = 60/(np.pi * n) * (2 * 9.81 * (HLCH4 * 0.3048)/(PC_LCH4)) ** 0.5" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "#### Blade Thickness" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": null, 241 | "metadata": { 242 | "collapsed": true 243 | }, 244 | "outputs": [], 245 | "source": [ 246 | "e_LOx = 0.022 * d2_LOx #Blade thickness for LOx, this number may have to go up for manufacturing purposes\n", 247 | "e_LCH4 = 0.022 * d2_LCH4 #Blade thickness for LCH4, this number may have to go up for manufacturing purposes" 248 | ] 249 | }, 250 | { 251 | "cell_type": "markdown", 252 | "metadata": {}, 253 | "source": [ 254 | "#### Leading and Trailing Edge Profiles" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 1, 260 | "metadata": { 261 | "collapsed": false 262 | }, 263 | "outputs": [ 264 | { 265 | "ename": "NameError", 266 | "evalue": "name 'e_LOx' is not defined", 267 | "output_type": "error", 268 | "traceback": [ 269 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 270 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 271 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mcp_min_sf\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0.155\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mLp1_LOx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m4\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.373\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m#Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mLp2_LOx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m4\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.373\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LOx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m#Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mLp1_LCH4\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m4\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m4\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LCH4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m*\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.373\u001b[0m \u001b[1;33m*\u001b[0m \u001b[0me_LCH4\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m**\u001b[0m \u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m*\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mcp_min_sf\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m0.373\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[0me_LCH4\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m#Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 272 | "\u001b[0;31mNameError\u001b[0m: name 'e_LOx' is not defined" 273 | ] 274 | } 275 | ], 276 | "source": [ 277 | "cp_min_sf = 0.155\n", 278 | "Lp1_LOx = (2 + (4 + 4 * ((cp_min_sf/0.373)/e_LOx)*(0.373 * e_LOx)) ** 0.5)/ (2 * (cp_min_sf/0.373)/e_LOx) #Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\n", 279 | "Lp2_LOx = (2 - (4 + 4 * ((cp_min_sf/0.373)/e_LOx)*(0.373 * e_LOx)) ** 0.5)/ (2 * (cp_min_sf/0.373)/e_LOx) #Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\n", 280 | "\n", 281 | "Lp1_LCH4 = (2 + (4 + 4 * ((cp_min_sf/0.373)/e_LCH4)*(0.373 * e_LCH4)) ** 0.5)/ (2 * (cp_min_sf/0.373)/e_LCH4) #Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\n", 282 | "Lp2_LCH4 = (2 - (4 + 4 * ((cp_min_sf/0.373)/e_LCH4)*(0.373 * e_LCH4)) ** 0.5)/ (2 * (cp_min_sf/0.373)/e_LCH4) #Leading Edge profile, simplification of formula in Centrifugal Pumps in terms of Quadratic formula\n", 283 | "#Take whichever value above comes out positive, assumed an elliptical profile where cp,min,sf was given as 0.155. Formula changes if cp_min_sf changes\n", 284 | "\n", 285 | "TE_LOx = e_LOx/2 #Trailing edge for Liquid Oxygen using the most simple formula given\n", 286 | "TE_LCH4 = e_LCH4/2 #Trailing edge for Liquid Methane using the most simple formula given" 287 | ] 288 | }, 289 | { 290 | "cell_type": "markdown", 291 | "metadata": {}, 292 | "source": [ 293 | "# Impeller Calcuations" 294 | ] 295 | }, 296 | { 297 | "cell_type": "code", 298 | "execution_count": 8, 299 | "metadata": { 300 | "collapsed": false 301 | }, 302 | "outputs": [ 303 | { 304 | "ename": "NameError", 305 | "evalue": "name 'd2_LOx' is not defined", 306 | "output_type": "error", 307 | "traceback": [ 308 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 309 | "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", 310 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mu2_LOX\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0md2_LOx\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m60\u001b[0m \u001b[1;31m#Circumferential speed at the outer diameter of the impeller for Liquid Oxygen\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mu2_LCH4\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0md2_LCH4\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m60\u001b[0m \u001b[1;31m#Circumferential speed at the outer diameter of the impeller for Liquid Methane\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mu1m_LOx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0md1_LOx\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m60\u001b[0m \u001b[1;31m#Circumferential speed at the inner diameter of the impeller for Liquid Oxygen\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mu1m_LCH4\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpi\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0md1_LOx\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m60\u001b[0m \u001b[1;31m#Circumferential speed at the inner diameter of the impeller for Liquid Methane\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 311 | "\u001b[0;31mNameError\u001b[0m: name 'd2_LOx' is not defined" 312 | ] 313 | } 314 | ], 315 | "source": [ 316 | "#Reference values given on page 667 of Centrifugal Pumps and then converted to imperial from metric\n", 317 | "nq_ref = 40 #unitless\n", 318 | "Href = 3280.84 #meters to feet\n", 319 | "rho_ref = 62.428 #lb/ft^3 \n", 320 | "\n", 321 | "\n", 322 | "tau3 = 1 #given\n", 323 | "epsilon_sp = np.pi #Radians. Guessed from the fact that doube volutes are generally at 180\n", 324 | "\n", 325 | "QLe_LOx = QImp_LOx/0.95 * 0.0283168 #m^3/s. Assume that the leakages due to the volute are really low\n", 326 | "QLe_LCH4 = QImp_LCH4/0.95 * 0.0283168 #m^3/s\n", 327 | "\n", 328 | "b3_LOx = 1 #Guess; Width of the diffuser inlet (cm)\n", 329 | "b3_LCH4 = 1 #Guess; Width of the diffuser inlet (cm)\n", 330 | "\n", 331 | "u2_LOX = (np.pi*d2_LOx*n)/60 #Circumferential speed at the outer diameter of the impeller for Liquid Oxygen\n", 332 | "u2_LCH4 = (np.pi*d2_LCH4*n)/60 #Circumferential speed at the outer diameter of the impeller for Liquid Methane\n", 333 | "\n", 334 | "u1m_LOx = (np.pi*d1_LOx*n)/60 #Circumferential speed at the inner diameter of the impeller for Liquid Oxygen\n", 335 | "u1m_LCH4 = (np.pi*d1_LOx*n)/60 #Circumferential speed at the inner diameter of the impeller for Liquid Methane\n", 336 | "\n", 337 | "c1u = 1 #Formula is c1m/tan(alpha1) but alpha1 is 90 degrees, so it simplifies to 1\n", 338 | "Qref = 1 #Since Volumetric Flow was calculated absolutely, the \"reference\" value is 1\n", 339 | "\n", 340 | "a = 1 #Taken from book for Q less than or equal to 1 m^3/s\n", 341 | "m_LOx = 0.08 * a * (Qref/QImp_LOx) ** 0.15 * (45/nq_LOx) ** 0.06 #Exponential to find hydraulic efficiency\n", 342 | "m_LCH4 = 0.08 * a * (Qref/QImp_LCH4) ** 0.15 * (45/nq_LCH4) ** 0.06 #Expoential to find hydraulic efficiency\n", 343 | "\n", 344 | "Eff_Hyd_LOx = 1 - 0.055 * (Qref/QImp_LOx) ** m_LOx - 0.2 * (0.26 - np.log10(nq_LOx/25)) ** 2 #Hydraulic Efficiency of LOx Pump\n", 345 | "Eff_Hyd_LCH4 = 1 - 0.055 * (Qref/QImp_LCH4) ** m_LCH4 - 0.2 * (0.26 - np.log10(nq_LCH4/25)) ** 2 #Hydraulic Efficiency of LCH4 Pump\n", 346 | "\n", 347 | "c2u_LOx = (g*HLOx)/(Eff_Hyd_LOx*u2_LOx)+(u1m_LOx*c1u)/u2_LOx #Circumferential component of absolute velocity at impeller outlet for Liquid Oxygen \n", 348 | "c2u_LCH4 = (g*HLCH4)/(Eff_Hyd_LCH4*u2_LCH4)+(u1m_LCH4*c1u)/u2_LCH4 #Circumferential component of absolute velocity at impeller outlet for Liquid Methane\n", 349 | "\n", 350 | "d3_LOx = d2_LOx * (1.03 + 0.1*(nq_LOx/nq_ref)*0.07(rho_LOx * HLOX)/(rho_ref*Href)) #distance of the gap bewteen the impeller and volute for Liquid Oxygen\n", 351 | "d3_LCH4 = d2_LCH4 * (1.03 + 0.1*(nq_LCH4/nq_ref)*0.07(rho_LCH4 * HLCH4)/(rho_ref*Href)) #distance of the gap bewteen the impeller and volute for Liquid Methane\n", 352 | "\n", 353 | "c3u_LOx = d2_LOx * c2u_LOx / d3_LOx #Circumferential component of absolute velocity at diffuser inlet for Liquid Oxygen\n", 354 | "c3u_LCH4 = d2_LCH4 * c2u_LCH4 / d3_LCH4 #Circumferential component of absolute velocity at diffuser inlet for Liquid Methane\n", 355 | "\n", 356 | "c3m_LOx = QLe_LOx*tau3/(np.pi*d3_LOx*b3_LOx) #Meridional component of absolute velocity at diffuser inlet for Liquid Oxygen\n", 357 | "c3m_LCH4 = QLe_LCH4 * tau3/(np.pi*d3_LCH4*b3_LCH4) #Meridional component of absolute velocity at diffuser inlet for Liquid Methane\n", 358 | "\n", 359 | "tan_alpha3_LOx = c3m_LOx/c3u_LOx #Flow angle at diffuser inlet with blockage for Liquid Oxygen\n", 360 | "tan_alpha3_LCH4 = c3m_LCH4/c3u_LCH4 #Flow angle at diffuser inlet with blockage for Liquid Methane\n", 361 | "\n", 362 | "alpha3b_LOx = np.degrees(np.arctan(tan_alpha3_LOx)) + 3 #Degrees. Diffuser vane inlet, can change the scalar 3 anywhere in the realm of real numbers of [-3,3] for Liquid Oxygen\n", 363 | "alpha3b_LCH4 = np.degrees(np.arctan(tan_alpha3_LCH4)) + 3 #Degrees. Diffuser vane inlet, can change the scalar 3 anywhere in the realm of real numbers of [-3,3] for Liquid Methane\n", 364 | "\n", 365 | "r2_LOx = d2_LOx/2 #Radius of the impeller outlet for Liquid Oxygen\n", 366 | "r2_LCH4 = d2_LCH4/2 #Radius of the impeller outlet for Liquid Methane\n", 367 | "\n", 368 | "#Throat area calculations, many variables are used that aren't entirely explained\n", 369 | "Xsp_LOx = (QLe_LOx * epsilon_sp)/(np.pi*c2u_LOx*r2_LOx * 2 * np.pi) \n", 370 | "Xsp_LCH4 = (QLe_LCH4 * epsilon_sp)/(np.pi*c2u_LCH4*r2_LCH4 * 2 * np.pi)\n", 371 | "\n", 372 | "d3q_LOx = Xsp_LOx + (2*d3_LOx*Xsp_LOx) ** 0.5\n", 373 | "d3q_LCH4 = Xsp_LCH4 + (2*d3_LCH4*Xsp_LCH4) ** 0.5\n", 374 | "\n", 375 | "A3q_LOx = np.pi*((d3q_LOx) ** 2)/4 \n", 376 | "A3q_LCH4 = np.pi*((d3q_LCH4) ** 2)/4" 377 | ] 378 | } 379 | ], 380 | "metadata": { 381 | "kernelspec": { 382 | "display_name": "Python 3", 383 | "language": "python", 384 | "name": "python3" 385 | }, 386 | "language_info": { 387 | "codemirror_mode": { 388 | "name": "ipython", 389 | "version": 3 390 | }, 391 | "file_extension": ".py", 392 | "mimetype": "text/x-python", 393 | "name": "python", 394 | "nbconvert_exporter": "python", 395 | "pygments_lexer": "ipython3", 396 | "version": "3.6.0" 397 | } 398 | }, 399 | "nbformat": 4, 400 | "nbformat_minor": 2 401 | } 402 | -------------------------------------------------------------------------------- /Guides/Pump/Readme.md: -------------------------------------------------------------------------------- 1 | 2 | # Overview 3 | 4 | Centrifugal Pumps are a complex project to make work, and as such one singular guide cannot be made to describe the process behind creating one. 5 | 6 | Instead, begin by accessing the file "Pump+Calculations.ipynb" and follow the comments to go through initial calculations for blade and volute profiles. 7 | 8 | Next, look at "Initial Blade Profile.docx" in order to create an initial blade profile that can be iterated, a tutorial for which will follow soon. 9 | -------------------------------------------------------------------------------- /Guides/RadiationEffects/README.md: -------------------------------------------------------------------------------- 1 | # Radiation Effects 2 | This folder has calculations and guides describing the types of radiation in space and their effects on spacecraft, with a focus on the effects on materials and electronics. 3 | ## Overview of Radiation Effects Engineering] 4 | ### Radiation Sources in Space 5 | #### Galactic Cosmic Rays 6 | #### Near Earth Radiation 7 | ##### Proton Belts 8 | ##### Electron Belts 9 | #### Solar Radiation 10 | ##### Solar Energetic Particles 11 | Released during solar flares. General Helium Ions 12 | ### Radiation Effects 13 | __ELECTRONICS__ 14 | Generally speaking, the damage incurred in electronics from radiation is a result of energy deposition in the silicon dioxide layer of transistors. 15 | _transient effects_ 16 | _permanent effects_ 17 | __MATERIALS__ 18 | #### Single Event Effect (SEE) 19 | A single event effect results from a single energetic particle impacting a transistor. 20 | ##### Single Event Upset (SEU) 21 | #### Total Ionizing Dose 22 | #### Displacement Damage Dose 23 | ### Instrumentation 24 | ### Sensing 25 | -------------------------------------------------------------------------------- /Guides/SubinitialStacks/Demos.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Subinitial Stacks Input Follow Demo" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "# -*- coding: UTF-8 -*-\n", 19 | "# Analog Deck RgbLed Example\n", 20 | "# © 2012-2015 Subinitial LLC. All Rights Reserved\n", 21 | "# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the\n", 22 | "# following conditions are met: Redistributions of source code and binary forms must retain the above copyright notice,\n", 23 | "# these conditions, and the disclaimer below all in plain text. The name Subinitial may not be used to endorse or\n", 24 | "# promote products derived from this software without prior written consent from Subinitial LLC. This software may only\n", 25 | "# be redistributed and used with a Subinitial Stacks product.\n", 26 | "\n", 27 | "# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied\n", 28 | "# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Refer to the included LICENSE.txt for more details.\n", 29 | "import time\n", 30 | "import subinitial.stacks as stacks\n", 31 | "\n", 32 | "core = stacks.Core(host=\"192.168.1.49\") # Default host IP\n", 33 | "analogdeck = stacks.AnalogDeck(core, bus_address=2) # Default Analog Deck bus address" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": { 40 | "collapsed": false 41 | }, 42 | "outputs": [], 43 | "source": [ 44 | "analogdeck.dio.set_config(dio0_3_innotout=False, dio4_7_innotout=True) # Set 0-3 as outputs, 4-7 as inputs" 45 | ] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "execution_count": null, 50 | "metadata": { 51 | "collapsed": false 52 | }, 53 | "outputs": [], 54 | "source": [ 55 | "state = True\n", 56 | "# set DIO3 output to follow the input of DIO5\n", 57 | "analogdeck.dio.clear(0,1,2,3)\n", 58 | "while(state):\n", 59 | " \n", 60 | " time.sleep(2)\n", 61 | " \n", 62 | " analogdeck.dio.set(5)\n", 63 | "\n", 64 | " if analogdeck.dio.get_pin_status(5):\n", 65 | " analogdeck.dio.set(0,1,2,3)\n", 66 | " else:\n", 67 | " analogdeck.dio.clear(0,1,2,3)" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": null, 73 | "metadata": { 74 | "collapsed": true 75 | }, 76 | "outputs": [], 77 | "source": [] 78 | } 79 | ], 80 | "metadata": { 81 | "kernelspec": { 82 | "display_name": "Python 3", 83 | "language": "python", 84 | "name": "python3" 85 | }, 86 | "language_info": { 87 | "codemirror_mode": { 88 | "name": "ipython", 89 | "version": 3 90 | }, 91 | "file_extension": ".py", 92 | "mimetype": "text/x-python", 93 | "name": "python", 94 | "nbconvert_exporter": "python", 95 | "pygments_lexer": "ipython3", 96 | "version": "3.6.0" 97 | } 98 | }, 99 | "nbformat": 4, 100 | "nbformat_minor": 2 101 | } 102 | -------------------------------------------------------------------------------- /Guides/SubinitialStacks/motor_demo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 5, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "ename": "SubinitialResponseError", 12 | "evalue": "'Connection verification failed for AnalogDeck at busaddress 2', tag: None", 13 | "output_type": "error", 14 | "traceback": [ 15 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 16 | "\u001b[0;31mSubinitialResponseError\u001b[0m Traceback (most recent call last)", 17 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mcore\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstacks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mCore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mhost\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"192.168.1.49\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# Default host IP\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0manalogdeck\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mstacks\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mAnalogDeck\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcore\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbus_address\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# Default Analog Deck bus address\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 18 | "\u001b[0;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\subinitial\\py3\\analog.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, core_deck, bus_address, verify_connection)\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[1;33m:\u001b[0m\u001b[0mtype\u001b[0m \u001b[0mbus_address\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \"\"\"\n\u001b[0;32m---> 34\u001b[0;31m \u001b[0mDevice\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__init__\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcore_deck\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbus_address\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mverify_connection\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mverify_connection\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 35\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mregs\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mRegisterSet\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[1;34m\"\"\":type: RegisterSet\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 19 | "\u001b[0;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\subinitial\\py3\\stacks.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, core, bus_address, raise_response_exceptions, verify_connection)\u001b[0m\n\u001b[1;32m 1129\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mverify_connection\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 1130\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_devicetype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m==\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTYPE_DECK\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconnection\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_is_open\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1131\u001b[0;31m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mverify_connection\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1132\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 1133\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mopener\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mverify_connection\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 20 | "\u001b[0;32mC:\\ProgramData\\Anaconda3\\lib\\site-packages\\subinitial\\py3\\stacks.py\u001b[0m in \u001b[0;36mverify_connection\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1157\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mtries\u001b[0m \u001b[1;33m<=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 1158\u001b[0m raise SubinitialResponseError(\"Connection verification failed for {} at busaddress {}\".format(\n\u001b[0;32m-> 1159\u001b[0;31m type(self).__name__, self.bus_address))\n\u001b[0m\u001b[1;32m 1160\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 1161\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconsole\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"busping\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 21 | "\u001b[0;31mSubinitialResponseError\u001b[0m: 'Connection verification failed for AnalogDeck at busaddress 2', tag: None" 22 | ] 23 | } 24 | ], 25 | "source": [ 26 | "import time\n", 27 | "import subinitial.stacks as stacks\n", 28 | "\n", 29 | "core = stacks.Core(host=\"192.168.1.49\") # Default host IP\n", 30 | "analogdeck = stacks.AnalogDeck(core, bus_address=2) # Default Analog Deck bus address" 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 2, 36 | "metadata": { 37 | "collapsed": false 38 | }, 39 | "outputs": [ 40 | { 41 | "ename": "KeyboardInterrupt", 42 | "evalue": "", 43 | "output_type": "error", 44 | "traceback": [ 45 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 46 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 47 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mset_voltage\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0manalogdeck\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msourcemeter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_sourcevoltage\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvolts\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mset_voltage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 48 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 49 | ] 50 | } 51 | ], 52 | "source": [ 53 | "# --------------APPLICATION CODE-------------- #\n", 54 | "\n", 55 | "# Loop the Sourcemeter code infinitely\n", 56 | "while True:\n", 57 | " # Ramp up motor speed/voltage from 0V to 10V every 1/2 second\n", 58 | " for set_voltage in range(0, 11):\n", 59 | " analogdeck.sourcemeter.set_sourcevoltage(volts=set_voltage)\n", 60 | " time.sleep(0.5)\n", 61 | "\n", 62 | " # Ramp down motor speed/voltage from 10V to 0V every 1/2 second\n", 63 | " for set_voltage in range(10, -1, -1):\n", 64 | " analogdeck.sourcemeter.set_sourcevoltage(volts=set_voltage)\n", 65 | " time.sleep(0.5)" 66 | ] 67 | }, 68 | { 69 | "cell_type": "code", 70 | "execution_count": 4, 71 | "metadata": { 72 | "collapsed": true 73 | }, 74 | "outputs": [], 75 | "source": [ 76 | "analogdeck.sourcemeter.set_sourcevoltage(volts=0)" 77 | ] 78 | }, 79 | { 80 | "cell_type": "code", 81 | "execution_count": null, 82 | "metadata": { 83 | "collapsed": true 84 | }, 85 | "outputs": [], 86 | "source": [] 87 | } 88 | ], 89 | "metadata": { 90 | "kernelspec": { 91 | "display_name": "Python 3", 92 | "language": "python", 93 | "name": "python3" 94 | }, 95 | "language_info": { 96 | "codemirror_mode": { 97 | "name": "ipython", 98 | "version": 3 99 | }, 100 | "file_extension": ".py", 101 | "mimetype": "text/x-python", 102 | "name": "python", 103 | "nbconvert_exporter": "python", 104 | "pygments_lexer": "ipython3", 105 | "version": "3.6.0" 106 | } 107 | }, 108 | "nbformat": 4, 109 | "nbformat_minor": 2 110 | } 111 | -------------------------------------------------------------------------------- /Guides/SubinitialStacks/motor_wave.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Subinitial Stacks Motor Waveform Input" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 17, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import time\n", 19 | "import subinitial.stacks as stacks\n", 20 | "import numpy as np\n", 21 | "\n", 22 | "core = stacks.Core(host=\"192.168.1.49\") # Default host IP\n", 23 | "analogdeck = stacks.AnalogDeck(core, bus_address=2) # Default Analog Deck bus address" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 25, 29 | "metadata": { 30 | "collapsed": false 31 | }, 32 | "outputs": [ 33 | { 34 | "name": "stdout", 35 | "output_type": "stream", 36 | "text": [ 37 | "DMM measured voltage: 0\n", 38 | "DMM measured voltage: 0\n", 39 | "DMM measured voltage: 0\n", 40 | "DMM measured voltage: 0\n", 41 | "DMM measured voltage: 0\n", 42 | "DMM measured voltage: 0\n", 43 | "DMM measured voltage: 0\n", 44 | "DMM measured voltage: 0\n", 45 | "DMM measured voltage: 0\n", 46 | "DMM measured voltage: 0\n", 47 | "DMM measured voltage: 0\n", 48 | "DMM measured voltage: 0\n", 49 | "DMM measured voltage: 0\n", 50 | "DMM measured voltage: 0\n", 51 | "DMM measured voltage: 0\n", 52 | "DMM measured voltage: 0\n", 53 | "DMM measured voltage: 0\n", 54 | "DMM measured voltage: 0\n", 55 | "DMM measured voltage: 0\n", 56 | "DMM measured voltage: 1\n", 57 | "DMM measured voltage: 2\n", 58 | "DMM measured voltage: 3\n", 59 | "DMM measured voltage: 0\n", 60 | "DMM measured voltage: 0\n", 61 | "DMM measured voltage: 0\n", 62 | "DMM measured voltage: 0\n", 63 | "DMM measured voltage: 0\n", 64 | "DMM measured voltage: 0\n", 65 | "DMM measured voltage: 0\n", 66 | "DMM measured voltage: 0\n", 67 | "DMM measured voltage: 0\n", 68 | "DMM measured voltage: 4\n", 69 | "DMM measured voltage: 3\n", 70 | "DMM measured voltage: 2\n" 71 | ] 72 | }, 73 | { 74 | "ename": "KeyboardInterrupt", 75 | "evalue": "", 76 | "output_type": "error", 77 | "traceback": [ 78 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 79 | "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", 80 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0manalogdeck\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdio\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclear\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mround\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmeasured_voltage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m0.5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 23\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 81 | "\u001b[0;31mKeyboardInterrupt\u001b[0m: " 82 | ] 83 | } 84 | ], 85 | "source": [ 86 | "# Set the Wavegen to apply a continuously-looping waveform instead of a DC voltage\n", 87 | "analogdeck.wavegen.set_control(analogdeck.wavegen.MODE_DC)\n", 88 | "analogdeck.dio.set_config(dio0_3_innotout=False, dio4_7_innotout=True) # Set 0-3 as outputs, 4-7 as inputs\n", 89 | "\n", 90 | "while True:\n", 91 | " for set_voltage in range(0,4):\n", 92 | " analogdeck.wavegen.set_dc(volts=set_voltage)\n", 93 | " \n", 94 | " measured_voltage = analogdeck.dmm.measure_channel(channel=0)\n", 95 | " print(\"DMM measured voltage: \", int(round(measured_voltage)))\n", 96 | "\n", 97 | " analogdeck.dio.set(int(round(measured_voltage)))\n", 98 | " time.sleep(0.5)\n", 99 | " \n", 100 | " for set_voltage in range(4, -1, -1):\n", 101 | " analogdeck.wavegen.set_dc(volts=set_voltage)\n", 102 | " \n", 103 | " measured_voltage = analogdeck.dmm.measure_channel(channel=0)\n", 104 | " print(\"DMM measured voltage: \", int(round(measured_voltage)))\n", 105 | "\n", 106 | " analogdeck.dio.clear(int(round(measured_voltage)))\n", 107 | " time.sleep(0.5)\n", 108 | " " 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 26, 114 | "metadata": { 115 | "collapsed": true 116 | }, 117 | "outputs": [], 118 | "source": [ 119 | "analogdeck.dio.clear(0,1,2,3)" 120 | ] 121 | }, 122 | { 123 | "cell_type": "code", 124 | "execution_count": null, 125 | "metadata": { 126 | "collapsed": true 127 | }, 128 | "outputs": [], 129 | "source": [] 130 | } 131 | ], 132 | "metadata": { 133 | "kernelspec": { 134 | "display_name": "Python 3", 135 | "language": "python", 136 | "name": "python3" 137 | }, 138 | "language_info": { 139 | "codemirror_mode": { 140 | "name": "ipython", 141 | "version": 3 142 | }, 143 | "file_extension": ".py", 144 | "mimetype": "text/x-python", 145 | "name": "python", 146 | "nbconvert_exporter": "python", 147 | "pygments_lexer": "ipython3", 148 | "version": "3.6.0" 149 | } 150 | }, 151 | "nbformat": 4, 152 | "nbformat_minor": 2 153 | } 154 | -------------------------------------------------------------------------------- /Guides/admin/NewMemberProgram.md: -------------------------------------------------------------------------------- 1 | # New Member Rotation Program 2 | 3 | New Members will participate in a year-long program to introduce them to basics of propulsion, structures, and avionics. The intention of this program is to allow new members to find a discipline which they are most interested in. 4 | 5 | ## Leadership 6 | 7 | Two new member leads will be assigned to guide the new members through each of the projects. 8 | -------------------------------------------------------------------------------- /Guides/admin/clubRegistration.md: -------------------------------------------------------------------------------- 1 | # Club Registration and Principal Member Registration 2 | This guide is written to help new principal members through the exhausting and testing process of registering as a principal member of an engineering organization at UCSD. This guide also compiles the knowledge regarding the maintaining the club's registration. 3 | 4 | ## Club Registration 5 | The Rocket Propulsion Laboratory needs to be reregistered each year! New principal members should prioritize reregistration to ensure that there are no delays to projects or funding. 6 | 7 | ### Organization Type 8 | RPL is currently registered as an [__educational organization__](https://students.ucsd.edu/student-life/involvement/organizations/onestop/requirements.html#Educational-organizations). The original intent with registering as an educational organization was to get around the need for a community advisor. Unfortunately, litigation analysis is requiring us to have an advisor who will sign off on all of our activities. The advisor must be either a faculty member or industry member. 9 | 10 | ### Constitution 11 | The constitution _must_ have this snippet. 12 | 13 | > Please copy & paste the following into your Constitution: 14 | 15 | > “Executive Board does not have the sole authority to approve an activity, as that authority rests with the faculty/community advisor. STUDENT ORG NAME will comply with all COMPETITION OR PARENT ORGANIZATION NAME, Federal, and State safety requirements, and federal and state laws governing the manufacturing, use, and transportation of rockets, aeronautic and astronautic components/vehicles, as well as materials used to construct such components/vehicles. STUDENT ORG NAME will ensure members know applicable state and federal laws (including laws governing the transportation of materials used to construct rockets/aeronautic/astronautic components) and work in conjunction with safety personnel. Each team must designate a safety officer to evaluate risks and regulatory restrictions, then incorporate appropriate controls into design and activity plans that ensure maximum safety and full regulatory compliance for review and approval by the club’s faculty advisor. Use of hazardous materials (chemicals, flammable solvents, reactive materials, fuels, propellants, etc.) must be reviewed and approved by the club’s faculty advisor, or his/her department’s designee. In the event any chemicals or hazardous materials/equipment is used, members must abide by any best practices for the use of such chemicals or equipment, and should work under close supervision of those trained in the handling of chemicals/use of equipment. Members must also abide by departmental rules when using equipment belonging to that department. Transportation of hazardous chemicals, fuels, and/or machinery will be done by a licensed carrier. This organization is a registered student organization at University of California, San Diego, but not part of the University itself. UCSD STUDENT ORG NAME understands that the University does not assume legal liability for any of the organization’s activities”. 16 | 17 | ### Community Advisor 18 | Registration requires a community advisor per the statement above. The community advisor is required to sign the ["Community Advisor Agreement"](https://students.ucsd.edu/_files/student-life/involvement/organizations/onestop/Community%20Advisor%20Signature.pdf). 19 | 20 | ## Principal Members 21 | 22 | The university provides a [guide](https://students.ucsd.edu/student-life/involvement/organizations/register.html) to registering a student organization. The guide includes all the steps that are required for registering as a principal member as well, however they will also be listed here. Note: this guide may not always capture changes to the registration process. 23 | 24 | A total of 4-8 principal members are required for the organization. Historically, 4 seems to work well, and I (Cameron) see no good reason to have more and add more bureaucracy. 25 | 26 | [This page](https://students.ucsd.edu/student-life/involvement/organizations/onestop/principal-members.html) provides more information on the registration of principal members. 27 | 28 | ### Triton's Together 29 | One time consuming part of the registration part is taking Triton's Together. Triton's Together schedule fills up quickly, particularly at the beginning of the academic year. Check the availability and register for Triton's Together [here](http://tritonstogether.ucsd.edu/). 30 | -------------------------------------------------------------------------------- /Guides/admin/internalPositions.md: -------------------------------------------------------------------------------- 1 | # Internal Positions 2 | 3 | ### Department Leads 4 | -------------------------------------------------------------------------------- /Guides/algorithms/Graphs.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Graphs\n", 8 | "\n", 9 | "Graphs are structures used to model objects and their relationships to other objects. They are made up of **vertecies** and **edges**. Graphs can be further classified as directed or undirected.\n", 10 | "\n", 11 | "\n", 12 | "**Notes:**
\n", 13 | "A graph is **directed** if there is a weight (or capacity) associated with each direction of an edge. (A->B or B->A).
\n", 14 | "Vertecies are **adjacent** if there is an edge connecting them.
\n", 15 | "A graph is called a **tree** if it contains no cycles.\n", 16 | "\n", 17 | "\n", 18 | "Problems will be solved with `cvxpy` where applicable." 19 | ] 20 | }, 21 | { 22 | "cell_type": "code", 23 | "execution_count": 3, 24 | "metadata": {}, 25 | "outputs": [], 26 | "source": [ 27 | "import cvxpy as cp" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "## Common Graph Problems\n", 35 | "### Min-Cut Max-Flow\n", 36 | "Min-cut max-flow is a common example of a graph problem. A network, defined as a graph with directed edges and verticies that conserve flow. It is significant to note that the max-flow problem is the dual of the min-cut problem.\n", 37 | "\n", 38 | "Source and terminal vertecies are defined. In the case of ma\n", 39 | "\n", 40 | "The problem can be formualted as a linear program and solved with widely available solvers." 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": null, 46 | "metadata": {}, 47 | "outputs": [], 48 | "source": [] 49 | } 50 | ], 51 | "metadata": { 52 | "kernelspec": { 53 | "display_name": "Python 3", 54 | "language": "python", 55 | "name": "python3" 56 | }, 57 | "language_info": { 58 | "codemirror_mode": { 59 | "name": "ipython", 60 | "version": 2 61 | }, 62 | "file_extension": ".py", 63 | "mimetype": "text/x-python", 64 | "name": "python", 65 | "nbconvert_exporter": "python", 66 | "pygments_lexer": "ipython2", 67 | "version": "2.7.15" 68 | } 69 | }, 70 | "nbformat": 4, 71 | "nbformat_minor": 2 72 | } 73 | -------------------------------------------------------------------------------- /Guides/algorithms/Search.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Search Algorithms" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import numpy as np" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "## Binary Search" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 42, 29 | "metadata": {}, 30 | "outputs": [ 31 | { 32 | "name": "stdout", 33 | "output_type": "stream", 34 | "text": [ 35 | "10\n" 36 | ] 37 | } 38 | ], 39 | "source": [ 40 | "arr = np.random.random(100)\n", 41 | "arr = np.sort(arr)\n", 42 | "\n", 43 | "# find 8\n", 44 | "\n", 45 | "def binary_search(array, value):\n", 46 | " \"\"\"Find the value in the array using binary search.\"\"\"\n", 47 | " arr = array\n", 48 | " res = 0\n", 49 | " while True:\n", 50 | " idx = len(arr)//2\n", 51 | " if value > arr[idx]:\n", 52 | " arr = arr[idx:]\n", 53 | " res += idx\n", 54 | " elif value < arr[idx]:\n", 55 | " arr = arr[:idx]\n", 56 | " elif value == arr[idx]:\n", 57 | " return idx + res\n", 58 | "\n", 59 | "print(binary_search(arr,arr[10]))" 60 | ] 61 | } 62 | ], 63 | "metadata": { 64 | "kernelspec": { 65 | "display_name": "Python 3", 66 | "language": "python", 67 | "name": "python3" 68 | }, 69 | "language_info": { 70 | "codemirror_mode": { 71 | "name": "ipython", 72 | "version": 2 73 | }, 74 | "file_extension": ".py", 75 | "mimetype": "text/x-python", 76 | "name": "python", 77 | "nbconvert_exporter": "python", 78 | "pygments_lexer": "ipython2", 79 | "version": "2.7.15" 80 | } 81 | }, 82 | "nbformat": 4, 83 | "nbformat_minor": 2 84 | } 85 | -------------------------------------------------------------------------------- /Guides/algorithms/Sorting.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Sorting Algorithms" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 8, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import numpy as np" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "## Quicksort\n", 24 | "\n", 25 | "Generally fastest sorting algorith. Uses a divide an conquere scheme." 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 71, 31 | "metadata": {}, 32 | "outputs": [], 33 | "source": [ 34 | "def quicksort(arr,low,high):\n", 35 | " pivot = arr[low] # pivot on the first value in the array\n", 36 | " j = low # index of smaller element\n", 37 | " for i in range(low,high):\n", 38 | " if arr[i] <= pivot:\n", 39 | " print('swap')\n", 40 | " swap(arr,i,j)\n", 41 | " j = j+1\n", 42 | " if low < high:\n", 43 | " quicksort(arr,low,low-1)\n", 44 | " quicksort(arr,low+1,high)\n", 45 | " return arr" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 70, 51 | "metadata": {}, 52 | "outputs": [ 53 | { 54 | "name": "stdout", 55 | "output_type": "stream", 56 | "text": [ 57 | "swap\n", 58 | "swap\n", 59 | "swap\n", 60 | "swap\n", 61 | "swap\n", 62 | "swap\n", 63 | "swap\n", 64 | "swap\n", 65 | "swap\n", 66 | "swap\n", 67 | "swap\n", 68 | "swap\n", 69 | "swap\n", 70 | "swap\n", 71 | "swap\n", 72 | "[0 0 2 1 6 4 3 9 7 5]\n" 73 | ] 74 | } 75 | ], 76 | "source": [ 77 | "arr = np.array([0, 7, 2, 4, 6, 1, 0, 9, 3, 5])\n", 78 | "print(quicksort(arr,0,len(arr)-1))" 79 | ] 80 | }, 81 | { 82 | "cell_type": "markdown", 83 | "metadata": {}, 84 | "source": [ 85 | "## Heapsort\n", 86 | "\n", 87 | "Create a max heap with the input array and then swap the first and last element. Reduce sort space by 1 and continue until only one element is in the sort space." 88 | ] 89 | }, 90 | { 91 | "cell_type": "code", 92 | "execution_count": null, 93 | "metadata": {}, 94 | "outputs": [], 95 | "source": [] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 23, 100 | "metadata": {}, 101 | "outputs": [], 102 | "source": [ 103 | "def heapify(arr, root, n):\n", 104 | " largest = root\n", 105 | " l = 2*root+1\n", 106 | " r = 2*root+2\n", 107 | " \n", 108 | " if l > len(arr)-1:\n", 109 | " return arr\n", 110 | " \n", 111 | " if l < n and arr[l] > arr[largest]:\n", 112 | " largest = l\n", 113 | " if r < len(arr)-1:\n", 114 | " if r < n and arr[r] > arr[largest]:\n", 115 | " largest = r\n", 116 | " if largest != root:\n", 117 | " arr[root], arr[largest] = arr[largest], arr[root]\n", 118 | " heapify(arr, root, n)\n", 119 | "\n", 120 | "def swap(arr,i,j):\n", 121 | " arr[i], arr[j] = arr[j], arr[i]\n", 122 | "\n", 123 | "def heapsort(arr):\n", 124 | " n = len(arr)\n", 125 | " while n > 1:\n", 126 | " for i in range(0,n):\n", 127 | " heapify(arr,i,n)\n", 128 | " swap(arr,0,n-1)\n", 129 | " n -= 1\n", 130 | "\n", 131 | " return arr" 132 | ] 133 | } 134 | ], 135 | "metadata": { 136 | "kernelspec": { 137 | "display_name": "Python 3", 138 | "language": "python", 139 | "name": "python3" 140 | }, 141 | "language_info": { 142 | "codemirror_mode": { 143 | "name": "ipython", 144 | "version": 2 145 | }, 146 | "file_extension": ".py", 147 | "mimetype": "text/x-python", 148 | "name": "python", 149 | "nbconvert_exporter": "python", 150 | "pygments_lexer": "ipython2", 151 | "version": "2.7.15rc1" 152 | } 153 | }, 154 | "nbformat": 4, 155 | "nbformat_minor": 2 156 | } 157 | -------------------------------------------------------------------------------- /Guides/algorithms/linked-lists.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Linked Lists" 8 | ] 9 | } 10 | ], 11 | "metadata": { 12 | "kernelspec": { 13 | "display_name": "Python 3", 14 | "language": "python", 15 | "name": "python3" 16 | }, 17 | "language_info": { 18 | "codemirror_mode": { 19 | "name": "ipython", 20 | "version": 2 21 | }, 22 | "file_extension": ".py", 23 | "mimetype": "text/x-python", 24 | "name": "python", 25 | "nbconvert_exporter": "python", 26 | "pygments_lexer": "ipython2", 27 | "version": "2.7.15rc1" 28 | } 29 | }, 30 | "nbformat": 4, 31 | "nbformat_minor": 2 32 | } 33 | -------------------------------------------------------------------------------- /Guides/evolvableHardware/evolutionaryAlgorithms.md: -------------------------------------------------------------------------------- 1 | # Evolutionary Algorithms 2 | 3 | Evolutionary algorithms can be applied to design problems to converge on an optimal solution for multidimensional problems. 4 | 5 | ## Genetic Algorithms 6 | Genetic algorithms use a selection, mutation sequence of steps to converge on a solution that lies on the _Pareto Front_. 7 | 8 | ### Step 1: Generate Initial Population 9 | Generate at least _R_ linearly independent individuals for a problem in _R_ space. 10 | 11 | ### Step 2: Selection 12 | Evaluate the population against a fitness function of _R_ variables and select a subset >1 of the individuals to remain. 13 | 14 | ### Step 3: Mutation 15 | Apply semi-stochastic operations to the selected population to create a new population of _R_ individuals. 16 | 17 | ### Step 4: Recursion 18 | Repeat steps 1-3 until the fitness of an individual passes the termination test. 19 | 20 | ### Step 5: Completion 21 | Termination yields a single individual that is _an_ optimal solution. This method is nondeterministic, so multiple optimal solutions are possible. Perhaps add option to throw "nonstochastic" flag to the program to ensure the program converges on the same solution. 22 | 23 | ## Challenges 24 | Defining fitness functions requires detailed knowledge of the system and how it responds to wiggling different parameters. 25 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/ADC.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Analog to Digital Conversion (ADC)\n", 8 | "\n", 9 | "Also see [Digital to Analog Conversion](DAC.ipynb)" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": null, 15 | "metadata": { 16 | "collapsed": true 17 | }, 18 | "outputs": [], 19 | "source": [] 20 | } 21 | ], 22 | "metadata": { 23 | "kernelspec": { 24 | "display_name": "Python 3", 25 | "language": "python", 26 | "name": "python3" 27 | }, 28 | "language_info": { 29 | "codemirror_mode": { 30 | "name": "ipython", 31 | "version": 3 32 | }, 33 | "file_extension": ".py", 34 | "mimetype": "text/x-python", 35 | "name": "python", 36 | "nbconvert_exporter": "python", 37 | "pygments_lexer": "ipython3", 38 | "version": "3.6.0" 39 | } 40 | }, 41 | "nbformat": 4, 42 | "nbformat_minor": 2 43 | } 44 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/DAC.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "collapsed": true 7 | }, 8 | "source": [ 9 | "# Digital to Analog Conversion (DAC)\n", 10 | "\n", 11 | "Also see [Analog to Digital Conversion](ADC.md)\n", 12 | "\n", 13 | "### Resolution\n", 14 | "An n-bit digital to analog converter with range, $b (volts)$ to $a (volts)$, the resolution is described with the following relation:\n", 15 | "$$ Res = \\frac{b-a}{2^N} $$\n", 16 | "\n", 17 | "On data sheets, the \"resolution\" refers to the number of bits used to perform the conversion.\n", 18 | "\n", 19 | "An example is performed below." 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 1, 25 | "metadata": { 26 | "collapsed": false 27 | }, 28 | "outputs": [ 29 | { 30 | "name": "stdout", 31 | "output_type": "stream", 32 | "text": [ 33 | "Resolution = 0.00030517578125 Volts/bit\n" 34 | ] 35 | } 36 | ], 37 | "source": [ 38 | "b = +10 # +10 Volts\n", 39 | "a = -10 # -10 Volts\n", 40 | "N = 16 # 16 bit resolution\n", 41 | "\n", 42 | "Res = (b-a)/2**N\n", 43 | "print('Resolution =', Res, 'Volts/bit')" 44 | ] 45 | } 46 | ], 47 | "metadata": { 48 | "kernelspec": { 49 | "display_name": "Python 3", 50 | "language": "python", 51 | "name": "python3" 52 | }, 53 | "language_info": { 54 | "codemirror_mode": { 55 | "name": "ipython", 56 | "version": 3 57 | }, 58 | "file_extension": ".py", 59 | "mimetype": "text/x-python", 60 | "name": "python", 61 | "nbconvert_exporter": "python", 62 | "pygments_lexer": "ipython3", 63 | "version": "3.6.0" 64 | } 65 | }, 66 | "nbformat": 4, 67 | "nbformat_minor": 2 68 | } 69 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/Filters-FirstOrder.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# First Order Filters\n", 8 | "\n", 9 | "This notebook goes through calculations of first order low- and high-pass filters.\n", 10 | "\n", 11 | "To start, lets import the libraries that will be used during this tutorial." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": null, 17 | "metadata": { 18 | "collapsed": true 19 | }, 20 | "outputs": [], 21 | "source": [ 22 | "import numpy as np\n", 23 | "import plotly.plotly as py\n", 24 | "import plotly.graph_objs as go" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "## Time Constant\n", 32 | "\n", 33 | "The time constant of an RC circuit, $\\tau$, can be describe by the following relation:\n", 34 | "$$ \\tau = RC $$\n", 35 | "\n", 36 | "The turnover or cutoff frequency can be determined with the time constant.\n", 37 | "\n", 38 | "$$ f_c = \\frac{1}{2 \\pi \\tau} $$" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": null, 44 | "metadata": { 45 | "collapsed": false 46 | }, 47 | "outputs": [ 48 | { 49 | "name": "stdout", 50 | "output_type": "stream", 51 | "text": [ 52 | "Time constant, tau = 1.0 s\n", 53 | "Cutoff frequency, f = 6.283185307179586 Hz\n" 54 | ] 55 | } 56 | ], 57 | "source": [ 58 | "# inputs\n", 59 | "R = 1000 # resistace in ohms\n", 60 | "C = 0.001 # capacitance in farads\n", 61 | "\n", 62 | "tau = R*C\n", 63 | "fc = 2*np.pi*tau\n", 64 | "print('Time constant, tau =', tau, 's')\n", 65 | "print('Cutoff frequency, f =', fc, 'Hz')" 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "## Low-Pass (LP) Filter\n", 73 | "\n", 74 | "A low pass filter uses a resistor and capacitor with the voltage read across the capacitor and the input voltage into the resistor. The reactance of the capacitor blocks low frequency signals.\n", 75 | "\n", 76 | "![Low Pass Filter](assets/lpfilter.png)\n", 77 | "\n", 78 | "The response of the low pass filter is,\n", 79 | "\n", 80 | "$$ V_o = V_i \\frac{1}{\\sqrt{1+(\\omega R C)^2}} $$\n", 81 | "\n", 82 | "Where $ \\omega $ is the frequency and $RC$ is $ \\tau $." 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": null, 88 | "metadata": { 89 | "collapsed": false 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# inputs\n", 94 | "Vi = 5 # volts\n", 95 | "\n", 96 | "# define a linear space of omega that is significantly greatr that fc\n", 97 | "omega = np.linspace(0.01*fc,fc*5,1000)\n", 98 | "Vo_lp = Vi*1/np.sqrt(1+(omega*tau)**2)\n", 99 | "\n", 100 | "Gdb_lp = 20*np.log10(Vo_lp/Vi) # Where Gdb is the power \n", 101 | "\n", 102 | "# plot with plotly\n", 103 | "# Create traces\n", 104 | "legend = ['Low Pass Gain']\n", 105 | "tracelp = go.Scatter(\n", 106 | " x=np.log10(omega),\n", 107 | " y=Gdb_lp,\n", 108 | " mode='lines',\n", 109 | " name=legend[0]\n", 110 | ")\n", 111 | "\n", 112 | "# Edit the layout\n", 113 | "layout = dict(title='Output Voltage of First Order Low-Pass Filter vs. Time',\n", 114 | " xaxis=dict(title='Log[Frequency (Hz)]'),\n", 115 | " yaxis=dict(title='Power Gain (dB)'),\n", 116 | " )\n", 117 | "data = [tracelp] # put trace in array (plotly formatting)\n", 118 | "\n", 119 | "fig = dict(data=data, layout=layout)\n", 120 | "py.iplot(fig, filename=\"FirstOrderLPFilter\")" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "Now, we can find the $-3 dB$ frequency with this discrete data set if we interoplate, or if we just look at the graph and find the point where the Gain in dB is $-3$." 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": null, 133 | "metadata": { 134 | "collapsed": false 135 | }, 136 | "outputs": [], 137 | "source": [ 138 | "freq3db = 0 # logarithmic frequency at -3db\n", 139 | "freqcut = 10**freq3db\n", 140 | "print('Therefore, the cutoff frequency is', freqcut, 'Hz')" 141 | ] 142 | }, 143 | { 144 | "cell_type": "markdown", 145 | "metadata": {}, 146 | "source": [ 147 | "## High Pass Filter\n", 148 | "\n", 149 | "A first order high-pass filter similarly uses a resistor and capacitor, however, the output voltage is measured across the resistor.\n", 150 | "\n", 151 | "![High Pass Filter](assets/hpfilter.png)\n", 152 | "\n", 153 | "The response of the high-pass filter is,\n", 154 | "\n", 155 | "$$ V_o = V_i \\frac{\\omega R C}{\\sqrt{1+ (\\omega R C)^2}}$$" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": null, 161 | "metadata": { 162 | "collapsed": false 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "Vo_hp = Vi*(omega*tau)/np.sqrt(1+(omega*tau)**2)\n", 167 | "\n", 168 | "Gdb_hp = 20*np.log10(Vo_hp/Vi) # Where Gdb is the power \n", 169 | "\n", 170 | "# plot with plotly\n", 171 | "# Create traces\n", 172 | "legend = ['High Pass Gain']\n", 173 | "tracehp = go.Scatter(\n", 174 | " x=np.log10(omega),\n", 175 | " y=Gdb_hp,\n", 176 | " mode='lines',\n", 177 | " name=legend[0]\n", 178 | ")\n", 179 | "\n", 180 | "# Edit the layout\n", 181 | "layout = dict(title='Output Voltage of First Order High-Pass Filter vs. Time',\n", 182 | " xaxis=dict(title='Log[Frequency (Hz)]'),\n", 183 | " yaxis=dict(title='Power Gain (dB)'),\n", 184 | " )\n", 185 | "data = [tracehp] # put trace in array (plotly formatting)\n", 186 | "\n", 187 | "fig = dict(data=data, layout=layout)\n", 188 | "py.iplot(fig, filename=\"FirstOrderHPFilter\")" 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": {}, 194 | "source": [ 195 | "Now, overlaying the graphs" 196 | ] 197 | }, 198 | { 199 | "cell_type": "code", 200 | "execution_count": null, 201 | "metadata": { 202 | "collapsed": false, 203 | "scrolled": false 204 | }, 205 | "outputs": [], 206 | "source": [ 207 | "# Edit the layout\n", 208 | "layout = dict(title='Output Voltage of First Order High-Pass and Low-Pass Filter vs. Time',\n", 209 | " xaxis=dict(title='Log[Frequency (Hz)]'),\n", 210 | " yaxis=dict(title='Power Gain (dB)'),\n", 211 | " )\n", 212 | "data = [tracehp, tracelp] # put trace in array (plotly formatting)\n", 213 | "\n", 214 | "fig = dict(data=data, layout=layout)\n", 215 | "py.iplot(fig, filename=\"FirstOrderFilters\")" 216 | ] 217 | } 218 | ], 219 | "metadata": { 220 | "kernelspec": { 221 | "display_name": "Python 3", 222 | "language": "python", 223 | "name": "python3" 224 | }, 225 | "language_info": { 226 | "codemirror_mode": { 227 | "name": "ipython", 228 | "version": 3 229 | }, 230 | "file_extension": ".py", 231 | "mimetype": "text/x-python", 232 | "name": "python", 233 | "nbconvert_exporter": "python", 234 | "pygments_lexer": "ipython3", 235 | "version": "3.6.0" 236 | } 237 | }, 238 | "nbformat": 4, 239 | "nbformat_minor": 2 240 | } 241 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/OpAmps.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [] 11 | } 12 | ], 13 | "metadata": { 14 | "kernelspec": { 15 | "display_name": "Python 3", 16 | "language": "python", 17 | "name": "python3" 18 | }, 19 | "language_info": { 20 | "codemirror_mode": { 21 | "name": "ipython", 22 | "version": 3 23 | }, 24 | "file_extension": ".py", 25 | "mimetype": "text/x-python", 26 | "name": "python", 27 | "nbconvert_exporter": "python", 28 | "pygments_lexer": "ipython3", 29 | "version": "3.6.0" 30 | } 31 | }, 32 | "nbformat": 4, 33 | "nbformat_minor": 2 34 | } 35 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/README.md: -------------------------------------------------------------------------------- 1 | # Index for Experimental Techniques and Sensors 2 | 3 | A lot of this information is from UCSD's MAE 170 course. 4 | 5 | ## Experimental Techniques 6 | 7 | 8 | ## Sensors and Circuits 9 | 1. [Digital to Analog Conversion (DAC)](DAC.ipynb) 10 | 1. [Analog to Digital Conversion (ADC)](ADC.ipynb) 11 | 1. [First Order Filters](Filters-FirstOrder.ipynb) 12 | 1. [OpAmps](OpAmps.ipynb) 13 | 1. [Temperature](Temperature.ipynb) 14 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/Temperature.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Temperature Measurements" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "## Thermocouples\n", 15 | "\n", 16 | "Thermocouples are temperature measurement devices that are formed with two dissimilar metals where the junction is the measurement element. The temperature at the thermocouple junction generates a voltage as a result of the __Seebeck Effect__.\n", 17 | "\n", 18 | "In order to get higher confidence in measurements, a thermopile can be constructed where the temperature is the average of the measurements made by each of the thermocouples.\n", 19 | "\n", 20 | "\n", 21 | "\n", 22 | "Measurements of voltage made with thermocouples can easily be related to temperature with the following relation:\n", 23 | "\n", 24 | "$$ \\Delta V = \\alpha (T - T_{ref}) $$\n", 25 | "\n", 26 | "Where $\\alpha$, the slope, is dependent on the type of thermocouple used, $T_ref$ is the reference temperature (generally $T_ref = 0$), and $T$ is the measured temperature." 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": null, 32 | "metadata": { 33 | "collapsed": true 34 | }, 35 | "outputs": [], 36 | "source": [] 37 | } 38 | ], 39 | "metadata": { 40 | "kernelspec": { 41 | "display_name": "Python 3", 42 | "language": "python", 43 | "name": "python3" 44 | }, 45 | "language_info": { 46 | "codemirror_mode": { 47 | "name": "ipython", 48 | "version": 3 49 | }, 50 | "file_extension": ".py", 51 | "mimetype": "text/x-python", 52 | "name": "python", 53 | "nbconvert_exporter": "python", 54 | "pygments_lexer": "ipython3", 55 | "version": "3.6.0" 56 | } 57 | }, 58 | "nbformat": 4, 59 | "nbformat_minor": 2 60 | } 61 | -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/assets/hpfilter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/experimentalTechniquesAndSensors/assets/hpfilter.png -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/assets/lpfilter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/experimentalTechniquesAndSensors/assets/lpfilter.png -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/assets/thermopile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/experimentalTechniquesAndSensors/assets/thermopile.png -------------------------------------------------------------------------------- /Guides/experimentalTechniquesAndSensors/sensorsOLD.md: -------------------------------------------------------------------------------- 1 | # Sensing and Measurements 2 | 3 | This list is a compilation of sensor descriptions and some useful calculations. 4 | 5 | ## Sensors 6 | Sensors come in a few different flavors. Most generally, digital and analog sensors. The majority of sensors RPL uses are analog. Analog sensors have an output that is a continuously variable signal. I.e. it operates in continuous time. 7 | 8 | ### Load Cells 9 | 10 | #### Principle of Operation 11 | 12 | 13 | #### Practical Concern 14 | 15 | 16 | ### Accelerometers 17 | _**At A Glance**:_
18 | Accelerometers measures _proper_ acceleration. By incorporating an accelerometer into an inertial measurement system, one can integrate once to obtain a velocity and integrate twice to obtain a position. Many accelerometers are integrated into one chip with a 3-axis accelerometer, 3-axis gyroscope, and 3-axis magnetometer. This 9-axis measurement can be combined with a Kalman filter to obtain accurate data. 19 | 20 | #### Principle of Operation 21 | 22 | 23 | #### Practical Concerns 24 | 25 | 26 | ### Thermocouples 27 | _**At A Glance**:_
28 | Thermocouples are simple, robust, sensors used to measure temperature. They are inherently analog. Measurements of the voltage can be made to correspond to a temperature given that the material properties of the thermocouples are known. This is known as the _Seebeck Voltage_. 29 | 30 | Thermocouples generally have the largest temperature range of sensors. K-type temperature thermocouples have a temperature range of approximately 0 to 1250 C, but it is possible to push the temperature range higher. 31 | 32 | #### Overview 33 | Thermocouples consist of two dissimilar materials joined at an electric junction. If both ends are joined, and there is a temperature difference between the joints, a current is generated due to the thermo-electric effect. 34 | 35 | If one end is joined (dissimilar metals), and the other is broken, a voltage is generated. This is known as the Seebeck Voltage. 36 | 37 | #### Principle of Operation 38 | The thermo-electric effect creates a current in the conductors. 39 | 40 | #### Measurements 41 | Requires cold-junction circuit to read temperature. 42 | 43 | #### Practical Concerns 44 | 45 | 46 | ## Measurements 47 | ### ADC 48 | Analog to Digital Conversion 49 | 50 | #### Resolution 51 | The resolution of the ADC limits the 52 | -------------------------------------------------------------------------------- /Guides/general/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/general/README.md -------------------------------------------------------------------------------- /Guides/general/acronyms.md: -------------------------------------------------------------------------------- 1 | # Acronyms 2 | 3 | __ADC__ - Analog to Digital Converter 4 | __ASI__ - Augmented Spark Ignition
5 | __BOM__ - Bill Of Materials
6 | __CAD__ - Computer Aided Design
7 | __COTS__ - Commercial Off The Shelf
8 | __DAC__ - Digital to Analog Converter
9 | __DAQ__ - Data Acquisition System
10 | __P&ID__ - Piping and Instrumentation Diagram
11 | __ISP__ - Specific Impulse
12 | __RPLL__ - Rocket Propulsion Laboratory
13 | __TCA__ - Thrust Chamber Assembly
14 | __TLA__ - Three Letter Acronyms
15 | -------------------------------------------------------------------------------- /Guides/general/assets/Thermal Stresses Chart.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/general/assets/Thermal Stresses Chart.jpg -------------------------------------------------------------------------------- /Guides/general/assets/Variables.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/general/assets/Variables.jpg -------------------------------------------------------------------------------- /Guides/general/heatTransfer.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/general/heatTransfer.md -------------------------------------------------------------------------------- /Guides/general/thermalStresses.md: -------------------------------------------------------------------------------- 1 | # Thermal Stresses 2 | 3 | Using the image below, 4 | 5 | ![alt text](assets/Thermal%20Stresses%20Chart.jpg "Thermal Stresses Chart") 6 | 7 | **1.** Guess **λ** and use **ν** = 0.284 (Poisson's Ratio), draw a line between the 2 points. 8 | 9 | **2.** Use **ΔT** = 600 F and draw a line through where the first line passes the center index to the right index. 10 | 11 | **3.** Create a line at **E** = 30x10^6 _PSI_ through right index to **S** (Thermal Stress). 12 | 13 | From this, we get a **S**= 4000 _PSI_. 14 | 15 | ![alt text](assets/Variables.jpg "Variables") 16 | -------------------------------------------------------------------------------- /Guides/heatTransfer/Conduction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Heat Transfer Conduction Calculations\n", 8 | "This jupyter notebook walks through basic heat transfer calculations.\n", 9 | "\n", 10 | "There are three basic types of heat transfer:\n", 11 | "1. __Conduction__\n", 12 | "1. Convection\n", 13 | "1. Radiation\n", 14 | "\n", 15 | "This tutorial covers __conduction calculations__\n", 16 | "We will be using will use numpy and matplotlib, which are imported below." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "collapsed": false 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import matplotlib.pyplot as plt" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## 1. Conduction\n", 36 | "Conduction is defined as the transfer of heat through matter without motion. Before getting into a detailed derivation of the heat equation, lets take a parochial look at heat transfer analysis. \n", 37 | "\n", 38 | "### Thermal Resistance Circuits\n", 39 | "An analogy between conduction heat transfer and electric circuits can be exploited to aid in problem solving. $\\dot{Q}$, the rate of heat transfer, is analogous to current, and $R$, thermal resistance, is analogous to electric resistance. Thus we can define $\\dot{Q}$.\n", 40 | "$$\\dot{Q} = \\frac{T_1 - T_2}{R}$$.\n", 41 | "\n", 42 | "\n", 43 | "\n", 44 | "\n", 45 | "Lets run through an example using this resistive model. \n", 46 | "\n", 47 | "__Example: 2D Brick Wall__\n", 48 | "A brick wall with thermal insulation on both sides has temperatures $T_1, T_2, T_3, T_4$ which are defined in the image below. Thus, we have __four nodes__ in our resistive model, and __three thermal resistances__.\n", 49 | "\n", 50 | "\n", 51 | "\n", 52 | "\n", 53 | "$k$ is the thermal conductivity.\n", 54 | "\n", 55 | "$$ k_{brick} = k_2 = 0.7 W/m-K $$\n", 56 | "$$ k_{insulation} = k_1 = k_3 = 0.07 W/m-K $$\n", 57 | "$$ A_1 = A_2 = A_3 = A $$\n", 58 | "$$ L1 = L3 = 0.03 $$ \n", 59 | "$$ L2 = 0.1 $$\n", 60 | "\n", 61 | "The overall resistance is:\n", 62 | "$$ R = R_1 + R_2 + R_3 = \\frac{L_1}{k_1 A_1} + \\frac{L_2}{k_2 A_2} + \\frac{L_3}{k_3 A_3} $$\n", 63 | "\n", 64 | "Solving with an arbitrary Area, $A$, we get\n", 65 | "$$ A_1 R_1 = \\frac{L_1}{k_1}, A_2 R_2 = \\frac{L_2}{k_2}, A_3 R_3 = \\frac{L_3}{k_3} $$\n", 66 | "\n", 67 | "Lets calculate values of $AR$" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 2, 73 | "metadata": { 74 | "collapsed": false 75 | }, 76 | "outputs": [ 77 | { 78 | "name": "stdout", 79 | "output_type": "stream", 80 | "text": [ 81 | "[0.4285714285714285, 0.14285714285714288, 0.4285714285714285] m^2 K/W\n" 82 | ] 83 | } 84 | ], 85 | "source": [ 86 | "# Temperatures at stations\n", 87 | "T1 = 150\n", 88 | "T4 = 10 # celcius\n", 89 | "# define values for thermal conductivity\n", 90 | "k = [0.07, 0.7, 0.07]\n", 91 | "# Length of layers\n", 92 | "L = [0.03, 0.1, 0.03]\n", 93 | "\n", 94 | "AR = [] # initialize empty array\n", 95 | "for i in range(0,len(k)):\n", 96 | " AR.append(L[i]/k[i])\n", 97 | "\n", 98 | "print(AR, \"m^2 K/W\")" 99 | ] 100 | }, 101 | { 102 | "cell_type": "markdown", 103 | "metadata": {}, 104 | "source": [ 105 | "These values can be used to calculate $\\dot{Q}$ the rate of heat transfer. This can be related to a more physically relevant value, $\\dot{q}$, the heat flux. Where,\n", 106 | "$$ \\dot{q} = \\frac{\\dot{q}}{A} = \\frac{T_1 - T_4}{RA} $$\n", 107 | "$$ RA = \\sum_{n}{AR_n} $$" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 3, 113 | "metadata": { 114 | "collapsed": false 115 | }, 116 | "outputs": [ 117 | { 118 | "name": "stdout", 119 | "output_type": "stream", 120 | "text": [ 121 | "q = 140.0 W/m^2\n" 122 | ] 123 | } 124 | ], 125 | "source": [ 126 | "q = float(T1 - T4)/np.sum(AR)\n", 127 | "print('q = ', q, 'W/m^2') # W/m^2" 128 | ] 129 | }, 130 | { 131 | "cell_type": "markdown", 132 | "metadata": {}, 133 | "source": [ 134 | "The temperature in the intermediary steps can be found using the fact that $\\dot{Q}$ is constant throughout the slab.\n", 135 | "\n", 136 | "$$ \\dot{q} = \\frac{T_1 - T_2}{R_1 A} $$" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 5, 142 | "metadata": { 143 | "collapsed": false 144 | }, 145 | "outputs": [ 146 | { 147 | "data": { 148 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEWCAYAAAB8LwAVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VPW9//HXOwsEEiBAIOwGEEFWFdTWqgWX6rUqbnjt\n7WJvbb12U+91r/pzqVpcW3u17W31Wnu1UsWNYrFSCopVsaLsoqzKvoMk7Mnn98c5gck4SWaSzJws\nn+fjMY/M2d9z5mQ+c77nzDkyM5xzzrl4WVEHcM451zh5gXDOOZeQFwjnnHMJeYFwzjmXkBcI55xz\nCXmBcM45l5AXCNekSWotqVRSjwaa3x2SHgmfD5J0oCHmG87vCEnbG2p+LUmy607SmZKWZiJT3HLz\nJJmkXmH3BEm3ZDpHQ/MC0cDCD6vKR4Wk3THdX486X31IWi/pxAwu78xwHVauv1WSnpF0dOU4ZrbX\nzArMbG0S86r1g8PMbjOzHzVQ/irry8w+NrPChph3NcvLlrRG0gfpWkZDkHSFpAMx7+sySd+taZqG\nXnfhB/oeSSNi+l0WfsjH95vTUMttarxANLDww6rAzAqAT4FzYvo9HXW+6kjKaaTLWB6uy/bACcAK\n4C1JJzVoODKzDtLsNKAAGCppWF1mkMF1MCPm/+RrwMOSBmcqk5ntAf4JnBzT+2RgcYJ+bzT08psK\nLxAZFn7Lu1XSckmbJT0tqTAcNij8ZnVZ+E1wi6TvSDpB0gJJ2yU9FDOvKyT9XdL/SPpM0iJJJ8cM\n7yTpD+E32VWSbpOUFTfto5K2ATeGy58haaukTZKelNQuHP85oCvwWvit78pE38pjvzVLGi/pj5L+\nJGkncElNr78mZlZhZqvM7CfA08DPwmXE79qPlbRY0s7wNV8pqTPwItAv5ltr52ryjZf0WNxrukLS\nOklrJf04pn+VZoTY9VHN+qrSZCWpj6S/hOv7Y0mXxgwbH66bZ8LXMk/SUbWspkuBicDU8HnsayiK\n2Ra2SfpTbObwPdkA/Drs/8Pwm/0WSS9IKg77Z4fbzCZJOyTNlTSwunVf2/sKYGbvAsuAQeF8Kv8P\nvidpFfCXBOsu4euJJ+m6cN11SzD4DaoWg5OAexP0eyOc15ckzQr/D9dK+rma/peKmpmZP9L0AFYC\np8X1uwGYCfQA8oDfA0+EwwYBBjwMtAbOBcqA54EioA+wDTg+HP8K4ADwAyAX+BawFWgfDp8C/DfQ\nFugOfABcGjft94BsoE24/FOAVkA34B1gfEz29cCJMd1nAkvjXt/BcYDxwF7gLIIvI21qev0J1t/n\n5h/2PyvMnhvOw4Be4bAtwHHh887A0TVkTZRvPPBY3PvxZDjs6HD9Vr6+CcAt1eVNsL4GAQdiumcB\nPw/f61HhvL8Uk20XcHr4/vyc4Ft3ddta+3D8U4CvA+uA7Jjh04D/AwrD9/fkmMwHgDvD/m3C9bEe\nGB6u398Cr4XjjwXeDpeXBQwButa07hNkvQL4W/hcBHuGO4CSuPX+GMG2W7ltHkjy9SwNn98TruNO\n1eQ4A1gfPu8FfAx0ANbG9LOY13cccGz4fvQHlgJXhMPit8Mq20ZTfUQeoDk/SFwgVlR+CITdfcN/\nbMX8Y3SOGV4GjI3pfiVmo7wCWBE3/3nAOOCwcNrcmGH/DkyJmfbjWvJfArwd012XAvFasq8/wfKr\nKxBHVa6nBP+YG8PX2a62eVWTL1GBKIkZ/kvg0fB5nQsEMADYA7SJGf5z4DcxOSbHDDsG2F7De/Vd\nYA3Bh3Z++N7/S8w63he/TmIyx28nTwN3xnQXAhUEXxrOAhYSfFhmxc0r4bpPsMwrgP3AdqA0XMf3\nx60nA3pUs+5qez3LgEeB6TVlIWiO2w8MJGjmejzsPyem34c1TH8j8Ez4vFkWCG9iyiBJAnoT7DJv\nV3BWxgcE/9Sdw9HKzWxLzGS7gQ1x3QUx3avjFvMJwbfzwwg22k0xy3oYKI4Zd1Vcvh6SnlPQvPUZ\nwTe4ojq81FgHl5Hk609GT6Ac+CzBsLHAhcCnYRPascnmS3KcyvVbXz2ATWa2O27ePWO618c830XV\n9z3epcAEC5riyoCXOdTM1BvYaGY7q5l2vZntj8v2SWWHmW0nWNc9CfZKHwf+B1gv6VeSKnOlsu5f\nN7NCC45B9AC+IOm2mOEVVv2JB7W9nq4EhequGsbBzEoJtr+Tw8fMcNCbMf0OHn+QNFjSFEkbwv+P\n/0f9/z8aNS8QGWTBV4s1wCnhP0flI8/MNtdxtr3iuvsAawk+1EqBjjHLaW9mx8RGipv2foJvk0PN\nrD3Bt1LVMH4ZQRMAAJJygU5x4xycpgFf//nAO3EfapXLeNvMziYohK8Bf6wme3WvKZHeMc8r1y/E\nvX6Cb9jJznst0EVSm7h5r0kiTxWS+gMnApeFbfLrgbOBsZI6EGwLXWM+yOPF51xL8AWjcv6FBE1K\nayzwkJkdTdAENQK4Cmpc9zUys3XAS8A5NWSKVdvr2QCcB/wxiS8IlcchTuJQgZgZ0y/2APXvgPeB\n/uH/x51U/f9odrxAZN5vgPGSegNI6irpnFqmqUnv8CBqjqRvEHyYvWZmKwiOIdwnqZ2kLEkDVPNp\nqu0IispnkvoA/xU3fAPQL6b7Q6CTpFPD4nAHtW9TdXr9CvSS9FPgG8DNCcbJl3SJpPYETQc7CZpG\nKrPX9KFSk9sktVFw+uM3gcoDonOAsyUVSuoJ/Dhuuvj1FWspMB+4S8FvOY4h+Mb/VB3yfQuYS9AM\nc1T4GEhwTODicFt4A3hEUgdJrRRzMkMCzwDfkzRUUh5Bc9ffzWy9pC9IGhUenC0jaOqpqGXd10hS\nF4K9j4XJjJ/M6zGz14DvAH9WzGnRCbxBcCyi0MyWhf3eDPsNpmqBaAfsMLNSSUMIjt81a14gMu8+\n4G/A3xWcOfMWQftyXb3BoYOnNwMXmNmOcNjXCNqPF4fD/0TVJqZ4/4/gm+gOgrN+no8bfjdwd9g8\n9KPwW/9VBG3WqwmaRGrbE0j19feTVEpQuGYRfPCdaGavVzP+dwiaR3YQfHB+K+w/F5gEfBLmj9/T\nqU55uNwVwKsEbfOVHxr/S/BB/ykwmeCDNVaV9RU7INybGkfwIbSe4L25zszeTDIXcLDZ7lsEx0XW\nxzzWERxcrmxm+hrBQf0l4fK+X908zWwywVlikwj2JroRFEYItqffExw/WE6wrh8Oh1W37hMZrfCM\nMmABwTqM/0JSk1pfj5m9EvafIml4NfOZSdC8+VbMdGsItrdPzCy2efE/ge+GmR/l0BeFZkvhARXX\nBEm6ArjIzE6LOotzrvnxPQjnnHMJeYFwzjmXkDcxOeecS8j3IJxzziXUpK8jUlRUZCUlJXWevqys\njPz8/IYL1EA8V2o8V2o8V2qaY67Zs2dvNrMutY4Y9U+56/MYOXKk1cf06dPrNX26eK7UeK7UeK7U\nNMdcwHvml9pwzjlXV14gnHPOJeQFwjnnXEJeIJxzziXkBcI551xCXiCcc84l5AXCOedcQi2yQOzY\ntZ/bJy2kbL9fZsQ556rTIgvEJ1vL+L93PmHC4n1RR3HOuUarRRaI4b0K+f6X+zNzzQGmfbih9gmc\nc64FapEFAuDKUwfQu10WN70wn+27fE/COefitdgC0Soni+8Oa8XWsn3cPimpW+E651yL0mILBMBh\n7bP58SkDeGnOWl5dsD7qOM4516i06AIB8IMx/RnSoz23vDSfrWXe1OScc5VafIHIzc7iwYtHsGP3\nfm59eUHUcZxzrtFo8QUCYFC39lx92hG8Mm8dk+etjTqOc841Cl4gQv9xcj9G9C7k1pcWsGnn3qjj\nOOdc5LxAhHKys3hw3HDK9pVzy0vzCW665JxzLZcXiBiHd23HtV85gr8u3MDLc7ypyTnXsqWtQEj6\nX0kbJX3uyK+kaySZpKKYfjdJWirpI0lnpCtXbS47sR8jD+vIbZMWsuGzPVHFcM65yKVzD+L3wJnx\nPSX1Br4CfBrTbzBwCTAknOZXkrLTmK1a2Vni/ouGs/dAOTe94E1NzrmWK20FwszeALYmGPRz4Hog\n9pN3LDDBzPaa2QpgKXBcurLVpl+XAq4/YxB/X7yRibNXRxXDOecipXR+Q5ZUAkw2s6Fh91jgFDO7\nStJKYJSZbZb0CPCOmT0Vjvc4MMXMJiaY5+XA5QDFxcUjJ0yYUOd8paWlFBQUJBxWYca97+7h050V\n3PWlNnRuk7nDNTXlipLnSo3nSo3nSk19co0ZM2a2mY2qdUQzS9sDKAEWhM/bArOADmH3SqAofP4I\n8I2Y6R4HLqpt/iNHjrT6mD59eo3DP9lcZkfeOsW+8dg7VlFRUa9lpaK2XFHxXKnxXKnxXKmpTy7g\nPUviMzyTZzH1B/oCc8O9h17A+5K6AWuA3jHj9gr7RapP57bcdNaRzFyymWfeXRV1HOecy6iMFQgz\nm29mXc2sxMxKgNXAMWa2HpgEXCKptaS+wADg3Uxlq8nXj+vDlw7vzN2vLGLV1l1Rx3HOuYxJ52mu\nzwBvAwMlrZZ0WXXjmtlC4FlgEfAq8EMzK09XtlRkZYl7LxyOJG54fh4VFX5Wk3OuZUjnWUxfM7Pu\nZpZrZr3M7PG44SVmtjmm+24z629mA81sSrpy1UWvjm255atH8tayLTw165Oo4zjnXEb4L6mT9K/H\n9ubLR3ThZ39ZzCdbyqKO45xzaecFIkmSGH/hMHKyxXXPeVOTc6758wKRgu4d2nDbOUN4d+VWnnhr\nZdRxnHMurbxApOjCY3py2pFdue/VxSzbVBp1HOecSxsvECmSxD3nDyMvN5trn5tLuTc1OeeaKS8Q\nddC1fR53jh3CB59u53czl0cdxznn0sILRB2dO6IHZw7pxkOvfcySDTujjuOccw3OC0QdSeKu84dS\nkJfDNc/N5UB5RdSRnHOuQXmBqIeigtbcdd5Q5q3ewW9eXxZ1HOeca1BeIOrprGHdOWdEDx6etoQP\n130WdRznnGswXiAawJ3nDqFDm1Zc8+xc9h3wpibnXPPgBaIBdMxvxT3nD2XRus94dPrSqOM451yD\n8ALRQL4ypBsXHN2TR6cvZcGaHVHHcc65evMC0YBuO2cInQuCpqa9BxrF1cqdc67OvEA0oA5tcxl/\nwXA+2rCTh/+2JOo4zjlXL14gGtiYQV25eFQvfvP6Muas2h51HOecqzMvEGlwy9mD6dY+j2uencOe\n/d7U5JxrmrxApEH7vFzuvWg4yzaV8dDUj6OO45xzdeIFIk1OGtCFfzu+D7+buZzZn2yNOo5zzqUs\nbQVC0v9K2ihpQUy/+yUtljRP0ouSCmOG3SRpqaSPJJ2RrlyZ9JOzjqRnYRuufW4eu/d5U5NzrmlJ\n5x7E74Ez4/pNBYaa2XDgY+AmAEmDgUuAIeE0v5KUncZsGVHQOof7LhrOis1l3PfXxVHHcc65lKSt\nQJjZG8DWuH6vmdmBsPMdoFf4fCwwwcz2mtkKYClwXLqyZdIJ/Yv49gklPPGPlbyzfEvUcZxzLmlR\nHoP4DjAlfN4TWBUzbHXYr1m4/syBlHRuy3UT51K290DtEzjnXCMgs/TdMlNSCTDZzIbG9b8ZGAVc\nYGYm6RHgHTN7Khz+ODDFzCYmmOflwOUAxcXFIydMmFDnfKWlpRQUFNR5+lR8vK2cn83aw5jeOXxr\nSOtGkysVnis1nis1nis19ck1ZsyY2WY2qtYRzSxtD6AEWBDX79vA20DbmH43ATfFdP8V+GJt8x85\ncqTVx/Tp0+s1fap++ueFdtgNk23mx5tqHC/TuZLluVLjuVLjuVJTn1zAe5bEZ3hGm5gknQlcD5xr\nZrtiBk0CLpHUWlJfYADwbiazZcK1ZwykX5d8bnh+Hjv37I86jnPO1Sidp7k+Q7CnMFDSakmXAY8A\n7YCpkuZI+g2AmS0EngUWAa8CPzSzZndeaF5uNg+MG8G6Hbu5+5UPo47jnHM1yknXjM3sawl6P17D\n+HcDd6crT2NxTJ+OXH5yf37z+jLOGNqNMQO7Rh3JOecS8l9SR+A/Tx/AEcUF3Pj8PHbs8qYm51zj\n5AUiAq1zsnlw3FFsLt3HnZMXRR3HOecS8gIRkWG9OvDD0f15/v3VTF20Ieo4zjn3OV4gIvSjUwZw\nZPf2/OTF+Wwr2xd1HOecq8ILRIRa5WTx4LgRbCvbx22TFkYdxznnqvACEbHBPdpz5akDmDR3LVPm\nr4s6jnPOHeQFohH4/uj+DOvZgVteWsCW0r1Rx3HOOcALRKOQm53FA+NGsHPPAW55aUHl5Uaccy5S\nXiAaiYHd2nH16QOYsmA9s9Y3ux+RO+eaIC8QjcjlJ/XjqN6F/N+ivWzcuSfqOM65Fs4LRCOSEzY1\n7SuHm1/0pibnXLS8QDQyh3ct4MIBrZi6aAMvfrAm6jjOuRasxov1SeoO/CtwEtAD2A0sAF4BXjP/\nipsWXynJYemefG6ftJAT+hfRrUNe1JGccy1QtXsQkh4DngrHeRj4d+C/gDeB84B/SDoxEyFbmiwp\nbGqq4MYX5nlTk3MuEjXtQfy3mc1N0H8O8KykPKBPemK5kqJ8bjxzELf/eRHPvbeai4/tHXUk51wL\nU9MxiDWSBsb3lDRQUmcz22NmH6cxW4v3rS+W8IV+nbhz8iLWbN8ddRznXAtTU4H4JcFxh3jdCZqc\nXJplZYn7LxpBhRk3TPSmJudcZtVUII4ws+nxPc1sBnBU2hK5Knp3astPzjqSN5du5ulZn0YdxznX\ngtRUINrVMCy3oYO46n39+D6ceHgR9/zlQ1Zt3RV1HOdcC1FTgVgm6Yz4npK+AqxIXyQXTxL3XjSc\nbInrJs6losKbmpxz6VdTgfgv4FFJj0n6fvh4HPgVcHVtM5b0v5I2SloQ06+TpKmSloR/O8YMu0nS\nUkkfJSpMLV3PwjbcevZg3lm+lT+8vTLqOM65FqDaAmFmi4FhwCxgUPiYBQwLh9Xm98CZcf1uBKaZ\n2QBgWtiNpMHAJcCQcJpfScpO6ZW0AONG9WLMwC6Mf3UxKzeXRR3HOdfM1XipDTPbbWa/M7Orwsdv\nzSyp8y3N7A1ga1zvscCT4fMnCX5wV9l/gpntNbMVwFLguKRfRQshiZ9dMJxW2Vlc+9xcyr2pyTmX\nRqru1ElJ04FngZfNbG1M/xzgBOBS4E0ze6LamUslwGQzGxp2bzezwvC5gG1mVijpEeAdM3sqHPY4\nMMXMJiaY5+XA5QDFxcUjJ0yYkPKLrlRaWkpBQUGdp0+X2nL9Y81+fjd/H5cMbMWZfTN3vkBTXV9R\n8Vyp8VypqU+uMWPGzDazUbWOaGYJH0Bb4EqCZqXVwDxgCbAKeAIYVd20MfMoARbEdG+PG74t/PsI\n8I2Y/o8DF9U2/5EjR1p9TJ8+vV7Tp0ttuSoqKuyy3//TBtz8F1uyYWdmQlnTXV9R8Vyp8VypqU8u\n4D2r5fPVzGo8BrHLzH5pZscD/YGvAl80s95m9u9m9l7KZQs2hBcArLwQ4Maw/xog9loSvcJ+LgFJ\n3HPBUNq2yuaa5+ZyoLwi6kjOuWYoqct9W3BsYJWZba7n8iYRNE0R/n05pv8lklpL6gsMAN6t57Ka\nta7t8rhz7FDmrtrOb2cujzqOc64ZStv9ICQ9A7wNDJS0WtJlwHjgdElLgNPCbsxsIcHxjkXAq8AP\nzczvu1mLc4Z356xh3fjF1CV8tH5n1HGcc81M2gqEmX3NzLqbWa6Z9TKzx81si5mdamYDzOw0M9sa\nM/7dZtbfzAaa2ZR05WpOJPHTsUNpl5fDNc/NYb83NTnnGlBSBUJSL0ljwuetJeWnN5ZLVueC1tx1\n3lAWrPmMX89YFnUc51wzUmuBkPQdgmMEj4W9DuPQsQPXCPzLsO6cO6IHv5y2hIVrd0QdxznXTCSz\nB3El8AXgMwAL7gHRNZ2hXOruOHcIHfNbcc2zc9l3wJuanHP1l0yB2GNm+yo7wktgKH2RXF10zG/F\nPecPY/H6nTzy9yVRx3HONQPJFIh/SLoeyAuPQ/wJmJzeWK4uTh9czAXH9OTRGcuYt3p71HGcc01c\nMgXiemAnsBi4iuAiezenM5Sru9vOGUJRQdDUtPeAnynsnKu7GgtE2Jz0hJn92szON7PzwufeyN1I\ndWiTy70XDmfJxlJ+PtWbmpxzdZdT00AzK5fUT1Kume3PVChXP6MHduWSY3vz2zeW8cmWMvp1yadv\nUQF9i/LpV5RPx/xWUUd0zjUBNRaI0DJgpqSXgYM3ITCzX6Ytlau3m796JLv3lzNv9Q5eW7ShyqXB\nC9vm0rco/2DBqCweJUVtadsqmU3COdcSJPNp8Gn4aBs+XBPQLi+Xhy85GoD95RWs2rqLFZvLWLG5\njOWby1ixqYy3lm7hhferXhOxe4e8g8Wjb1H+wb2PXh3bRPEynHMRqrVAmNmtmQji0ic3O4t+XQro\n1+Xz144v23uAlVuCwrFi06EC8ue5a/lsz4GD4+VkiaI8GLLyn0Hx6FK5B1JAcfvWBLf3cM41J7UW\nCElTgc/dVcjMvpKWRC6j8lvnMKRHB4b06FClv5mxbdd+VmwuZXlYON79cCVrtu/mzaWb2RvzY7y2\nrbIp6RwUjX6xex9FBXRom7kbGjnnGlYyTUy3xDzPAy4E9qYnjmssJNEpvxWd8jsx8rBOAMzIW8/o\n0SdTUWGs+2xPuMdRGjRZbS5jwZodTJm/jtg7oXbKb1W1ySrc+yjpnE9ert923LnGLJkmpllxvV6X\nFN/PtSBZWaJnYRt6FrbhxAFFVYbtO1DBpwePd5QGTVabynjj401MnL26yrg9C9tUKR6VeyA9C9uQ\nk522Cw0755KUTBNT+5jOLGAk0DFtiVyT1ioni8O7FnB41wKguMqw0r0HWBlzkLyygLz0wRp27j10\nvCM3W/Tp1Ja+RQXhQfJDex9d2vnxDucyJZkmpoUExyAEHABWAN9LZyjXPBW0zmFozw4M7fn54x1b\nyvYdPFC+PGbv440lm6pcfDC/VXZ4gPzQ7zq27ijn6N376dDGj3c415CSKRD94n8kJ8lPlncNRhJF\nBa0pKmjNsSWdqgwrrzDWbt998BTdyrOs5qzaxuR5a7HweMedb79GUUHs8Y6Cg6fp9unU1o93OFcH\nyXzQzwKOiev3boJ+zjW47CzRu1Nbendqy8lHdKkybM/+clZt3cWkGbPI79b34Gm6f1+8ic2lh453\nSIeOdxw8y6pLAf2K8ulR2IbsLG+yci6RaguEpK5Ad6CNpGEcusR3e/wHc64RyMvNZkBxO0YW5zD6\ny/2rDPtsz35WVu5xbDq09/H8+2sojTne0So7i8M6t61ykLxy76OooJUf73AtWk17EF8FvgP0An4V\n038nUK8fz0n6T+C7BMc25gP/TlB0/gSUACuBi81sW32W41qu9nm5DO9VyPBehVX6mxmbSvce3Nuo\nbLJavrmM6R9tZH/5oXN027XOOfiDwNjfdpQUtaVdnh/vcM1ftQXCzJ4AnpB0sZk921ALlNST4C51\ng81st6RngUuAwcA0Mxsv6UbgRuCGhlqucxAc7+jaLo+u7fI4vl/nKsMOlFewdvselocHyCsf763c\nxqS5h453AHRp17pqk1V4vKN3p7a0zvHjHa55SOZ3EM9KOgMYQvBDucr+99RzuW0k7SfYc1gL3ASM\nDoc/CczAC4TLoJzsLPp0bkufzm0ZPbDqsD37y/lky65DPwwM90CmLtrAlrKDN1wkS9CrY9Bk1Wrv\nXj5tvfJgAenRoQ1ZfrzDNSEy+9xVNKqOIP0KKAROBp4g+CX1O2b2nTovVLoKuBvYDbxmZl+XtN3M\nCsPhArZVdsdNezlwOUBxcfHICRMm1DUGpaWlFBR8/vpEUfNcqYk6V9l+Y0NZBet3GevLKlhfVsGG\nXca60nL2VRwqCLlZUNxWFOdn0a1tFt3yRbf8LIrzs2iXS8aOd0S9vqrjuVJTn1xjxoyZbWajahsv\nmQIxz8yGS5prZiMktQNeMbOT6xJMUkfgeeBfge3Ac8BE4JHYgiBpm5nV+IO8UaNG2XvvvVeXGADM\nmDGD0aNH13n6dPFcqWmsuaZPn87gkV+MOUheevCYx6dbdnEg5pok7fNyDp5Z1Tfukd+6Yc8qb6zr\ny3Olpj65JCVVIJLZ8vZU/pXUDdgC9KhTqsBpwAoz2wQg6QXgBGCDpO5mtk5Sd2BjPZbhXOQkUdw+\nj+L2eXyx/+ePd6zetvvQ5dfD4jFr+RZe/KDqJdiL27c++NuOQ6fp5tO7Y1ta5fglSVz6JFMg/iKp\nEHgAmAOUExwjqKtPgS9IakvQxHQq8B7BzYguBcaHf1+uxzKca9RysrMoKcqnpCifMXHDdu8rP3QJ\n9oOn6Zby6oJ1bNt16Der2Vmid8c2h34YGHM13W7t8/x4h6u3GguEpCxgipltB56TNBloY2Zb67pA\nM5slaSLwPsGlOz4AfgsUAM9Kugz4BLi4rstwrilr0yqbI7u358ju7T83bFvZPlZsKfvcabpvL9/C\nnv2HLkmSl5tFSef8mGtZHbo0iXPJqu2e1BWS/gc4KuzeTfCtv17M7Dbgtrjeewn2Jpxz1eiY34qO\n+a04pk/Vw3MVFcaGnXtirmUVPD5ct5O/Lqx6y9n8XDhi0T/8lrOuVslsDdMljTUzb/JxrpHKyhLd\nO7She4c2nHB41Uuwx99y9s15S9ibk53yLWdz/RLsLU4yBeLbwFWS9hLsPQgwM+tU41TOuUYh/paz\nh5d/yujRXwBSu+VscAn2QwfJ/ZazzV8yBaKo9lGcc01RKrecPbgH4recbTGS+SV1uaRLCC77fY+k\nXgR3gpmd9nTOuUgkuuVsJb/lbMuRzB3lHgFyCX5JfQ+wC/gNcGx6oznnGqOGuOWsBD06VL3lbOmm\nA/TdUkavjm39EuyNRDJNTCeY2TGSPgAws62SWqU5l3OuCarvLWcfmj3DbznbiCRTIPaHv4cwAEmd\ngYqaJ3HOuapqu+XsC1PfpLDXEVVvOfvxJvaVV3/L2f5hASkpyqe9X4K9wSVTIB4luHZSF0l3EPyA\n7Y60pnLOtRiVt5w9omM2o4/tXWVYsrecBSgqaE3fouBMq0tPKPncgXeXumQOUv9B0myCaygBjDOz\nBemN5ZxqMGzpAAATKElEQVRzyd1y9uAPA8OzrabMX8/MJZt59eqT6dDG9yrqI9mfTWYD+wmamfzX\nMs65yFXecnZAcbsq/eeu2s4Fv36LuyYv4v5xIyJK1zzU+mEv6WbgGYIruPYC/ijppnQHc865uhjR\nu5ArvtyP52avZtqHG6KO06QlszfwLeBYM7vFzG4GjiP4dbVzzjVKV546gEHd2nHTC/PZvmtf7RO4\nhJIpEOuo2hSVE/ZzzrlGqXVONg+MG8HWsn3c8edFUcdpspIpEFuBhZIek/Q7YD6wWdJDkh5Kbzzn\nnKuboT078MMxh/PiB2v468L1UcdpkpI5SP1K+Kj0TpqyOOdcg/rRKYczddEGbn5xPseWdKJTvv/G\nNxXJnOb6eCaCOOdcQ8vNzuKhfx3BOf/9Jre+vIBH/+2YqCM1KcmcxXSmpH9K2ihpq6Rtkup8Rznn\nnMukQd3ac/VpR/DKvHVMnrc26jhNSjLHIB4B/gPoCXQhuPx3lxqncM65RuQ/Tu7HiF4duPWlBWza\nuTfqOE1GMgViNTDHzPabWXnlI93BnHOuoeRkZ/HAuBGU7SvnlpfmY7HX6HDVSqZAXA/8WdJ1kq6s\nfNRnoZIKJU2UtFjSh5K+KKmTpKmSloR/O9Y+J+ecS86A4nZcc/oR/HXhBl6e401NyUimQNwBlAOF\nBE1LlY/6eBh41cwGASOAD4EbgWlmNgCYFnY751yD+e5J/TimTyG3TVrIhs/2RB2n0UvmNNfeZja0\noRYoqQPBzYe+DWBm+4B9ksYCo8PRngRmADc01HKdcy47SzwwbgRn/XImN70wn8cvHeX3l6iBamuL\nk/Qg8IqZ/b1BFigdBfwWWESw9zAbuApYY2aF4TgCtlV2x01/OXA5QHFx8cgJEybUOUtpaSkFBQV1\nnj5dPFdqPFdqPBe8tnI/f1y8j8uGtuKkXjVf8bU5rq8xY8bMNrNRtY5oZjU+gG0ENwgqJfhV9TZg\na23T1TC/UcAB4Piw+2Hgp8D2+OXWNq+RI0dafUyfPr1e06eL50qN50qN5zIrL6+wcb9+y4b+v1dt\n7fZdNY7bHNcX8J4l8XmdzDGIIoJ7UnegYU5zXQ2sNrNZYfdE4Bhgg6TuAOHfjfVYhnPOVSsrS9w/\nbjgHKozrJ87zs5qqUWuBsOCU1nHADeHz7sBRdV2gma0HVkkaGPY6laC5aRJwadjvUuDlui7DOedq\nc1jnfH5y1iBmLtnMhH+uijpOo5TML6kfAcYA3wx77QJ+U8/l/hh4WtI8gmJzDzAeOF3SEoK7142v\n5zKcc65GXz/+ME7o35m7Ji9i1dZdUcdpdJJpYjrBzP4D2ANgZluBel3xyszmmNkoMxtuZueZ2TYz\n22Jmp5rZADM7LVyOc86lTVaWuO+i4QDc8Pw8Kiq8qSlWMgViv6QsgtuNIqkzwUFr55xr8np1bMst\nZw/mrWVbeGrWJ1HHaVSqLRCSKn8j8SjwPNBF0h3Am8C9GcjmnHMZccmxvTn5iC787C+L+WRLWdRx\nGo2a9iDeBTCzPwC3AA8QnOI6zszq/uMD55xrZCRx74XDyMkW1z3nTU2VaioQB39eaGYLzexhM/uF\nmS3IQC7nnMuo7h3acNs5Q3h35VaeeGtl1HEahZoutdFF0n9VN9DM/Hajzrlm5cJjejJl/jrue3Ux\nowd2oX+XxvcL6kyqaQ8iGygA2lXzcM65ZkUSP7tgGHm52Vz73FzKW3hTU017EOvM7M6MJXHOuUag\na/s87hw7hKsmzOGxmcsZWPskzVZSxyCcc64lOXdED84YUsyDUz9mTWnLPau/pgJxasZSOOdcIyKJ\nu88fRkHrHB6bt5cD5S2zSFRbIPyXzM65lqyooDU/HTuUFZ9V8JvXl0UdJxLJ/JLaOedapK8O785x\n3bJ5eNoSPlz3WdRxMs4LhHPO1eCbg1vToU0u1zw7l30HWlZTkxcI55yrQbtW4p7zh7Fo3Wc8On1p\n1HEyyguEc87V4itDunH+0T15dPpSFqzZEXWcjPEC4ZxzSbj9nCF0ym/FNc/OZe+B8qjjZIQXCOec\nS0KHtrmMv3AYH23YyS+nLYk6TkZ4gXDOuSSdMqiYcSN78esZy5izanvUcdLOC4RzzqXg1nMGU9w+\nj2uencOe/c27qckLhHPOpaB9Xi73XjicZZvKeGjqx1HHSavICoSkbEkfSJocdneSNFXSkvBvx6iy\nOedcTU4+ogv/dnwffjdzObM/ab4XnYhyD+Iq4MOY7huBaWY2AJgWdjvnXKP0k7OOpGdhG659bh67\n9zXPpqZICoSkXsBXgcdieo8FngyfPwmcl+lczjmXrILWOdx30XBWbC7jvr8ujjpOWkS1B/EL4Hog\n9nfrxWa2Lny+HijOeCrnnEvBCf2LuPSLh/HEP1byzvItUcdpcDLL7B2TJJ0NnGVmP5A0GrjWzM6W\ntN3MCmPG22ZmnzsOIely4HKA4uLikRMmTKhzltLSUgoKGt8tBT1XajxXajxXamrLtfeAcetbuzGD\nn36pDXk5mbmVTn3W15gxY2ab2ahaRzSzjD6AnwGrgZUEewq7gKeAj4Du4TjdgY9qm9fIkSOtPqZP\nn16v6dPFc6XGc6XGc6UmmVyzlm+xkhsn280vzkt/oFB91hfwniXxeZ3xJiYzu8nMeplZCXAJ8Hcz\n+wYwCbg0HO1S4OVMZ3POubo4rm8nvvOlvjz1zqe8uWRz1HEaTGP6HcR44HRJS4DTwm7nnGsSrjtj\nIP2K8rnh+Xns3LM/6jgNItICYWYzzOzs8PkWMzvVzAaY2Wnmd7RzzjUhebnZPHDxCNbt2M3dr3xY\n+wRNQGPag3DOuSbtmD4dufzk/kz45ypmfLQx6jj15gXCOeca0NWnDWBA1wJufH4+O3Y37aYmLxDO\nOdeA8nKzefDiEWwq3cudf14UdZx68QLhnHMNbHivQn4wuj/Pv7+aqYs2RB2nzrxAOOdcGvz4lAEM\n6taOn7w4n21l+6KOUydeIJxzLg1a5WTx4MUj2Fa2j9smLYw6Tp14gXDOuTQZ0qMDV546gElz1zJl\n/rraJ2hkvEA451wafX90f4b2bM8tLy1gS+neqOOkxAuEc86lUW52Fg+OO4qdew5wy0sLKq9J1yR4\ngXDOuTQb2K0dV58+gCkL1jN5XtNpavIC4ZxzGXD5Sf0Y0buQW19ewMade6KOkxQvEM45lwE52Vk8\nOG4Eu/aVc/OLTaOpyQuEc85lyOFdC7juKwOZumgDL36wJuo4tfIC4ZxzGfSdE/sy6rCO3D5pIet3\nNO6mJi8QzjmXQdlZ4v5xI9hXXsGNL8xr1E1NXiCccy7D+hblc+OZg5jx0Saee2911HGq5QXCOeci\n8K0vlnB8307cOXkRa7bvjjpOQl4gnHMuAllZ4v6LRlBhxg0TG2dTkxcI55yLSJ/ObfnJWUfy5tLN\n/PHdT6OO8zleIJxzLkJfP74PJx5exN2vfMiqrbuijlNFxguEpN6SpktaJGmhpKvC/p0kTZW0JPzb\nMdPZnHMu0yRx70XDyZK4buJcKioaT1NTFHsQB4BrzGww8AXgh5IGAzcC08xsADAt7HbOuWavZ2Eb\nbj37SN5ZvpU/vL0y6jgHZbxAmNk6M3s/fL4T+BDoCYwFngxHexI4L9PZnHMuKheP6s3ogV0Y/+pi\nVm4uizoOAIryyLmkEuANYCjwqZkVhv0FbKvsjpvmcuBygOLi4pETJkyo8/JLS0spKCio8/Tp4rlS\n47lS47lSk8lc2/ZUcPObu+lZkMVNx+eRJaUl15gxY2ab2ahaRzSzSB5AATAbuCDs3h43fFtt8xg5\ncqTVx/Tp0+s1fbp4rtR4rtR4rtRkOtfzs1fZYTdMtt+9sazG8eqTC3jPkvicjuQsJkm5wPPA02b2\nQth7g6Tu4fDuwMYosjnnXJTOP7onpx1ZzH1//YilG0sjzRLFWUwCHgc+NLOHYgZNAi4Nn18KvJzp\nbM45FzVJ3HPBUNq2yuaa5+ZyoLwisixR7EF8CfgmcIqkOeHjLGA8cLqkJcBpYbdzzrU4XdvlcefY\nocxdtZ3fzlweWY6cTC/QzN4EqjvycmomszjnXGN1zvDuTJm/jl9MXcKpg4oZ2K1dxjP4L6mdc64R\nksRd5w2lXV4O1z43l/0RNDV5gXDOuUaqc0Fr7jpvKPPX7ODXM5ZlfPleIJxzrhH7l2HdOXdED345\nbQkL1+7I6LK9QDjnXCN3x7lD6Jjfimuencu+A5lravIC4ZxzjVzH/Fbcc/4wFq/fySN/X5Kx5XqB\ncM65JuD0wcVccExPHp2xjHmrt2dkmV4gnHOuibjtnCEUFQRNTfszcFlwLxDOOddEdGiTy/gLh7Nk\nYykvLtmf9uV5gXDOuSZkzMCufPuEEjq3qf5Krw3FC4RzzjUxt587hFP75KZ9OV4gnHPOJeQFwjnn\nXEJeIJxzziXkBcI551xCXiCcc84l5AXCOedcQl4gnHPOJeQFwjnnXEIyS//1PNJF0ibgk3rMogjY\n3EBxGpLnSo3nSo3nSk1zzHWYmXWpbaQmXSDqS9J7ZjYq6hzxPFdqPFdqPFdqWnIub2JyzjmXkBcI\n55xzCbX0AvHbqANUw3OlxnOlxnOlpsXmatHHIJxzzlWvpe9BOOecq4YXCOeccwk1ywIh6UxJH0la\nKunGBMMl6Zfh8HmSjkl22ihySeotabqkRZIWSrqqMeSKGZ4t6QNJkxtLLkmFkiZKWizpQ0lfbCS5\n/jN8DxdIekZSXgZzDZL0tqS9kq5NZdoocjWC7b7a9RUOj2q7r+l9bNjt3sya1QPIBpYB/YBWwFxg\ncNw4ZwFTAAFfAGYlO21EuboDx4TP2wEfN4ZcMcP/C/gjMLkxvI/hsCeB74bPWwGFUecCegIrgDZh\n97PAtzOYqytwLHA3cG0q00aUK+rtPmGuRrDdV5urobf75rgHcRyw1MyWm9k+YAIwNm6cscAfLPAO\nUCipe5LTZjyXma0zs/cBzGwn8CHBh02kuQAk9QK+CjzWQHnqnUtSB+Bk4HEAM9tnZtujzhUOywHa\nSMoB2gJrM5XLzDaa2T+B+LvdR7rdV5cr6u2+hvUV6XZfXa50bPfNsUD0BFbFdK/m8xtVdeMkM20U\nuQ6SVAIcDcxqJLl+AVwPVDRQnobI1RfYBDwRNgE8Jik/6lxmtgZ4APgUWAfsMLPXMpgrHdNmZN4R\nbfc1iXK7r06Db/fNsUA0W5IKgOeBq83ss0aQ52xgo5nNjjpLnBzgGODXZnY0UAY0aLt6XUjqSPBt\nsC/QA8iX9I1oUzV+vt0nrcG3++ZYINYAvWO6e4X9khknmWmjyIWkXIJ/kqfN7IUGylTfXF8CzpW0\nkmBX+BRJTzWCXKuB1WZW+W1zIsE/TtS5TgNWmNkmM9sPvACckMFc6Zg2rfOOeLuvTtTbfXUafrtv\nqIMrjeVBUEWXE3xLqzzIMyRunK9S9SDiu8lOG1EuAX8AftGY1lfcOKNp2IN19coFzAQGhs9vB+6P\nOhdwPLCQ4NiDCA4o/jhTuWLGvZ2qB4Mj3e5ryBXpdl9drqi3+5pyNfR236ArvbE8CM4i+ZjgbICb\nw35XAFfEbHiPhsPnA6NqmjbqXMCJgAHzgDnh46yoc8XNo0H/URrgfTwKeC9cZy8BHRtJrjuAxcAC\n4P+A1hnM1Y3gW+ZnwPbweftGsN0nzNUItvtq11fE231N72ODbvd+qQ3nnHMJNcdjEM455xqAFwjn\nnHMJeYFwzjmXkBcI55xzCXmBcM45l5AXCNcihVcKXSGpU9jdMewuiRvv9kRX8qzHcgsl/SCmu4ek\niQ01f+cakhcI1yKZ2Srg18D4sNd44LdmtjLNiy4EDhYIM1trZheleZnO1YkXCNeS/Rz4gqSrCX6U\n9UBNI0s6StI74T0eXgyvrYSkwyX9TdJcSe9L6i+pQNK0sHu+pMorco4H+kuaI+l+SSWSFoTzyZP0\nRDj+B5LGhP2/LekFSa9KWiLpvrStEedi5EQdwLmomNl+SdcBrwJfseD6SDX5A8GlMV6XdCdwG3A1\n8DQw3sxeDG8AlAXsA843s88kFQHvSJpEcPG0oWZ2FBy8SmmlHwaxbJikQcBrko4Ihx1FcDXTvcBH\nkv473AtyLm18D8K1dP9CcOntoTWNFF5rv9DMXg97PQmcLKkdwaW8XwQwsz1mtovgchv3SJoH/I3g\nks3FtWQ5EXgqnM9i4BOgskBMM7MdZrYHWAQcltrLdC51vgfhWixJRwGnE1xQ701JE4AfEVxsj8pv\n+XX0daALMDLcU1kJ1Of2ontjnpfj/7suA3wPwrVIkkRwkPpqM/sUuB94wMxuNrOj4ouDme0Atkk6\nKez1TeB1C+50tlrSeeF8W0tqC3QguGfA/vBYQuU3/p0Et89MZCZBYSFsWuoDfNRAL9m5lHmBcC3V\n94BPzWxq2P0r4EhJX65hmkuB+8Nmo6OAO8P+3wSuDPu/RXC1zaeBUZLmA98iuIIrZrYF+IekBZLu\nj5v/r4CscJo/Edyvei/ORcSv5uqccy4h34NwzjmXkBcI55xzCXmBcM45l5AXCOeccwl5gXDOOZeQ\nFwjnnHMJeYFwzjmX0P8HkXvkWPx2qswAAAAASUVORK5CYII=\n", 149 | "text/plain": [ 150 | "" 151 | ] 152 | }, 153 | "metadata": {}, 154 | "output_type": "display_data" 155 | }, 156 | { 157 | "name": "stdout", 158 | "output_type": "stream", 159 | "text": [ 160 | "T1 = 150 C\n", 161 | "T2 = 90.0 C\n", 162 | "T3 = 70.0 C\n", 163 | "T4 = 10 C\n" 164 | ] 165 | } 166 | ], 167 | "source": [ 168 | "T2 = -q*AR[0] + T1\n", 169 | "T3 = q*AR[2] + T4\n", 170 | "\n", 171 | "T = [T1, T2, T3, T4] # vectorize temps\n", 172 | "x = [0, L[0], L[0]+L[1], L[0]+L[1]+L[2]]\n", 173 | "\n", 174 | "# Plot Temperature distribution\n", 175 | "plt.title('Temperature Distribution Across Brick Wall')\n", 176 | "plt.xlabel('X-location')\n", 177 | "plt.ylabel('Temperature (C)')\n", 178 | "plt.grid()\n", 179 | "plt.plot(x,T)\n", 180 | "plt.show()\n", 181 | "\n", 182 | "# Print Temperatures\n", 183 | "print('T1 = ', T1, 'C')\n", 184 | "print('T2 = ', T2, 'C')\n", 185 | "print('T3 = ', T3, 'C')\n", 186 | "print('T4 = ', T4, 'C')" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": { 192 | "collapsed": true 193 | }, 194 | "source": [ 195 | "### Derivation of the Heat Equation for Conduction\n", 196 | "\n", 197 | "Consider a one-dimensional rod. We want to determine the temperature at any point, x, at any time, t; T(x,t). Lets start by defining a physical model.\n", 198 | "\n", 199 | "\n", 200 | "\n", 201 | "\n", 202 | "We define energy density as the energy per unit volume, and heat flux, $\\Phi$, as the energy per unit time per unit area.\n", 203 | "\n", 204 | "$$\\Phi = \\frac{energy}{(area)(time)}$$\n", 205 | "\n", 206 | "So looking back at our rod, the heat flux in and out of the rod is one methof of changing the energy density of our rod at a given time. Steady-state is therefore defined as..\n", 207 | "$$ \\Sigma \\Phi = 0 $$\n", 208 | "\n", 209 | "$\\Theta$, the heat generated/dissipated per unit time, is another physical phenomenon through which the energy density in an object can change." 210 | ] 211 | }, 212 | { 213 | "cell_type": "markdown", 214 | "metadata": {}, 215 | "source": [ 216 | "## References\n", 217 | "\n", 218 | "1. _Introduction to Engineering Heat Transfer_ https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-050-thermal-energy-fall-2002/lecture-notes/10_part3.pdf" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": null, 224 | "metadata": { 225 | "collapsed": true 226 | }, 227 | "outputs": [], 228 | "source": [] 229 | } 230 | ], 231 | "metadata": { 232 | "kernelspec": { 233 | "display_name": "Python 3", 234 | "language": "python", 235 | "name": "python3" 236 | }, 237 | "language_info": { 238 | "codemirror_mode": { 239 | "name": "ipython", 240 | "version": 3 241 | }, 242 | "file_extension": ".py", 243 | "mimetype": "text/x-python", 244 | "name": "python", 245 | "nbconvert_exporter": "python", 246 | "pygments_lexer": "ipython3", 247 | "version": "3.6.0" 248 | } 249 | }, 250 | "nbformat": 4, 251 | "nbformat_minor": 2 252 | } 253 | -------------------------------------------------------------------------------- /Guides/heatTransfer/Convection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## Heat Transfer Convection Calculations\n", 8 | "This jupyter notebook walks through basic heat transfer calculations.\n", 9 | "\n", 10 | "There are three basic types of heat transfer:\n", 11 | "1. Conduction\n", 12 | "1. __Convection__\n", 13 | "1. Radiation\n", 14 | "\n", 15 | "This tutorial covers __convection calculations__\n", 16 | "We will be using will use numpy and matplotlib, which are imported below." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "collapsed": true 24 | }, 25 | "outputs": [], 26 | "source": [ 27 | "import numpy as np\n", 28 | "import matplotlib.pyplot as plt" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": null, 34 | "metadata": { 35 | "collapsed": true 36 | }, 37 | "outputs": [], 38 | "source": [] 39 | } 40 | ], 41 | "metadata": { 42 | "kernelspec": { 43 | "display_name": "Python 3", 44 | "language": "python", 45 | "name": "python3" 46 | }, 47 | "language_info": { 48 | "codemirror_mode": { 49 | "name": "ipython", 50 | "version": 3 51 | }, 52 | "file_extension": ".py", 53 | "mimetype": "text/x-python", 54 | "name": "python", 55 | "nbconvert_exporter": "python", 56 | "pygments_lexer": "ipython3", 57 | "version": "3.6.0" 58 | } 59 | }, 60 | "nbformat": 4, 61 | "nbformat_minor": 2 62 | } 63 | -------------------------------------------------------------------------------- /Guides/heatTransfer/assets/HeatTransferConduction_1Drod.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/heatTransfer/assets/HeatTransferConduction_1Drod.gif -------------------------------------------------------------------------------- /Guides/heatTransfer/assets/HeatTransferConduction_CompositeSlab.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/heatTransfer/assets/HeatTransferConduction_CompositeSlab.PNG -------------------------------------------------------------------------------- /Guides/heatTransfer/assets/HeatTransferConduction_Example1.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/heatTransfer/assets/HeatTransferConduction_Example1.PNG -------------------------------------------------------------------------------- /Guides/jetEngine/CompressorAnalysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Axial Compressor Analysis\n", 8 | "\n", 9 | "Axial compressors are characterized by a high axial flow velocity relative to the angular velocity.\n", 10 | "\n", 11 | "__Notation__
\n", 12 | "__c__ : absolute velocities; fixed reference frame (test bed or aircraft frame)
\n", 13 | "__w__ : relative velocities; reference frame attached to rotor
\n", 14 | "Determine flow field that will be compatible with high compresor efficiency and minimum compressor size for a given pressure ratio. If the flow field is properly designed, one can specify blading that will guide the flow accordingly\n", 15 | "\n", 16 | "### Euler Equation Solver\n", 17 | "Using the euler equations allows for solving fiction and shock waves." 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": null, 23 | "metadata": { 24 | "collapsed": true 25 | }, 26 | "outputs": [], 27 | "source": [] 28 | } 29 | ], 30 | "metadata": { 31 | "kernelspec": { 32 | "display_name": "Python 3", 33 | "language": "python", 34 | "name": "python3" 35 | }, 36 | "language_info": { 37 | "codemirror_mode": { 38 | "name": "ipython", 39 | "version": 3 40 | }, 41 | "file_extension": ".py", 42 | "mimetype": "text/x-python", 43 | "name": "python", 44 | "nbconvert_exporter": "python", 45 | "pygments_lexer": "ipython3", 46 | "version": "3.6.0" 47 | } 48 | }, 49 | "nbformat": 4, 50 | "nbformat_minor": 2 51 | } 52 | -------------------------------------------------------------------------------- /Guides/launch_ascent_guidance/Launch Ascent to Orbit.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Launch Ascent to Orbit\n", 8 | "__Created By__: Cameron Flannery
\n", 9 | "__Updated:__ 12/17/2018" 10 | ] 11 | }, 12 | { 13 | "cell_type": "code", 14 | "execution_count": 1, 15 | "metadata": {}, 16 | "outputs": [], 17 | "source": [ 18 | "import numpy as np\n", 19 | "import matplotlib.pyplot as plt" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "## Introduction\n", 27 | "\n", 28 | "Launch ascent guidance, or boost-to-orbit is the phase of a mission in which a spacecraft targets a specific orbit from a launch pad or air-launch vehicle.\n", 29 | "\n", 30 | "The launch-to-orbit problem can be broken up into to two primary flight phases; endoatmospheric and exoatmospheric. Historically, endoatmospheric guidance, typically the first stage of a launch vehicle, has been open loo. A suboptimal guidance law is precomputed and uploaded to the vehicle. Second stage, or exoatmospheric flight, has typically been closed loop and is computed using nonlinear programming with a close to optimal solution. I will go into more details for each of these phases below.\n", 31 | "\n", 32 | "### Endoatmospheric Guidance\n", 33 | "\n", 34 | "There are currently no optimal endoatmospheric guidance laws (that I know of) used for launch vehicles. While in the thick parts of the atmosphere, the primary goal is to reduce aerodynamic loads to acceptable levels. For this reason, a slow gravity turn is employed with nearly zero angle of attack.\n", 35 | "\n", 36 | "> In the typical open-loop process, guidance commands are generated offline, updated with day-of-launch wind data before alunch and loaded into the launch vehicle for use during the ascent through the atmosphere. [4]\n", 37 | "\n", 38 | "### Exoatmospheric Guidance\n", 39 | "\n", 40 | "Once the vehicle is out of the atmosphere, an optimal, closed-loop guidance law can take over." 41 | ] 42 | }, 43 | { 44 | "cell_type": "markdown", 45 | "metadata": {}, 46 | "source": [ 47 | "## Problem Formulation\n", 48 | "\n", 49 | "$$\\dot{r} = V$$\n", 50 | "$$\\dot{V} = g(r) + A/m(t) + T1_b/m(t) + N/m(t)$$\n", 51 | "$$\\dot{m} = -(\\eta T_{vac}/g_0 I_{sp})$$" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [] 58 | }, 59 | { 60 | "cell_type": "markdown", 61 | "metadata": {}, 62 | "source": [ 63 | "## Perturbation Methods\n", 64 | "\n", 65 | "Perturbation methods have been applied to the launch-to-orbit problem, but have been found to be inadequate for the atmospheric portion of the flight. Significant contributions include those by Feely and Speyer, using the Hamilton-Jacobi-Bellman equation to find an optimal solution." 66 | ] 67 | }, 68 | { 69 | "cell_type": "markdown", 70 | "metadata": {}, 71 | "source": [ 72 | "## Bilinear-Tangent Steering Law\n", 73 | "\n", 74 | "### Conic State Extrapolation" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": null, 80 | "metadata": {}, 81 | "outputs": [], 82 | "source": [] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "## References\n", 89 | "\n", 90 | "1. Calise, A., Leung, Martin S. K., [Optimal Guidance Law Development for and Advanced Launch System](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=2ahUKEwijppv_q6vfAhUfwMQHHaKKB0EQFjAAegQIBBAC&url=https%3A%2F%2Fntrs.nasa.gov%2Farchive%2Fnasa%2Fcasi.ntrs.nasa.gov%2F19950019785.pdf&usg=AOvVaw3nKdI43o_TFQR9TaTPMbL2), NASA 1995.\n", 91 | "1. Bonalli, R., et al.,[Optimal Control of Endo-Atmospheric Launch Vehicle Systems: Geometric and Computational Issues](https://hal.archives-ouvertes.fr/hal-01626869/document), HAL 2017.\n", 92 | "1. K.H. Well., [Ariane V Ascent Trajectory Optimization with A First-Stage Splashdown Constraint](https://www.sciencedirect.com/science/article/pii/B978008037869550008X), IFAC 1989.\n", 93 | "1. Lu, Ping. [Closed-Loop Endoatmospheric Ascent Guidance](https://arc.aiaa.org/doi/abs/10.2514/2.5045)" 94 | ] 95 | }, 96 | { 97 | "cell_type": "code", 98 | "execution_count": null, 99 | "metadata": {}, 100 | "outputs": [], 101 | "source": [] 102 | } 103 | ], 104 | "metadata": { 105 | "kernelspec": { 106 | "display_name": "Python 3", 107 | "language": "python", 108 | "name": "python3" 109 | }, 110 | "language_info": { 111 | "codemirror_mode": { 112 | "name": "ipython", 113 | "version": 2 114 | }, 115 | "file_extension": ".py", 116 | "mimetype": "text/x-python", 117 | "name": "python", 118 | "nbconvert_exporter": "python", 119 | "pygments_lexer": "ipython2", 120 | "version": "2.7.15rc1" 121 | } 122 | }, 123 | "nbformat": 4, 124 | "nbformat_minor": 2 125 | } 126 | -------------------------------------------------------------------------------- /Guides/python/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/python/README.md -------------------------------------------------------------------------------- /Guides/python/assets/coolingExample.csv: -------------------------------------------------------------------------------- 1 | Time - Dev2/ai0,Temperature - Dev2/ai0 2 | 11:17:30 AM,85.4 3 | 11:17:30 AM,85.6 4 | 11:17:30 AM,84.9 5 | 11:17:30 AM,85.8 6 | 11:17:30 AM,85.2 7 | 11:17:30 AM,85.1 8 | 11:17:30 AM,86.1 9 | 11:17:30 AM,85.1 10 | 11:17:30 AM,85 11 | 11:17:30 AM,85.8 12 | 11:17:31 AM,85 13 | 11:17:31 AM,85.6 14 | 11:17:31 AM,85.1 15 | 11:17:31 AM,85.2 16 | 11:17:31 AM,85.1 17 | 11:17:31 AM,85.1 18 | 11:17:31 AM,85.8 19 | 11:17:31 AM,85.1 20 | 11:17:31 AM,85.6 21 | 11:17:31 AM,85.1 22 | 11:17:32 AM,86.1 23 | 11:17:32 AM,86.4 24 | 11:17:32 AM,85.8 25 | 11:17:32 AM,86.6 26 | 11:17:32 AM,86.1 27 | 11:17:32 AM,85.8 28 | 11:17:32 AM,85.9 29 | 11:17:32 AM,86.1 30 | 11:17:32 AM,85.5 31 | 11:17:32 AM,85.8 32 | 11:17:33 AM,84.9 33 | 11:17:33 AM,86.1 34 | 11:17:33 AM,85.4 35 | 11:17:33 AM,85.1 36 | 11:17:33 AM,86.2 37 | 11:17:33 AM,85.5 38 | 11:17:33 AM,84.7 39 | 11:17:33 AM,85.5 40 | 11:17:33 AM,85 41 | 11:17:33 AM,84.8 42 | 11:17:34 AM,86.1 43 | 11:17:34 AM,85 44 | 11:17:34 AM,85.4 45 | 11:17:34 AM,85.9 46 | 11:17:34 AM,85 47 | 11:17:34 AM,84.9 48 | 11:17:34 AM,85.4 49 | 11:17:34 AM,85.9 50 | 11:17:34 AM,85.6 51 | 11:17:34 AM,85.5 52 | 11:17:35 AM,84.8 53 | 11:17:35 AM,86.4 54 | 11:17:35 AM,84.8 55 | 11:17:35 AM,85.5 56 | 11:17:35 AM,84.2 57 | 11:17:35 AM,85 58 | 11:17:35 AM,85.8 59 | 11:17:35 AM,85.3 60 | 11:17:35 AM,85.5 61 | 11:17:35 AM,85.5 62 | 11:17:36 AM,85.5 63 | 11:17:36 AM,86 64 | 11:17:36 AM,86.3 65 | 11:17:36 AM,85.9 66 | 11:17:36 AM,85.7 67 | 11:17:36 AM,85.8 68 | 11:17:36 AM,86 69 | 11:17:36 AM,86.1 70 | 11:17:36 AM,85.8 71 | 11:17:36 AM,86 72 | 11:17:37 AM,85.5 73 | 11:17:37 AM,86.2 74 | 11:17:37 AM,84.8 75 | 11:17:37 AM,85.2 76 | 11:17:37 AM,84.8 77 | 11:17:37 AM,87.1 78 | 11:17:37 AM,85.6 79 | 11:17:37 AM,85.5 80 | 11:17:37 AM,85.8 81 | 11:17:37 AM,85.8 82 | 11:17:38 AM,85.1 83 | 11:17:38 AM,85.7 84 | 11:17:38 AM,85.5 85 | 11:17:38 AM,85.1 86 | 11:17:38 AM,85.5 87 | 11:17:38 AM,84.6 88 | 11:17:38 AM,85.5 89 | 11:17:38 AM,84.3 90 | 11:17:38 AM,85.7 91 | 11:17:38 AM,84.9 92 | 11:17:39 AM,85 93 | 11:17:39 AM,84.9 94 | 11:17:39 AM,85.8 95 | 11:17:39 AM,85.2 96 | 11:17:39 AM,84.6 97 | 11:17:39 AM,85.7 98 | 11:17:39 AM,84 99 | 11:17:39 AM,86.1 100 | 11:17:39 AM,85.7 101 | 11:17:39 AM,85.6 102 | 11:17:40 AM,85.7 103 | 11:17:40 AM,86.7 104 | 11:17:40 AM,85.8 105 | 11:17:40 AM,86.1 106 | 11:17:40 AM,86.5 107 | 11:17:40 AM,86.3 108 | 11:17:40 AM,86.3 109 | 11:17:40 AM,85.1 110 | 11:17:40 AM,85.8 111 | 11:17:40 AM,86.1 112 | 11:17:41 AM,85.8 113 | 11:17:41 AM,86.2 114 | 11:17:41 AM,86.2 115 | 11:17:41 AM,86.1 116 | 11:17:41 AM,84.8 117 | 11:17:41 AM,84.4 118 | 11:17:41 AM,86.5 119 | 11:17:41 AM,85.1 120 | 11:17:41 AM,85 121 | 11:17:41 AM,84.3 122 | 11:17:42 AM,85.4 123 | 11:17:42 AM,85.5 124 | 11:17:42 AM,85.8 125 | 11:17:42 AM,86 126 | 11:17:42 AM,85.8 127 | 11:17:42 AM,85.2 128 | 11:17:42 AM,85.2 129 | 11:17:42 AM,84.1 130 | 11:17:42 AM,84.9 131 | 11:17:42 AM,85 132 | 11:17:43 AM,85 133 | 11:17:43 AM,85.3 134 | 11:17:43 AM,85.4 135 | 11:17:43 AM,85.8 136 | 11:17:43 AM,84.7 137 | 11:17:43 AM,84.8 138 | 11:17:43 AM,86.1 139 | 11:17:43 AM,85.8 140 | 11:17:43 AM,85.1 141 | 11:17:43 AM,86.1 142 | 11:17:44 AM,85.7 143 | 11:17:44 AM,85.9 144 | 11:17:44 AM,85.8 145 | 11:17:44 AM,86.3 146 | 11:17:44 AM,85.9 147 | 11:17:44 AM,86.8 148 | 11:17:44 AM,86.3 149 | 11:17:44 AM,85.1 150 | 11:17:44 AM,85.9 151 | 11:17:44 AM,84.9 152 | 11:17:45 AM,86.1 153 | 11:17:45 AM,86.8 154 | 11:17:45 AM,85.8 155 | 11:17:45 AM,85.4 156 | 11:17:45 AM,85.4 157 | 11:17:45 AM,85.8 158 | 11:17:45 AM,86 159 | 11:17:45 AM,85.8 160 | 11:17:45 AM,85.5 161 | 11:17:45 AM,86.1 162 | 11:17:46 AM,85.4 163 | 11:17:46 AM,86.1 164 | 11:17:46 AM,85.4 165 | 11:17:46 AM,86 166 | 11:17:46 AM,85.7 167 | 11:17:46 AM,85.8 168 | 11:17:46 AM,85.9 169 | 11:17:46 AM,85.7 170 | 11:17:46 AM,84.7 171 | 11:17:46 AM,85.5 172 | 11:17:47 AM,86.1 173 | 11:17:47 AM,85.6 174 | 11:17:47 AM,85.1 175 | 11:17:47 AM,85.9 176 | 11:17:47 AM,85.3 177 | 11:17:47 AM,86 178 | 11:17:47 AM,84.7 179 | 11:17:47 AM,85.4 180 | 11:17:47 AM,85.6 181 | 11:17:47 AM,83.9 182 | 11:17:48 AM,85.7 183 | 11:17:48 AM,85.8 184 | 11:17:48 AM,86.2 185 | 11:17:48 AM,85.8 186 | 11:17:48 AM,85.6 187 | 11:17:48 AM,86.3 188 | 11:17:48 AM,86.3 189 | 11:17:48 AM,86.3 190 | 11:17:48 AM,87.2 191 | 11:17:48 AM,86.3 192 | 11:17:49 AM,86.2 193 | 11:17:49 AM,86.8 194 | 11:17:49 AM,86 195 | 11:17:49 AM,85.8 196 | 11:17:49 AM,85.5 197 | 11:17:49 AM,85.9 198 | 11:17:49 AM,85.1 199 | 11:17:49 AM,85.3 200 | 11:17:49 AM,85.1 201 | 11:17:49 AM,85.6 202 | 11:17:50 AM,85.6 203 | 11:17:50 AM,85.2 204 | 11:17:50 AM,85.1 205 | 11:17:50 AM,85.4 206 | 11:17:50 AM,85.2 207 | 11:17:50 AM,85.2 208 | 11:17:50 AM,86.3 209 | 11:17:50 AM,84.9 210 | 11:17:50 AM,85.8 211 | 11:17:50 AM,85.5 212 | 11:17:51 AM,84.7 213 | 11:17:51 AM,85.1 214 | 11:17:51 AM,85.3 215 | 11:17:51 AM,85.8 216 | 11:17:51 AM,85.2 217 | 11:17:51 AM,85.8 218 | 11:17:51 AM,85.8 219 | 11:17:51 AM,85.6 220 | 11:17:51 AM,84.9 221 | 11:17:51 AM,84.7 222 | 11:17:52 AM,85.6 223 | 11:17:52 AM,85.3 224 | 11:17:52 AM,86.3 225 | 11:17:52 AM,85.9 226 | 11:17:52 AM,86.4 227 | 11:17:52 AM,85.3 228 | 11:17:52 AM,85.5 229 | 11:17:52 AM,85.6 230 | 11:17:52 AM,86.7 231 | 11:17:52 AM,86.1 232 | 11:17:53 AM,85.8 233 | 11:17:53 AM,85.7 234 | 11:17:53 AM,86.4 235 | 11:17:53 AM,85.8 236 | 11:17:53 AM,86.2 237 | 11:17:53 AM,85.8 238 | 11:17:53 AM,85.8 239 | 11:17:53 AM,85.9 240 | 11:17:53 AM,85.6 241 | 11:17:53 AM,85.6 242 | 11:17:54 AM,85.8 243 | 11:17:54 AM,85.4 244 | 11:17:54 AM,85.1 245 | 11:17:54 AM,85.4 246 | 11:17:54 AM,85.1 247 | 11:17:54 AM,85.6 248 | 11:17:54 AM,85.3 249 | 11:17:54 AM,85.8 250 | 11:17:54 AM,85.4 251 | 11:17:54 AM,84.5 252 | 11:17:55 AM,85.8 253 | 11:17:55 AM,84.6 254 | 11:17:55 AM,84.5 255 | 11:17:55 AM,86.2 256 | 11:17:55 AM,84.4 257 | 11:17:55 AM,84.6 258 | 11:17:55 AM,85.3 259 | 11:17:55 AM,85.7 260 | 11:17:55 AM,86.5 261 | 11:17:55 AM,85.1 262 | 11:17:56 AM,85 263 | 11:17:56 AM,85.6 264 | 11:17:56 AM,84.6 265 | 11:17:56 AM,83 266 | 11:17:56 AM,85.4 267 | 11:17:56 AM,84.9 268 | 11:17:56 AM,85.4 269 | 11:17:56 AM,85 270 | 11:17:56 AM,86.6 271 | 11:17:56 AM,85.3 272 | 11:17:57 AM,84.4 273 | 11:17:57 AM,85.4 274 | 11:17:57 AM,86.1 275 | 11:17:57 AM,86.8 276 | 11:17:57 AM,83.1 277 | 11:17:57 AM,84.5 278 | 11:17:57 AM,85.5 279 | 11:17:57 AM,83.7 280 | 11:17:57 AM,85.4 281 | 11:17:57 AM,85.8 282 | 11:17:58 AM,84.3 283 | 11:17:58 AM,84.6 284 | 11:17:58 AM,85 285 | 11:17:58 AM,83.5 286 | 11:17:58 AM,84.8 287 | 11:17:58 AM,85.6 288 | 11:17:58 AM,84.1 289 | 11:17:58 AM,84.8 290 | 11:17:58 AM,85.2 291 | 11:17:58 AM,84.1 292 | 11:17:59 AM,84.1 293 | 11:17:59 AM,83.6 294 | 11:17:59 AM,84.4 295 | 11:17:59 AM,84.2 296 | 11:17:59 AM,83.7 297 | 11:17:59 AM,84 298 | 11:17:59 AM,84.5 299 | 11:17:59 AM,84.5 300 | 11:17:59 AM,84.1 301 | 11:17:59 AM,84.6 302 | 11:18:00 AM,84.3 303 | 11:18:00 AM,83.9 304 | 11:18:00 AM,84.6 305 | 11:18:00 AM,84.8 306 | 11:18:00 AM,83.4 307 | 11:18:00 AM,83.9 308 | 11:18:00 AM,83.9 309 | 11:18:00 AM,85.1 310 | 11:18:00 AM,84.1 311 | 11:18:00 AM,84.4 312 | 11:18:01 AM,83.7 313 | 11:18:01 AM,83.7 314 | 11:18:01 AM,84.2 315 | 11:18:01 AM,84.5 316 | 11:18:01 AM,84.4 317 | 11:18:01 AM,84.7 318 | 11:18:01 AM,83.6 319 | 11:18:01 AM,83.7 320 | 11:18:01 AM,83.4 321 | 11:18:01 AM,83.1 322 | 11:18:02 AM,82.7 323 | 11:18:02 AM,83 324 | 11:18:02 AM,83.4 325 | 11:18:02 AM,83 326 | 11:18:02 AM,82.1 327 | 11:18:02 AM,82.4 328 | 11:18:02 AM,81.9 329 | 11:18:02 AM,81.5 330 | 11:18:02 AM,81.7 331 | 11:18:02 AM,80.7 332 | 11:18:03 AM,81.1 333 | 11:18:03 AM,81 334 | 11:18:03 AM,80.7 335 | 11:18:03 AM,80.9 336 | 11:18:03 AM,80 337 | 11:18:03 AM,80.3 338 | 11:18:03 AM,79.7 339 | 11:18:03 AM,79.6 340 | 11:18:03 AM,79.3 341 | 11:18:03 AM,78.8 342 | 11:18:04 AM,78.3 343 | 11:18:04 AM,76.9 344 | 11:18:04 AM,77.1 345 | 11:18:04 AM,78.2 346 | 11:18:04 AM,78 347 | 11:18:04 AM,77.2 348 | 11:18:04 AM,77.4 349 | 11:18:04 AM,77 350 | 11:18:04 AM,76.6 351 | 11:18:04 AM,76.2 352 | 11:18:05 AM,76.3 353 | 11:18:05 AM,76.6 354 | 11:18:05 AM,75.6 355 | 11:18:05 AM,75.2 356 | 11:18:05 AM,74.6 357 | 11:18:05 AM,74.8 358 | 11:18:05 AM,74.3 359 | 11:18:05 AM,74.8 360 | 11:18:05 AM,74.6 361 | 11:18:05 AM,73.3 362 | 11:18:06 AM,74.2 363 | 11:18:06 AM,73.4 364 | 11:18:06 AM,72.5 365 | 11:18:06 AM,72.3 366 | 11:18:06 AM,72.2 367 | 11:18:06 AM,72.5 368 | 11:18:06 AM,71.5 369 | 11:18:06 AM,71.6 370 | 11:18:06 AM,70.6 371 | 11:18:06 AM,71.1 372 | 11:18:07 AM,71.3 373 | 11:18:07 AM,70.8 374 | 11:18:07 AM,70.1 375 | 11:18:07 AM,70 376 | 11:18:07 AM,69.6 377 | 11:18:07 AM,70.2 378 | 11:18:07 AM,69.5 379 | 11:18:07 AM,69.6 380 | 11:18:07 AM,69.2 381 | 11:18:07 AM,68.5 382 | 11:18:08 AM,68.8 383 | 11:18:08 AM,68.5 384 | 11:18:08 AM,68.8 385 | 11:18:08 AM,68.1 386 | 11:18:08 AM,67.5 387 | 11:18:08 AM,67.4 388 | 11:18:08 AM,67.5 389 | 11:18:08 AM,67.4 390 | 11:18:08 AM,67 391 | 11:18:08 AM,66.2 392 | 11:18:09 AM,67 393 | 11:18:09 AM,66.1 394 | 11:18:09 AM,67.4 395 | 11:18:09 AM,67.5 396 | 11:18:09 AM,65.7 397 | 11:18:09 AM,66.2 398 | 11:18:09 AM,66.1 399 | 11:18:09 AM,66.3 400 | 11:18:09 AM,65.3 401 | 11:18:09 AM,65.4 402 | 11:18:10 AM,64.7 403 | 11:18:10 AM,64.8 404 | 11:18:10 AM,65 405 | 11:18:10 AM,64 406 | 11:18:10 AM,64.3 407 | 11:18:10 AM,63.9 408 | 11:18:10 AM,63 409 | 11:18:10 AM,63.9 410 | 11:18:10 AM,63.3 411 | 11:18:10 AM,63.3 412 | 11:18:11 AM,62.6 413 | 11:18:11 AM,62 414 | 11:18:11 AM,63 415 | 11:18:11 AM,62.3 416 | 11:18:11 AM,62 417 | 11:18:11 AM,62 418 | 11:18:11 AM,61.5 419 | 11:18:11 AM,61.6 420 | 11:18:11 AM,61.6 421 | 11:18:11 AM,61.9 422 | 11:18:12 AM,61 423 | 11:18:12 AM,60.4 424 | 11:18:12 AM,61.2 425 | 11:18:12 AM,60.9 426 | 11:18:12 AM,60.8 427 | 11:18:12 AM,60.4 428 | 11:18:12 AM,60.3 429 | 11:18:12 AM,60.3 430 | 11:18:12 AM,60.5 431 | 11:18:12 AM,60 432 | 11:18:13 AM,59.8 433 | 11:18:13 AM,59.6 434 | 11:18:13 AM,59.6 435 | 11:18:13 AM,60 436 | 11:18:13 AM,59.2 437 | 11:18:13 AM,58.9 438 | 11:18:13 AM,59.5 439 | 11:18:13 AM,58.7 440 | 11:18:13 AM,58.8 441 | 11:18:13 AM,58.4 442 | 11:18:14 AM,57.4 443 | 11:18:14 AM,57.9 444 | 11:18:14 AM,57 445 | 11:18:14 AM,57.7 446 | 11:18:14 AM,57.7 447 | 11:18:14 AM,57.1 448 | 11:18:14 AM,56.8 449 | 11:18:14 AM,56.5 450 | 11:18:14 AM,56.5 451 | 11:18:14 AM,57 452 | 11:18:15 AM,56.5 453 | 11:18:15 AM,55.5 454 | 11:18:15 AM,56 455 | 11:18:15 AM,56.5 456 | 11:18:15 AM,56 457 | 11:18:15 AM,56.1 458 | 11:18:15 AM,55.4 459 | 11:18:15 AM,56.4 460 | 11:18:15 AM,55.3 461 | 11:18:15 AM,54.7 462 | 11:18:16 AM,55.1 463 | 11:18:16 AM,55.1 464 | 11:18:16 AM,54.7 465 | 11:18:16 AM,54.4 466 | 11:18:16 AM,55.1 467 | 11:18:16 AM,54.7 468 | 11:18:16 AM,54.1 469 | 11:18:16 AM,54 470 | 11:18:16 AM,54.1 471 | 11:18:16 AM,53.5 472 | 11:18:17 AM,53 473 | 11:18:17 AM,53.4 474 | 11:18:17 AM,54.1 475 | 11:18:17 AM,54.5 476 | 11:18:17 AM,54 477 | 11:18:17 AM,53.8 478 | 11:18:17 AM,53.7 479 | 11:18:17 AM,54 480 | 11:18:17 AM,53 481 | 11:18:17 AM,52.8 482 | 11:18:18 AM,52.1 483 | 11:18:18 AM,52 484 | 11:18:18 AM,52.3 485 | 11:18:18 AM,51.9 486 | 11:18:18 AM,51.9 487 | 11:18:18 AM,51.3 488 | 11:18:18 AM,51.2 489 | 11:18:18 AM,51.2 490 | 11:18:18 AM,51.5 491 | 11:18:18 AM,51.2 492 | 11:18:19 AM,50.7 493 | 11:18:19 AM,50.6 494 | 11:18:19 AM,50.4 495 | 11:18:19 AM,50.3 496 | 11:18:19 AM,50.6 497 | 11:18:19 AM,50.7 498 | 11:18:19 AM,49.9 499 | 11:18:19 AM,50.2 500 | 11:18:19 AM,49.5 501 | 11:18:19 AM,49.5 502 | 11:18:20 AM,49.3 503 | 11:18:20 AM,49.4 504 | 11:18:20 AM,49.9 505 | 11:18:20 AM,49.1 506 | 11:18:20 AM,49.3 507 | 11:18:20 AM,49.4 508 | 11:18:20 AM,49.3 509 | 11:18:20 AM,48.8 510 | 11:18:20 AM,48.9 511 | 11:18:20 AM,47.7 512 | 11:18:21 AM,49.2 513 | 11:18:21 AM,48.9 514 | 11:18:21 AM,49.1 515 | 11:18:21 AM,49 516 | 11:18:21 AM,48.4 517 | 11:18:21 AM,48 518 | 11:18:21 AM,48.8 519 | 11:18:21 AM,48.2 520 | 11:18:21 AM,48.4 521 | 11:18:21 AM,48.4 522 | 11:18:22 AM,48.5 523 | 11:18:22 AM,48.2 524 | 11:18:22 AM,47 525 | 11:18:22 AM,48.1 526 | 11:18:22 AM,47 527 | 11:18:22 AM,47 528 | 11:18:22 AM,47.3 529 | 11:18:22 AM,47.3 530 | 11:18:22 AM,46.1 531 | 11:18:22 AM,45.5 532 | 11:18:23 AM,45.9 533 | 11:18:23 AM,46.3 534 | 11:18:23 AM,47 535 | 11:18:23 AM,45.4 536 | 11:18:23 AM,46.1 537 | 11:18:23 AM,45.9 538 | 11:18:23 AM,45.6 539 | 11:18:23 AM,45.1 540 | 11:18:23 AM,45.5 541 | 11:18:23 AM,45.3 542 | 11:18:24 AM,44.8 543 | 11:18:24 AM,44.9 544 | 11:18:24 AM,45.1 545 | 11:18:24 AM,44.4 546 | 11:18:24 AM,45.1 547 | 11:18:24 AM,44.5 548 | 11:18:24 AM,43.4 549 | 11:18:24 AM,44.8 550 | 11:18:24 AM,44.3 551 | 11:18:24 AM,44.4 552 | 11:18:25 AM,44.5 553 | 11:18:25 AM,44.9 554 | 11:18:25 AM,43.8 555 | 11:18:25 AM,44.2 556 | 11:18:25 AM,44.9 557 | 11:18:25 AM,43.4 558 | 11:18:25 AM,44.1 559 | 11:18:25 AM,43.9 560 | 11:18:25 AM,43.9 561 | 11:18:25 AM,43.4 562 | 11:18:26 AM,43.2 563 | 11:18:26 AM,43.1 564 | 11:18:26 AM,43.8 565 | 11:18:26 AM,42.7 566 | 11:18:26 AM,42.9 567 | 11:18:26 AM,42.8 568 | 11:18:26 AM,42.3 569 | 11:18:26 AM,42.6 570 | 11:18:26 AM,41.8 571 | 11:18:26 AM,42.6 572 | 11:18:27 AM,42.3 573 | 11:18:27 AM,41.6 574 | 11:18:27 AM,42 575 | 11:18:27 AM,41.6 576 | 11:18:27 AM,42.2 577 | 11:18:27 AM,42 578 | 11:18:27 AM,41.5 579 | 11:18:27 AM,41.4 580 | 11:18:27 AM,41.7 581 | 11:18:27 AM,40.5 582 | 11:18:28 AM,41.2 583 | 11:18:28 AM,41.2 584 | 11:18:28 AM,41.2 585 | 11:18:28 AM,41 586 | 11:18:28 AM,40.5 587 | 11:18:28 AM,41.1 588 | 11:18:28 AM,39.4 589 | 11:18:28 AM,39.7 590 | 11:18:28 AM,41 591 | 11:18:28 AM,40.2 592 | 11:18:29 AM,40.1 593 | 11:18:29 AM,40.6 594 | 11:18:29 AM,40.5 595 | 11:18:29 AM,40.4 596 | 11:18:29 AM,39.8 597 | 11:18:29 AM,39.8 598 | 11:18:29 AM,39.9 599 | 11:18:29 AM,40.3 600 | 11:18:29 AM,38.7 601 | 11:18:29 AM,40.7 602 | 11:18:30 AM,39.5 603 | 11:18:30 AM,39.6 604 | 11:18:30 AM,39.7 605 | 11:18:30 AM,39 606 | 11:18:30 AM,40 607 | 11:18:30 AM,38.7 608 | 11:18:30 AM,39.3 609 | 11:18:30 AM,38.4 610 | 11:18:30 AM,38.3 611 | 11:18:30 AM,38.6 612 | 11:18:31 AM,37.9 613 | 11:18:31 AM,38.7 614 | 11:18:31 AM,39.2 615 | 11:18:31 AM,37.6 616 | 11:18:31 AM,38.3 617 | 11:18:31 AM,37.6 618 | 11:18:31 AM,38.5 619 | 11:18:31 AM,37.7 620 | 11:18:31 AM,37.9 621 | 11:18:31 AM,38.1 622 | 11:18:32 AM,37.4 623 | 11:18:32 AM,38.6 624 | 11:18:32 AM,36.8 625 | 11:18:32 AM,37.6 626 | 11:18:32 AM,37.3 627 | 11:18:32 AM,36.9 628 | 11:18:32 AM,37.5 629 | 11:18:32 AM,37.4 630 | 11:18:32 AM,36.3 631 | 11:18:32 AM,36.8 632 | 11:18:33 AM,37.6 633 | 11:18:33 AM,36.7 634 | 11:18:33 AM,36.4 635 | 11:18:33 AM,37.2 636 | 11:18:33 AM,37.1 637 | 11:18:33 AM,36.5 638 | 11:18:33 AM,37.6 639 | 11:18:33 AM,36.8 640 | 11:18:33 AM,37.3 641 | 11:18:33 AM,36.1 642 | 11:18:34 AM,37 643 | 11:18:34 AM,36.7 644 | 11:18:34 AM,36.7 645 | 11:18:34 AM,36.5 646 | 11:18:34 AM,35.8 647 | 11:18:34 AM,36.5 648 | 11:18:34 AM,36.2 649 | 11:18:34 AM,35 650 | 11:18:34 AM,35.4 651 | 11:18:34 AM,35.5 652 | 11:18:35 AM,35.7 653 | 11:18:35 AM,35.7 654 | 11:18:35 AM,34.7 655 | 11:18:35 AM,36.3 656 | 11:18:35 AM,35.3 657 | 11:18:35 AM,35.1 658 | 11:18:35 AM,33.6 659 | 11:18:35 AM,35.1 660 | 11:18:35 AM,35 661 | 11:18:35 AM,35.3 662 | 11:18:36 AM,34.9 663 | 11:18:36 AM,35.1 664 | 11:18:36 AM,35.6 665 | 11:18:36 AM,34.9 666 | 11:18:36 AM,34.5 667 | 11:18:36 AM,34.6 668 | 11:18:36 AM,35 669 | 11:18:36 AM,33.8 670 | 11:18:36 AM,34.5 671 | 11:18:36 AM,33.4 672 | 11:18:37 AM,33.8 673 | 11:18:37 AM,33.3 674 | 11:18:37 AM,33.9 675 | 11:18:37 AM,33.5 676 | 11:18:37 AM,34.2 677 | 11:18:37 AM,33.7 678 | 11:18:37 AM,34.1 679 | 11:18:37 AM,33.2 680 | 11:18:37 AM,33.7 681 | 11:18:37 AM,34.5 682 | 11:18:38 AM,33.5 683 | 11:18:38 AM,33.3 684 | 11:18:38 AM,33.1 685 | 11:18:38 AM,33.7 686 | 11:18:38 AM,33.4 687 | 11:18:38 AM,33.1 688 | 11:18:38 AM,32.8 689 | 11:18:38 AM,32.7 690 | 11:18:38 AM,33.5 691 | 11:18:38 AM,32 692 | 11:18:39 AM,32.2 693 | 11:18:39 AM,32.4 694 | 11:18:39 AM,32.4 695 | 11:18:39 AM,33 696 | 11:18:39 AM,31.4 697 | 11:18:39 AM,31.8 698 | 11:18:39 AM,33.1 699 | 11:18:39 AM,32.1 700 | 11:18:39 AM,31.9 701 | 11:18:39 AM,31.6 702 | 11:18:40 AM,31.9 703 | 11:18:40 AM,31.9 704 | 11:18:40 AM,31.4 705 | 11:18:40 AM,31.6 706 | 11:18:40 AM,31.6 707 | 11:18:40 AM,31.6 708 | 11:18:40 AM,30.3 709 | 11:18:40 AM,31.7 710 | 11:18:40 AM,31.6 711 | 11:18:40 AM,32.1 712 | 11:18:41 AM,30.9 713 | 11:18:41 AM,30.5 714 | 11:18:41 AM,31 715 | 11:18:41 AM,30.7 716 | 11:18:41 AM,30.8 717 | 11:18:41 AM,31 718 | 11:18:41 AM,31.1 719 | 11:18:41 AM,32.7 720 | 11:18:41 AM,30.6 721 | 11:18:41 AM,31.6 722 | 11:18:42 AM,30.7 723 | 11:18:42 AM,31.2 724 | 11:18:42 AM,31.1 725 | 11:18:42 AM,31.8 726 | 11:18:42 AM,29.1 727 | 11:18:42 AM,30.8 728 | 11:18:42 AM,29.8 729 | 11:18:42 AM,30.5 730 | 11:18:42 AM,30.4 731 | 11:18:42 AM,30.1 732 | 11:18:43 AM,30.1 733 | 11:18:43 AM,29.8 734 | 11:18:43 AM,29.2 735 | 11:18:43 AM,29.8 736 | 11:18:43 AM,30.1 737 | 11:18:43 AM,30.3 738 | 11:18:43 AM,29.3 739 | 11:18:43 AM,29.9 740 | 11:18:43 AM,28.3 741 | 11:18:43 AM,29.3 742 | 11:18:44 AM,30.1 743 | 11:18:44 AM,29.7 744 | 11:18:44 AM,28.7 745 | 11:18:44 AM,29.2 746 | 11:18:44 AM,29.8 747 | 11:18:44 AM,28.9 748 | 11:18:44 AM,28.9 749 | 11:18:44 AM,29.2 750 | 11:18:44 AM,28.3 751 | 11:18:44 AM,28.8 752 | 11:18:45 AM,28.7 753 | 11:18:45 AM,28.7 754 | 11:18:45 AM,27.6 755 | 11:18:45 AM,28.7 756 | 11:18:45 AM,28.1 757 | 11:18:45 AM,28 758 | 11:18:45 AM,28.4 759 | 11:18:45 AM,29.5 760 | 11:18:45 AM,27.9 761 | 11:18:45 AM,29 762 | 11:18:46 AM,28.6 763 | 11:18:46 AM,28.3 764 | 11:18:46 AM,28.3 765 | 11:18:46 AM,29.2 766 | 11:18:46 AM,27.8 767 | 11:18:46 AM,27.8 768 | 11:18:46 AM,28.5 769 | 11:18:46 AM,27.6 770 | 11:18:46 AM,27.4 771 | 11:18:46 AM,27.2 772 | 11:18:47 AM,26.6 773 | 11:18:47 AM,27.3 774 | 11:18:47 AM,29 775 | 11:18:47 AM,27.2 776 | 11:18:47 AM,26.6 777 | 11:18:47 AM,27.4 778 | 11:18:47 AM,26.6 779 | 11:18:47 AM,26.2 780 | 11:18:47 AM,26.8 781 | 11:18:47 AM,26.6 782 | 11:18:48 AM,26.6 783 | 11:18:48 AM,27 784 | 11:18:48 AM,26.8 785 | 11:18:48 AM,25.9 786 | 11:18:48 AM,26.3 787 | 11:18:48 AM,25.7 788 | 11:18:48 AM,26.2 789 | 11:18:48 AM,25.3 790 | 11:18:48 AM,25.4 791 | 11:18:48 AM,25.6 792 | 11:18:49 AM,26.1 793 | 11:18:49 AM,25.4 794 | 11:18:49 AM,26 795 | 11:18:49 AM,25.1 796 | 11:18:49 AM,25.8 797 | 11:18:49 AM,25.8 798 | 11:18:49 AM,25.3 799 | 11:18:49 AM,24.5 800 | 11:18:49 AM,25.4 801 | 11:18:49 AM,25.8 802 | 11:18:50 AM,25.3 803 | 11:18:50 AM,25.8 804 | 11:18:50 AM,25.4 805 | 11:18:50 AM,25.8 806 | 11:18:50 AM,25 807 | 11:18:50 AM,25.1 808 | 11:18:50 AM,25.4 809 | 11:18:50 AM,25.1 810 | 11:18:50 AM,24.4 811 | 11:18:50 AM,24.7 812 | 11:18:51 AM,24.4 813 | 11:18:51 AM,24.9 814 | 11:18:51 AM,25.1 815 | 11:18:51 AM,24.9 816 | 11:18:51 AM,24.3 817 | 11:18:51 AM,24.7 818 | 11:18:51 AM,23.4 819 | 11:18:51 AM,24.8 820 | 11:18:51 AM,23.9 821 | 11:18:51 AM,23.6 822 | 11:18:52 AM,23.3 823 | 11:18:52 AM,24.3 824 | 11:18:52 AM,23.9 825 | 11:18:52 AM,23.7 826 | 11:18:52 AM,24.1 827 | 11:18:52 AM,23.9 828 | 11:18:52 AM,23.9 829 | 11:18:52 AM,23.1 830 | 11:18:52 AM,23.9 831 | 11:18:52 AM,23.5 832 | 11:18:53 AM,23.4 833 | 11:18:53 AM,23.7 834 | 11:18:53 AM,23.2 835 | 11:18:53 AM,23.9 836 | 11:18:53 AM,23.7 837 | 11:18:53 AM,24.1 838 | 11:18:53 AM,23 839 | 11:18:53 AM,22.7 840 | 11:18:53 AM,23 841 | 11:18:53 AM,23.8 842 | 11:18:54 AM,23.5 843 | 11:18:54 AM,23.8 844 | 11:18:54 AM,24.2 845 | 11:18:54 AM,23.8 846 | 11:18:54 AM,24.3 847 | 11:18:54 AM,23.5 848 | 11:18:54 AM,23.1 849 | 11:18:54 AM,23.7 850 | 11:18:54 AM,22.1 851 | 11:18:54 AM,22.8 852 | 11:18:55 AM,22.7 853 | 11:18:55 AM,23.1 854 | 11:18:55 AM,23.1 855 | 11:18:55 AM,22.3 856 | 11:18:55 AM,22.5 857 | 11:18:55 AM,23 858 | 11:18:55 AM,22 859 | 11:18:55 AM,23 860 | 11:18:55 AM,22.5 861 | 11:18:55 AM,22.4 862 | 11:18:56 AM,21.9 863 | 11:18:56 AM,21.7 864 | 11:18:56 AM,21.9 865 | 11:18:56 AM,21.9 866 | 11:18:56 AM,21.7 867 | 11:18:56 AM,21.5 868 | 11:18:56 AM,22.8 869 | 11:18:56 AM,22.3 870 | 11:18:56 AM,21.9 871 | 11:18:56 AM,21.4 872 | 11:18:57 AM,21.9 873 | 11:18:57 AM,21.6 874 | 11:18:57 AM,21.7 875 | 11:18:57 AM,22.2 876 | 11:18:57 AM,21.9 877 | 11:18:57 AM,21.2 878 | 11:18:57 AM,22.3 879 | 11:18:57 AM,21.5 880 | 11:18:57 AM,21.5 881 | 11:18:57 AM,21.5 882 | 11:18:58 AM,21.4 883 | 11:18:58 AM,21.8 884 | 11:18:58 AM,21.9 885 | 11:18:58 AM,21.5 886 | 11:18:58 AM,21.5 887 | 11:18:58 AM,22.2 888 | 11:18:58 AM,21.9 889 | 11:18:58 AM,21.8 890 | 11:18:58 AM,22 891 | 11:18:58 AM,21.3 892 | 11:18:59 AM,20.8 893 | 11:18:59 AM,21.7 894 | 11:18:59 AM,20.7 895 | 11:18:59 AM,21.7 896 | 11:18:59 AM,20 897 | 11:18:59 AM,21 898 | 11:18:59 AM,20.5 899 | 11:18:59 AM,20.5 900 | 11:18:59 AM,20.8 901 | 11:18:59 AM,20.6 902 | 11:19:00 AM,19.7 903 | 11:19:00 AM,20.3 904 | 11:19:00 AM,21 905 | 11:19:00 AM,20.4 906 | 11:19:00 AM,19.9 907 | 11:19:00 AM,20.7 908 | 11:19:00 AM,20.5 909 | 11:19:00 AM,19.5 910 | 11:19:00 AM,20.1 911 | 11:19:00 AM,20.7 912 | 11:19:01 AM,19.8 913 | 11:19:01 AM,20.6 914 | 11:19:01 AM,20.7 915 | 11:19:01 AM,20.3 916 | 11:19:01 AM,19.9 917 | 11:19:01 AM,21.2 918 | 11:19:01 AM,20.1 919 | 11:19:01 AM,19.9 920 | 11:19:01 AM,21.3 921 | 11:19:01 AM,20.7 922 | 11:19:02 AM,20.2 923 | 11:19:02 AM,20.7 924 | 11:19:02 AM,20 925 | 11:19:02 AM,19.6 926 | 11:19:02 AM,21.1 927 | 11:19:02 AM,20.3 928 | 11:19:02 AM,20 929 | 11:19:02 AM,20.3 930 | 11:19:02 AM,19.7 931 | 11:19:02 AM,20.3 932 | 11:19:03 AM,19.7 933 | 11:19:03 AM,20.8 934 | 11:19:03 AM,20.2 935 | 11:19:03 AM,19.8 936 | 11:19:03 AM,19.8 937 | 11:19:03 AM,19.6 938 | 11:19:03 AM,19.9 939 | 11:19:03 AM,20 940 | 11:19:03 AM,19.5 941 | 11:19:03 AM,19.1 942 | 11:19:04 AM,19 943 | 11:19:04 AM,19.2 944 | 11:19:04 AM,19.9 945 | 11:19:04 AM,19.1 946 | 11:19:04 AM,19.1 947 | 11:19:04 AM,18.8 948 | 11:19:04 AM,18.7 949 | 11:19:04 AM,19.2 950 | 11:19:04 AM,19.3 951 | 11:19:04 AM,19.4 952 | 11:19:05 AM,19.2 953 | 11:19:05 AM,19.6 954 | 11:19:05 AM,18.3 955 | 11:19:05 AM,18 956 | 11:19:05 AM,18.7 957 | 11:19:05 AM,18.7 958 | 11:19:05 AM,19.9 959 | 11:19:05 AM,19.1 960 | 11:19:05 AM,18.7 961 | 11:19:05 AM,18.4 962 | 11:19:06 AM,18.7 963 | 11:19:06 AM,19.7 964 | 11:19:06 AM,19.2 965 | 11:19:06 AM,19.3 966 | 11:19:06 AM,19.8 967 | 11:19:06 AM,19.4 968 | 11:19:06 AM,19.5 969 | 11:19:06 AM,19 970 | 11:19:06 AM,19.5 971 | 11:19:06 AM,19.1 972 | 11:19:07 AM,19.3 973 | 11:19:07 AM,19 974 | 11:19:07 AM,18.6 975 | 11:19:07 AM,18.7 976 | 11:19:07 AM,18.4 977 | 11:19:07 AM,19.3 978 | 11:19:07 AM,18.5 979 | 11:19:07 AM,19.4 980 | 11:19:07 AM,18.3 981 | 11:19:07 AM,17.9 982 | 11:19:08 AM,19.2 983 | 11:19:08 AM,17.9 984 | 11:19:08 AM,17.6 985 | 11:19:08 AM,18.4 986 | 11:19:08 AM,17.9 987 | 11:19:08 AM,17 988 | 11:19:08 AM,18.2 989 | 11:19:08 AM,18.5 990 | 11:19:08 AM,17.9 991 | 11:19:08 AM,18.1 992 | 11:19:09 AM,18.2 993 | 11:19:09 AM,17.5 994 | 11:19:09 AM,18 995 | 11:19:09 AM,18.2 996 | 11:19:09 AM,17.9 997 | 11:19:09 AM,18.8 998 | 11:19:09 AM,18.3 999 | 11:19:09 AM,16.9 1000 | 11:19:09 AM,17.5 1001 | 11:19:09 AM,17.7 1002 | 11:19:10 AM,17.5 1003 | 11:19:10 AM,18.6 1004 | 11:19:10 AM,17.3 1005 | 11:19:10 AM,17.4 1006 | 11:19:10 AM,18.1 1007 | 11:19:10 AM,19.1 1008 | 11:19:10 AM,17.5 1009 | 11:19:10 AM,18.1 1010 | 11:19:10 AM,17.4 1011 | 11:19:10 AM,18.7 1012 | 11:19:11 AM,18.5 1013 | 11:19:11 AM,17.8 1014 | 11:19:11 AM,18.5 1015 | 11:19:11 AM,17.6 1016 | 11:19:11 AM,17.9 1017 | 11:19:11 AM,18.2 1018 | 11:19:11 AM,16.8 1019 | 11:19:11 AM,16.7 1020 | 11:19:11 AM,17.3 1021 | 11:19:11 AM,16.9 1022 | 11:19:12 AM,17.3 1023 | 11:19:12 AM,16.7 1024 | 11:19:12 AM,17.6 1025 | 11:19:12 AM,17.1 1026 | 11:19:12 AM,16.7 1027 | 11:19:12 AM,17.2 1028 | 11:19:12 AM,16.6 1029 | 11:19:12 AM,17.6 1030 | 11:19:12 AM,16.9 1031 | 11:19:12 AM,17.2 1032 | 11:19:13 AM,16.8 1033 | 11:19:13 AM,17 1034 | 11:19:13 AM,17.1 1035 | 11:19:13 AM,16.8 1036 | 11:19:13 AM,17.3 1037 | 11:19:13 AM,16.7 1038 | 11:19:13 AM,16.8 1039 | 11:19:13 AM,16.7 1040 | 11:19:13 AM,16.2 1041 | 11:19:13 AM,16.8 1042 | 11:19:14 AM,17 1043 | 11:19:14 AM,17.5 1044 | 11:19:14 AM,16.4 1045 | 11:19:14 AM,16.6 1046 | 11:19:14 AM,16.7 1047 | 11:19:14 AM,17.4 1048 | 11:19:14 AM,17 1049 | 11:19:14 AM,16.6 1050 | 11:19:14 AM,17.4 1051 | 11:19:14 AM,17.1 1052 | 11:19:15 AM,17.2 1053 | 11:19:15 AM,17.2 1054 | 11:19:15 AM,17.7 1055 | 11:19:15 AM,16.9 1056 | 11:19:15 AM,16.2 1057 | 11:19:15 AM,16.6 1058 | 11:19:15 AM,16.2 1059 | 11:19:15 AM,16.7 1060 | 11:19:15 AM,16.7 1061 | 11:19:15 AM,16.4 1062 | 11:19:16 AM,16.2 1063 | 11:19:16 AM,15.9 1064 | 11:19:16 AM,16 1065 | 11:19:16 AM,16.6 1066 | 11:19:16 AM,16.6 1067 | 11:19:16 AM,15.8 1068 | 11:19:16 AM,15.8 1069 | 11:19:16 AM,16.3 1070 | 11:19:16 AM,16.4 1071 | 11:19:16 AM,16.7 1072 | 11:19:17 AM,16.4 1073 | 11:19:17 AM,15.9 1074 | 11:19:17 AM,16.4 1075 | 11:19:17 AM,15.9 1076 | 11:19:17 AM,15.7 1077 | 11:19:17 AM,16.4 1078 | 11:19:17 AM,16.5 1079 | 11:19:17 AM,16.5 1080 | 11:19:17 AM,16.3 1081 | 11:19:17 AM,15.2 1082 | 11:19:18 AM,16 1083 | 11:19:18 AM,15.9 1084 | 11:19:18 AM,17 1085 | 11:19:18 AM,16.3 1086 | 11:19:18 AM,16.2 1087 | 11:19:18 AM,15.5 1088 | 11:19:18 AM,15.9 1089 | 11:19:18 AM,15.6 1090 | 11:19:18 AM,16.2 1091 | 11:19:18 AM,15.9 1092 | 11:19:19 AM,15.8 1093 | 11:19:19 AM,16.7 1094 | 11:19:19 AM,16.3 1095 | 11:19:19 AM,16.5 1096 | 11:19:19 AM,15.7 1097 | 11:19:19 AM,15.5 1098 | 11:19:19 AM,16.2 1099 | 11:19:19 AM,16.1 1100 | 11:19:19 AM,16.2 1101 | 11:19:19 AM,15.7 1102 | 11:19:20 AM,15.8 1103 | 11:19:20 AM,16.5 1104 | 11:19:20 AM,14.6 1105 | 11:19:20 AM,15.4 1106 | 11:19:20 AM,15.5 1107 | 11:19:20 AM,15.4 1108 | 11:19:20 AM,14.9 1109 | 11:19:20 AM,15.2 1110 | 11:19:20 AM,15.2 1111 | 11:19:20 AM,14.3 1112 | 11:19:21 AM,15.3 1113 | 11:19:21 AM,15 1114 | 11:19:21 AM,15 1115 | 11:19:21 AM,15.3 1116 | 11:19:21 AM,15.2 1117 | 11:19:21 AM,15.4 1118 | 11:19:21 AM,15.3 1119 | 11:19:21 AM,14.7 1120 | 11:19:21 AM,14.7 1121 | 11:19:21 AM,14.7 1122 | 11:19:22 AM,14.8 1123 | 11:19:22 AM,14.7 1124 | 11:19:22 AM,14.5 1125 | 11:19:22 AM,15.5 1126 | 11:19:22 AM,15.6 1127 | 11:19:22 AM,15 1128 | 11:19:22 AM,15.1 1129 | 11:19:22 AM,15.6 1130 | 11:19:22 AM,15.1 1131 | 11:19:22 AM,15.2 1132 | 11:19:23 AM,16 1133 | 11:19:23 AM,15.9 1134 | 11:19:23 AM,15.6 1135 | 11:19:23 AM,15.3 1136 | 11:19:23 AM,15.9 1137 | 11:19:23 AM,15.7 1138 | 11:19:23 AM,14.9 1139 | 11:19:23 AM,15.2 1140 | 11:19:23 AM,15.3 1141 | 11:19:23 AM,15.1 1142 | 11:19:24 AM,14.5 1143 | 11:19:24 AM,15.3 1144 | 11:19:24 AM,14.7 1145 | 11:19:24 AM,14.8 1146 | 11:19:24 AM,14.9 1147 | 11:19:24 AM,14.5 1148 | 11:19:24 AM,14.6 1149 | 11:19:24 AM,14.1 1150 | 11:19:24 AM,14.5 1151 | 11:19:24 AM,14.5 1152 | 11:19:25 AM,14.9 1153 | 11:19:25 AM,14.1 1154 | 11:19:25 AM,14.1 1155 | 11:19:25 AM,14.7 1156 | 11:19:25 AM,14.4 1157 | 11:19:25 AM,13.9 1158 | 11:19:25 AM,14.6 1159 | 11:19:25 AM,14.4 1160 | 11:19:25 AM,14.4 1161 | 11:19:25 AM,13.9 1162 | 11:19:26 AM,14.7 1163 | 11:19:26 AM,14.7 1164 | 11:19:26 AM,14.7 1165 | 11:19:26 AM,14.7 1166 | 11:19:26 AM,14.8 1167 | 11:19:26 AM,13.9 1168 | 11:19:26 AM,15.1 1169 | 11:19:26 AM,14.8 1170 | 11:19:26 AM,15.4 1171 | 11:19:26 AM,14.2 1172 | 11:19:27 AM,15.5 1173 | 11:19:27 AM,14.4 1174 | 11:19:27 AM,14.8 1175 | 11:19:27 AM,14.5 1176 | 11:19:27 AM,14.9 1177 | 11:19:27 AM,14.5 1178 | 11:19:27 AM,14.4 1179 | 11:19:27 AM,14.1 1180 | 11:19:27 AM,14.1 1181 | 11:19:27 AM,15.5 1182 | 11:19:28 AM,13.6 1183 | 11:19:28 AM,13.2 1184 | 11:19:28 AM,13.4 1185 | 11:19:28 AM,13.5 1186 | 11:19:28 AM,13.9 1187 | 11:19:28 AM,14.2 1188 | 11:19:28 AM,14.2 1189 | 11:19:28 AM,13.5 1190 | 11:19:28 AM,13.9 1191 | 11:19:28 AM,14.2 1192 | 11:19:29 AM,12.7 1193 | 11:19:29 AM,14.1 1194 | 11:19:29 AM,13 1195 | 11:19:29 AM,13.5 1196 | 11:19:29 AM,13.5 1197 | 11:19:29 AM,13.8 1198 | 11:19:29 AM,13.2 1199 | 11:19:29 AM,13.9 1200 | 11:19:29 AM,13.5 1201 | 11:19:29 AM,13.9 1202 | 11:19:30 AM,13.4 1203 | 11:19:30 AM,13.9 1204 | 11:19:30 AM,13.8 1205 | 11:19:30 AM,13.5 1206 | 11:19:30 AM,13.5 1207 | 11:19:30 AM,14.1 1208 | 11:19:30 AM,13.5 1209 | 11:19:30 AM,13.2 1210 | 11:19:30 AM,13.5 1211 | 11:19:30 AM,13.5 1212 | 11:19:31 AM,14 1213 | 11:19:31 AM,13.8 1214 | 11:19:31 AM,13.9 1215 | 11:19:31 AM,13.9 1216 | 11:19:31 AM,14.5 1217 | 11:19:31 AM,13.5 1218 | 11:19:31 AM,14.9 1219 | 11:19:31 AM,14.5 1220 | 11:19:31 AM,14.1 1221 | 11:19:31 AM,13.8 1222 | 11:19:32 AM,13.5 1223 | 11:19:32 AM,12.9 1224 | 11:19:32 AM,13.1 1225 | 11:19:32 AM,12.8 1226 | 11:19:32 AM,13.5 1227 | 11:19:32 AM,12.2 1228 | 11:19:32 AM,13.2 1229 | 11:19:32 AM,13.5 1230 | 11:19:32 AM,13.6 1231 | 11:19:32 AM,13.2 1232 | 11:19:33 AM,12.8 1233 | 11:19:33 AM,12.8 1234 | 11:19:33 AM,13 1235 | 11:19:33 AM,13.5 1236 | 11:19:33 AM,13.1 1237 | 11:19:33 AM,12.6 1238 | 11:19:33 AM,12.8 1239 | 11:19:33 AM,13.6 1240 | 11:19:33 AM,12.3 1241 | 11:19:33 AM,12.9 1242 | 11:19:34 AM,12.9 1243 | 11:19:34 AM,12.8 1244 | 11:19:34 AM,12.8 1245 | 11:19:34 AM,12.8 1246 | 11:19:34 AM,12.9 1247 | 11:19:34 AM,13.5 1248 | 11:19:34 AM,13.5 1249 | 11:19:34 AM,13 1250 | 11:19:34 AM,14.1 1251 | 11:19:34 AM,13 1252 | 11:19:35 AM,13.2 1253 | 11:19:35 AM,13 1254 | 11:19:35 AM,13.5 1255 | 11:19:35 AM,12.6 1256 | 11:19:35 AM,13.6 1257 | 11:19:35 AM,13.1 1258 | 11:19:35 AM,12.2 1259 | 11:19:35 AM,12.9 1260 | 11:19:35 AM,13.5 1261 | 11:19:35 AM,13.1 1262 | 11:19:36 AM,12.6 1263 | 11:19:36 AM,13 1264 | 11:19:36 AM,12.8 1265 | 11:19:36 AM,12.2 1266 | 11:19:36 AM,12.5 1267 | 11:19:36 AM,12.9 1268 | 11:19:36 AM,13 1269 | 11:19:36 AM,12.2 1270 | 11:19:36 AM,12.1 1271 | 11:19:36 AM,13.3 1272 | 11:19:37 AM,11.7 1273 | 11:19:37 AM,12.3 1274 | 11:19:37 AM,12.9 1275 | 11:19:37 AM,12.5 1276 | 11:19:37 AM,12.7 1277 | 11:19:37 AM,12.1 1278 | 11:19:37 AM,11.9 1279 | 11:19:37 AM,12.6 1280 | 11:19:37 AM,12.2 1281 | 11:19:37 AM,11.5 1282 | 11:19:38 AM,11.5 1283 | 11:19:38 AM,12.3 1284 | 11:19:38 AM,12.6 1285 | 11:19:38 AM,12.4 1286 | 11:19:38 AM,12.3 1287 | 11:19:38 AM,12.2 1288 | 11:19:38 AM,12.5 1289 | 11:19:38 AM,13 1290 | 11:19:38 AM,12 1291 | 11:19:38 AM,13 1292 | 11:19:39 AM,12.6 1293 | 11:19:39 AM,12 1294 | 11:19:39 AM,12.5 1295 | 11:19:39 AM,12.9 1296 | 11:19:39 AM,12.7 1297 | 11:19:39 AM,12.9 1298 | 11:19:39 AM,12.3 1299 | 11:19:39 AM,11.4 1300 | 11:19:39 AM,12.6 1301 | 11:19:39 AM,11.9 1302 | 11:19:40 AM,12.6 1303 | 11:19:40 AM,12.4 1304 | 11:19:40 AM,11.9 1305 | 11:19:40 AM,12.2 1306 | 11:19:40 AM,12.4 1307 | 11:19:40 AM,11.8 1308 | 11:19:40 AM,12.2 1309 | 11:19:40 AM,11.4 1310 | 11:19:40 AM,11.7 1311 | 11:19:40 AM,11.6 1312 | 11:19:41 AM,11.5 1313 | 11:19:41 AM,11.8 1314 | 11:19:41 AM,11.8 1315 | 11:19:41 AM,11.2 1316 | 11:19:41 AM,11.2 1317 | 11:19:41 AM,10.6 1318 | 11:19:41 AM,12.4 1319 | 11:19:41 AM,11.7 1320 | 11:19:41 AM,11 1321 | 11:19:41 AM,11.6 1322 | 11:19:42 AM,11.8 1323 | 11:19:42 AM,11.2 1324 | 11:19:42 AM,12 1325 | 11:19:42 AM,11.4 1326 | 11:19:42 AM,11.6 1327 | 11:19:42 AM,11.8 1328 | 11:19:42 AM,12.2 1329 | 11:19:42 AM,11.6 1330 | 11:19:42 AM,12.1 1331 | 11:19:42 AM,11.1 1332 | 11:19:43 AM,11.2 1333 | 11:19:43 AM,12.3 1334 | 11:19:43 AM,11.8 1335 | 11:19:43 AM,11.6 1336 | 11:19:43 AM,12.4 1337 | 11:19:43 AM,12.2 1338 | 11:19:43 AM,13 1339 | 11:19:43 AM,12.5 1340 | 11:19:43 AM,12.5 1341 | 11:19:43 AM,12.2 1342 | 11:19:44 AM,11.4 1343 | 11:19:44 AM,11.9 1344 | 11:19:44 AM,11.2 1345 | 11:19:44 AM,12.7 1346 | 11:19:44 AM,11.3 1347 | 11:19:44 AM,12.3 1348 | 11:19:44 AM,12.5 1349 | 11:19:44 AM,10.6 1350 | 11:19:44 AM,11.1 1351 | 11:19:44 AM,10.7 1352 | 11:19:45 AM,12.5 1353 | 11:19:45 AM,10.6 1354 | 11:19:45 AM,10.9 1355 | 11:19:45 AM,10.9 1356 | 11:19:45 AM,11.6 1357 | 11:19:45 AM,11.5 1358 | 11:19:45 AM,11.6 1359 | 11:19:45 AM,11 1360 | 11:19:45 AM,11.1 1361 | 11:19:45 AM,11.1 1362 | 11:19:46 AM,11 1363 | 11:19:46 AM,10.6 1364 | 11:19:46 AM,10.2 1365 | 11:19:46 AM,10.7 1366 | 11:19:46 AM,10.6 1367 | 11:19:46 AM,11.2 1368 | 11:19:46 AM,10.2 1369 | 11:19:46 AM,11.8 1370 | 11:19:46 AM,11.3 1371 | 11:19:46 AM,11.4 1372 | 11:19:47 AM,11.4 1373 | 11:19:47 AM,10.9 1374 | 11:19:47 AM,11.7 1375 | 11:19:47 AM,11.3 1376 | 11:19:47 AM,11.3 1377 | 11:19:47 AM,11.2 1378 | 11:19:47 AM,11 1379 | 11:19:47 AM,11.3 1380 | 11:19:47 AM,11.5 1381 | 11:19:47 AM,11.1 1382 | 11:19:48 AM,12 1383 | 11:19:48 AM,11.8 1384 | 11:19:48 AM,11.4 1385 | 11:19:48 AM,11.4 1386 | 11:19:48 AM,10.4 1387 | 11:19:48 AM,11 1388 | 11:19:48 AM,10.5 1389 | 11:19:48 AM,11.4 1390 | 11:19:48 AM,10.4 1391 | 11:19:48 AM,9.8 1392 | 11:19:49 AM,11.7 1393 | 11:19:49 AM,10.7 1394 | 11:19:49 AM,10.1 1395 | 11:19:49 AM,10.6 1396 | 11:19:49 AM,11.4 1397 | 11:19:49 AM,11.2 1398 | 11:19:49 AM,10.4 1399 | 11:19:49 AM,11 1400 | 11:19:49 AM,10.7 1401 | 11:19:49 AM,9.9 1402 | 11:19:50 AM,10.7 1403 | 11:19:50 AM,10.6 1404 | 11:19:50 AM,10 1405 | 11:19:50 AM,10.6 1406 | 11:19:50 AM,11.4 1407 | 11:19:50 AM,10.6 1408 | 11:19:50 AM,10.3 1409 | 11:19:50 AM,10.5 1410 | 11:19:50 AM,10.3 1411 | 11:19:50 AM,10.6 1412 | 11:19:51 AM,10.6 1413 | 11:19:51 AM,10.4 1414 | 11:19:51 AM,10.5 1415 | 11:19:51 AM,11.4 1416 | 11:19:51 AM,11.4 1417 | 11:19:51 AM,11.1 1418 | 11:19:51 AM,10.4 1419 | 11:19:51 AM,11.5 1420 | 11:19:51 AM,11 1421 | 11:19:51 AM,11.5 1422 | 11:19:52 AM,11.4 1423 | 11:19:52 AM,10.4 1424 | 11:19:52 AM,10.5 1425 | 11:19:52 AM,10.2 1426 | 11:19:52 AM,11.1 1427 | 11:19:52 AM,11 1428 | 11:19:52 AM,10.4 1429 | 11:19:52 AM,10.1 1430 | 11:19:52 AM,10 1431 | 11:19:52 AM,10.3 1432 | 11:19:53 AM,10.3 1433 | 11:19:53 AM,10 1434 | 11:19:53 AM,10.7 1435 | 11:19:53 AM,10.5 1436 | 11:19:53 AM,9.8 1437 | 11:19:53 AM,10.5 1438 | 11:19:53 AM,9.8 1439 | 11:19:53 AM,10.3 1440 | 11:19:53 AM,10.2 1441 | 11:19:53 AM,9.8 1442 | 11:19:54 AM,9.8 1443 | 11:19:54 AM,10.2 1444 | 11:19:54 AM,9.8 1445 | 11:19:54 AM,9.9 1446 | 11:19:54 AM,9.9 1447 | 11:19:54 AM,9.4 1448 | 11:19:54 AM,10.3 1449 | 11:19:54 AM,10.2 1450 | 11:19:54 AM,9.7 1451 | 11:19:54 AM,9.8 1452 | 11:19:55 AM,9.7 1453 | 11:19:55 AM,10 1454 | 11:19:55 AM,9.4 1455 | 11:19:55 AM,10.2 1456 | 11:19:55 AM,9.8 1457 | 11:19:55 AM,10.6 1458 | 11:19:55 AM,10.6 1459 | 11:19:55 AM,10.7 1460 | 11:19:55 AM,10.7 1461 | 11:19:55 AM,11 1462 | 11:19:56 AM,10.7 1463 | 11:19:56 AM,10.9 1464 | 11:19:56 AM,10.6 1465 | 11:19:56 AM,10.2 1466 | 11:19:56 AM,9.7 1467 | 11:19:56 AM,10 1468 | 11:19:56 AM,10 1469 | 11:19:56 AM,9.8 1470 | 11:19:56 AM,9.8 1471 | 11:19:56 AM,9.9 1472 | 11:19:57 AM,10 1473 | 11:19:57 AM,9.5 1474 | 11:19:57 AM,9.5 1475 | 11:19:57 AM,9.8 1476 | 11:19:57 AM,9.8 1477 | 11:19:57 AM,9.5 1478 | 11:19:57 AM,9.6 1479 | 11:19:57 AM,9.3 1480 | 11:19:57 AM,8.7 1481 | 11:19:57 AM,8.9 1482 | 11:19:58 AM,9.6 1483 | 11:19:58 AM,9.9 1484 | 11:19:58 AM,9.1 1485 | 11:19:58 AM,9.6 1486 | 11:19:58 AM,9.4 1487 | 11:19:58 AM,10.6 1488 | 11:19:58 AM,9 1489 | 11:19:58 AM,9.6 1490 | 11:19:58 AM,9.6 1491 | 11:19:58 AM,9.4 1492 | 11:19:59 AM,9.3 1493 | 11:19:59 AM,9.5 1494 | 11:19:59 AM,9.7 1495 | 11:19:59 AM,8.9 1496 | 11:19:59 AM,10.6 1497 | 11:19:59 AM,9.7 1498 | 11:19:59 AM,9.8 1499 | 11:19:59 AM,10.4 1500 | 11:19:59 AM,10.2 1501 | 11:19:59 AM,10.2 1502 | 11:20:00 AM,10.6 1503 | 11:20:00 AM,10 1504 | 11:20:00 AM,10.3 1505 | 11:20:00 AM,10.4 1506 | 11:20:00 AM,10.3 1507 | 11:20:00 AM,8.9 1508 | 11:20:00 AM,9 1509 | 11:20:00 AM,9.8 1510 | 11:20:00 AM,10 1511 | 11:20:00 AM,9.1 1512 | 11:20:01 AM,9.6 1513 | 11:20:01 AM,8.6 1514 | 11:20:01 AM,8.9 1515 | 11:20:01 AM,8.8 1516 | 11:20:01 AM,8.9 1517 | 11:20:01 AM,10.2 1518 | 11:20:01 AM,9.7 1519 | 11:20:01 AM,8.9 1520 | 11:20:01 AM,8.5 1521 | 11:20:01 AM,8.8 1522 | 11:20:02 AM,9.2 1523 | 11:20:02 AM,9 1524 | 11:20:02 AM,8.9 1525 | 11:20:02 AM,9.1 1526 | 11:20:02 AM,8.5 1527 | 11:20:02 AM,9 1528 | 11:20:02 AM,9.5 1529 | 11:20:02 AM,9.7 1530 | 11:20:02 AM,9.4 1531 | 11:20:02 AM,9.3 1532 | 11:20:03 AM,9.7 1533 | 11:20:03 AM,8.1 1534 | 11:20:03 AM,9.2 1535 | 11:20:03 AM,9.3 1536 | 11:20:03 AM,9.5 1537 | 11:20:03 AM,9.5 1538 | 11:20:03 AM,9.4 1539 | 11:20:03 AM,8.5 1540 | 11:20:03 AM,9.8 1541 | 11:20:03 AM,10.1 1542 | 11:20:04 AM,10.3 1543 | 11:20:04 AM,10.2 1544 | 11:20:04 AM,9.2 1545 | 11:20:04 AM,10 1546 | 11:20:04 AM,9.7 1547 | 11:20:04 AM,9.8 1548 | 11:20:04 AM,9.7 1549 | 11:20:04 AM,8.9 1550 | 11:20:04 AM,8.9 1551 | 11:20:04 AM,9.5 1552 | 11:20:05 AM,8.9 1553 | 11:20:05 AM,9.7 1554 | 11:20:05 AM,9.8 1555 | 11:20:05 AM,8.9 1556 | 11:20:05 AM,8.5 1557 | 11:20:05 AM,8.9 1558 | 11:20:05 AM,9 1559 | 11:20:05 AM,9.1 1560 | 11:20:05 AM,8.6 1561 | 11:20:05 AM,8.7 1562 | 11:20:06 AM,9.2 1563 | 11:20:06 AM,8.1 1564 | 11:20:06 AM,9.6 1565 | 11:20:06 AM,9.3 1566 | 11:20:06 AM,8.9 1567 | 11:20:06 AM,8.8 1568 | 11:20:06 AM,7.9 1569 | 11:20:06 AM,9.4 1570 | 11:20:06 AM,8.2 1571 | 11:20:06 AM,8.9 1572 | 11:20:07 AM,9.8 1573 | 11:20:07 AM,8.3 1574 | 11:20:07 AM,8.8 1575 | 11:20:07 AM,8.9 1576 | 11:20:07 AM,8.5 1577 | 11:20:07 AM,8.6 1578 | 11:20:07 AM,9.4 1579 | 11:20:07 AM,8.8 1580 | 11:20:07 AM,8.7 1581 | 11:20:07 AM,8.5 1582 | 11:20:08 AM,8.1 1583 | 11:20:08 AM,8.1 1584 | 11:20:08 AM,9.7 1585 | 11:20:08 AM,9.4 1586 | 11:20:08 AM,8.8 1587 | 11:20:08 AM,9.2 1588 | 11:20:08 AM,9.3 1589 | 11:20:08 AM,8.9 1590 | 11:20:08 AM,9.6 1591 | 11:20:08 AM,8.5 1592 | 11:20:09 AM,8.6 1593 | 11:20:09 AM,9.5 1594 | 11:20:09 AM,8.9 1595 | 11:20:09 AM,8.1 1596 | 11:20:09 AM,8.1 1597 | 11:20:09 AM,8 1598 | 11:20:09 AM,7.9 1599 | 11:20:09 AM,9.3 1600 | 11:20:09 AM,7.8 1601 | 11:20:09 AM,8.3 1602 | 11:20:10 AM,8.1 1603 | 11:20:10 AM,8.9 1604 | 11:20:10 AM,7.4 1605 | 11:20:10 AM,8.1 1606 | 11:20:10 AM,8 1607 | 11:20:10 AM,8.1 1608 | 11:20:10 AM,8.4 1609 | 11:20:10 AM,8.6 1610 | 11:20:10 AM,8.1 1611 | 11:20:10 AM,8.2 1612 | 11:20:11 AM,8.1 1613 | 11:20:11 AM,8.9 1614 | 11:20:11 AM,8.1 1615 | 11:20:11 AM,8.4 1616 | 11:20:11 AM,8.4 1617 | 11:20:11 AM,7.3 1618 | 11:20:11 AM,8.5 1619 | 11:20:11 AM,7.7 1620 | 11:20:11 AM,8.5 1621 | 11:20:11 AM,8.5 1622 | 11:20:12 AM,9.7 1623 | 11:20:12 AM,9.3 1624 | 11:20:12 AM,9.3 1625 | 11:20:12 AM,8.3 1626 | 11:20:12 AM,8.4 1627 | 11:20:12 AM,8.7 1628 | 11:20:12 AM,9 1629 | 11:20:12 AM,8.5 1630 | 11:20:12 AM,8.7 1631 | 11:20:12 AM,8.7 1632 | 11:20:13 AM,8.5 1633 | 11:20:13 AM,8.7 1634 | 11:20:13 AM,7.6 1635 | 11:20:13 AM,7.7 1636 | 11:20:13 AM,8.4 1637 | 11:20:13 AM,8.1 1638 | 11:20:13 AM,8.1 1639 | 11:20:13 AM,8.1 1640 | 11:20:13 AM,7.8 1641 | 11:20:13 AM,8.1 1642 | 11:20:14 AM,8.3 1643 | 11:20:14 AM,7.6 1644 | 11:20:14 AM,8.5 1645 | 11:20:14 AM,7.7 1646 | 11:20:14 AM,8.1 1647 | 11:20:14 AM,7.7 1648 | 11:20:14 AM,7.4 1649 | 11:20:14 AM,7.8 1650 | 11:20:14 AM,7.7 1651 | 11:20:14 AM,7.7 1652 | 11:20:15 AM,7.9 1653 | 11:20:15 AM,8.3 1654 | 11:20:15 AM,8.4 1655 | 11:20:15 AM,8.5 1656 | 11:20:15 AM,8.4 1657 | 11:20:15 AM,8.4 1658 | 11:20:15 AM,8.5 1659 | 11:20:15 AM,7.3 1660 | 11:20:15 AM,8 1661 | 11:20:15 AM,7.7 1662 | 11:20:16 AM,8.3 1663 | 11:20:16 AM,8.7 1664 | 11:20:16 AM,8.6 1665 | 11:20:16 AM,7.7 1666 | 11:20:16 AM,8.9 1667 | 11:20:16 AM,8.5 1668 | 11:20:16 AM,8.1 1669 | 11:20:16 AM,8.8 1670 | 11:20:16 AM,8.5 1671 | 11:20:16 AM,8.9 1672 | 11:20:17 AM,8.4 1673 | 11:20:17 AM,8.9 1674 | 11:20:17 AM,8 1675 | 11:20:17 AM,7.4 1676 | 11:20:17 AM,7.4 1677 | 11:20:17 AM,7.6 1678 | 11:20:17 AM,7.4 1679 | 11:20:17 AM,7.9 1680 | 11:20:17 AM,8.1 1681 | 11:20:17 AM,7.7 1682 | 11:20:18 AM,7.7 1683 | 11:20:18 AM,7.9 1684 | 11:20:18 AM,7.8 1685 | 11:20:18 AM,7.4 1686 | 11:20:18 AM,8.6 1687 | 11:20:18 AM,7.4 1688 | 11:20:18 AM,8.4 1689 | 11:20:18 AM,7.8 1690 | 11:20:18 AM,7.7 1691 | 11:20:18 AM,7.6 1692 | 11:20:19 AM,6.9 1693 | 11:20:19 AM,7.7 1694 | 11:20:19 AM,7.7 1695 | 11:20:19 AM,7.3 1696 | 11:20:19 AM,7.6 1697 | 11:20:19 AM,6.6 1698 | 11:20:19 AM,7.8 1699 | 11:20:19 AM,8.1 1700 | 11:20:19 AM,7.2 1701 | 11:20:19 AM,7.7 1702 | 11:20:20 AM,7.6 1703 | 11:20:20 AM,8.3 1704 | 11:20:20 AM,8.2 1705 | 11:20:20 AM,8.8 1706 | 11:20:20 AM,8 1707 | 11:20:20 AM,8.5 1708 | 11:20:20 AM,8.1 1709 | 11:20:20 AM,8.7 1710 | 11:20:20 AM,8.5 1711 | 11:20:20 AM,8.1 1712 | 11:20:21 AM,8 1713 | 11:20:21 AM,7.3 1714 | 11:20:21 AM,8.2 1715 | 11:20:21 AM,7.3 1716 | 11:20:21 AM,7.9 1717 | 11:20:21 AM,7.7 1718 | 11:20:21 AM,7.6 1719 | 11:20:21 AM,7.1 1720 | 11:20:21 AM,7.3 1721 | 11:20:21 AM,7.5 1722 | 11:20:22 AM,7.3 1723 | 11:20:22 AM,7.3 1724 | 11:20:22 AM,6.4 1725 | 11:20:22 AM,7.7 1726 | 11:20:22 AM,7 1727 | 11:20:22 AM,7.4 1728 | 11:20:22 AM,7.7 1729 | 11:20:22 AM,8.3 1730 | 11:20:22 AM,7.3 1731 | 11:20:22 AM,7.3 1732 | 11:20:23 AM,7.3 1733 | 11:20:23 AM,7.2 1734 | 11:20:23 AM,6.8 1735 | 11:20:23 AM,7.3 1736 | 11:20:23 AM,8.8 1737 | 11:20:23 AM,7.8 1738 | 11:20:23 AM,7.3 1739 | 11:20:23 AM,6.9 1740 | 11:20:23 AM,6.6 1741 | 11:20:23 AM,7.6 1742 | 11:20:24 AM,7.1 1743 | 11:20:24 AM,7.4 1744 | 11:20:24 AM,8.4 1745 | 11:20:24 AM,8.2 1746 | 11:20:24 AM,7.8 1747 | 11:20:24 AM,8.1 1748 | 11:20:24 AM,7.8 1749 | 11:20:24 AM,7.7 1750 | 11:20:24 AM,7.8 1751 | 11:20:24 AM,7.3 1752 | 11:20:25 AM,8 1753 | 11:20:25 AM,7.3 1754 | 11:20:25 AM,7.7 1755 | 11:20:25 AM,7.3 1756 | 11:20:25 AM,7.5 1757 | 11:20:25 AM,7.6 1758 | 11:20:25 AM,7.5 1759 | 11:20:25 AM,6.7 1760 | 11:20:25 AM,7.8 1761 | 11:20:25 AM,6.9 1762 | 11:20:26 AM,6.9 1763 | 11:20:26 AM,6.9 1764 | 11:20:26 AM,8.4 1765 | 11:20:26 AM,7.1 1766 | 11:20:26 AM,7.7 1767 | 11:20:26 AM,7.5 1768 | 11:20:26 AM,6.6 1769 | 11:20:26 AM,7.6 1770 | 11:20:26 AM,7.3 1771 | 11:20:26 AM,7.2 1772 | 11:20:27 AM,6.7 1773 | 11:20:27 AM,7 1774 | 11:20:27 AM,6.9 1775 | 11:20:27 AM,7 1776 | 11:20:27 AM,6.6 1777 | 11:20:27 AM,7.2 1778 | 11:20:27 AM,6.6 1779 | 11:20:27 AM,6.8 1780 | 11:20:27 AM,7.8 1781 | 11:20:27 AM,7.5 1782 | 11:20:28 AM,7.6 1783 | 11:20:28 AM,6 1784 | 11:20:28 AM,8.1 1785 | 11:20:28 AM,6.8 1786 | 11:20:28 AM,8.1 1787 | 11:20:28 AM,7.4 1788 | 11:20:28 AM,7.7 1789 | 11:20:28 AM,8.4 1790 | 11:20:28 AM,7.6 1791 | 11:20:28 AM,7.7 1792 | 11:20:29 AM,7.8 1793 | 11:20:29 AM,8.2 1794 | 11:20:29 AM,7.7 1795 | 11:20:29 AM,7.4 1796 | 11:20:29 AM,7.4 1797 | 11:20:29 AM,7.3 1798 | 11:20:29 AM,7.3 1799 | 11:20:29 AM,7 1800 | 11:20:29 AM,7.5 1801 | 11:20:29 AM,6.4 1802 | 11:20:30 AM,6.8 1803 | 11:20:30 AM,7.5 1804 | 11:20:30 AM,8.2 1805 | 11:20:30 AM,6.2 1806 | 11:20:30 AM,6.4 1807 | 11:20:30 AM,6.4 1808 | 11:20:30 AM,7.4 1809 | 11:20:30 AM,7.1 1810 | 11:20:30 AM,6.9 1811 | 11:20:30 AM,6.4 1812 | 11:20:31 AM,6.4 1813 | 11:20:31 AM,7.3 1814 | 11:20:31 AM,7.3 1815 | 11:20:31 AM,6.7 1816 | 11:20:31 AM,6.1 1817 | 11:20:31 AM,7.2 1818 | 11:20:31 AM,6.4 1819 | 11:20:31 AM,7 1820 | 11:20:31 AM,6.7 1821 | 11:20:31 AM,6.4 1822 | 11:20:32 AM,7.1 1823 | 11:20:32 AM,6.9 1824 | 11:20:32 AM,7.4 1825 | 11:20:32 AM,7.3 1826 | 11:20:32 AM,7.1 1827 | 11:20:32 AM,7.9 1828 | 11:20:32 AM,6.9 1829 | 11:20:32 AM,8.2 1830 | 11:20:32 AM,6.6 1831 | 11:20:32 AM,7.7 1832 | 11:20:33 AM,7.7 1833 | 11:20:33 AM,7.2 1834 | 11:20:33 AM,7.8 1835 | 11:20:33 AM,7.1 1836 | 11:20:33 AM,6.6 1837 | 11:20:33 AM,7.2 1838 | 11:20:33 AM,8.1 1839 | 11:20:33 AM,6.8 1840 | 11:20:33 AM,6.1 1841 | 11:20:33 AM,7.1 1842 | 11:20:34 AM,6.5 1843 | 11:20:34 AM,6.6 1844 | 11:20:34 AM,5.7 1845 | 11:20:34 AM,7.3 1846 | 11:20:34 AM,5.9 1847 | 11:20:34 AM,6.6 1848 | 11:20:34 AM,6.7 1849 | 11:20:34 AM,6.4 1850 | 11:20:34 AM,7.2 1851 | 11:20:34 AM,6.8 1852 | 11:20:35 AM,6.7 1853 | 11:20:35 AM,6.5 1854 | 11:20:35 AM,6.8 1855 | 11:20:35 AM,7.2 1856 | 11:20:35 AM,6.3 1857 | 11:20:35 AM,6.4 1858 | 11:20:35 AM,7 1859 | 11:20:35 AM,6.7 1860 | 11:20:35 AM,6.7 1861 | 11:20:35 AM,6.6 1862 | 11:20:36 AM,7.4 1863 | 11:20:36 AM,6 1864 | 11:20:36 AM,6.7 1865 | 11:20:36 AM,6.9 1866 | 11:20:36 AM,7 1867 | 11:20:36 AM,6.6 1868 | 11:20:36 AM,7.2 1869 | 11:20:36 AM,6.9 1870 | 11:20:36 AM,7.6 1871 | 11:20:36 AM,7.4 1872 | 11:20:37 AM,6.6 1873 | 11:20:37 AM,7.7 1874 | 11:20:37 AM,7.3 1875 | 11:20:37 AM,7 1876 | 11:20:37 AM,6.9 1877 | 11:20:37 AM,6.3 1878 | 11:20:37 AM,6.8 1879 | 11:20:37 AM,6.9 1880 | 11:20:37 AM,6.4 1881 | 11:20:37 AM,7 1882 | 11:20:38 AM,7 1883 | 11:20:38 AM,6 1884 | 11:20:38 AM,6.4 1885 | 11:20:38 AM,6.4 1886 | 11:20:38 AM,5.6 1887 | 11:20:38 AM,5.9 1888 | 11:20:38 AM,6.9 1889 | 11:20:38 AM,5.9 1890 | 11:20:38 AM,6.4 1891 | 11:20:38 AM,6.2 1892 | 11:20:39 AM,5.2 1893 | 11:20:39 AM,6.8 1894 | 11:20:39 AM,6.8 1895 | 11:20:39 AM,6.7 1896 | 11:20:39 AM,6.9 1897 | 11:20:39 AM,6.1 1898 | 11:20:39 AM,6.1 1899 | 11:20:39 AM,6.8 1900 | 11:20:39 AM,5.4 1901 | 11:20:39 AM,6.7 1902 | 11:20:40 AM,6.2 1903 | 11:20:40 AM,5.8 1904 | 11:20:40 AM,6.6 1905 | 11:20:40 AM,6.7 1906 | 11:20:40 AM,6.8 1907 | 11:20:40 AM,6.8 1908 | 11:20:40 AM,6.3 1909 | 11:20:40 AM,7.1 1910 | 11:20:40 AM,7 1911 | 11:20:40 AM,7.3 1912 | 11:20:41 AM,7.3 1913 | 11:20:41 AM,7.2 1914 | 11:20:41 AM,6.6 1915 | 11:20:41 AM,6.5 1916 | 11:20:41 AM,6 1917 | 11:20:41 AM,5.6 1918 | 11:20:41 AM,6.9 1919 | 11:20:41 AM,6 1920 | 11:20:41 AM,6.4 1921 | 11:20:41 AM,6.9 1922 | 11:20:42 AM,6.4 1923 | 11:20:42 AM,6.4 1924 | 11:20:42 AM,5.7 1925 | 11:20:42 AM,5.1 1926 | 11:20:42 AM,6 1927 | 11:20:42 AM,5.8 1928 | 11:20:42 AM,6 1929 | 11:20:42 AM,6.3 1930 | 11:20:42 AM,6.6 1931 | 11:20:42 AM,5 1932 | 11:20:43 AM,6.4 1933 | 11:20:43 AM,5.2 1934 | 11:20:43 AM,6 1935 | 11:20:43 AM,6 1936 | 11:20:43 AM,6.9 1937 | 11:20:43 AM,6.9 1938 | 11:20:43 AM,6.5 1939 | 11:20:43 AM,6.4 1940 | 11:20:43 AM,6.1 1941 | 11:20:43 AM,5.4 1942 | 11:20:44 AM,6.3 1943 | 11:20:44 AM,6.4 1944 | 11:20:44 AM,6.8 1945 | 11:20:44 AM,5.2 1946 | 11:20:44 AM,6.2 1947 | 11:20:44 AM,6.3 1948 | 11:20:44 AM,6.1 1949 | 11:20:44 AM,5.6 1950 | 11:20:44 AM,6.4 1951 | 11:20:44 AM,6 1952 | 11:20:45 AM,6.8 1953 | 11:20:45 AM,6.9 1954 | 11:20:45 AM,6 1955 | 11:20:45 AM,5.8 1956 | 11:20:45 AM,6 1957 | 11:20:45 AM,6.8 1958 | 11:20:45 AM,6 1959 | 11:20:45 AM,5.8 1960 | 11:20:45 AM,5.6 1961 | 11:20:45 AM,6.1 1962 | 11:20:46 AM,5.7 1963 | 11:20:46 AM,5.6 1964 | 11:20:46 AM,6.1 1965 | 11:20:46 AM,5.9 1966 | 11:20:46 AM,6 1967 | 11:20:46 AM,5.8 1968 | 11:20:46 AM,5.4 1969 | 11:20:46 AM,5.9 1970 | 11:20:46 AM,5.6 1971 | 11:20:46 AM,6.2 1972 | 11:20:47 AM,5.4 1973 | 11:20:47 AM,6.6 1974 | 11:20:47 AM,5.3 1975 | 11:20:47 AM,5.2 1976 | 11:20:47 AM,8 1977 | 11:20:47 AM,6 1978 | 11:20:47 AM,5.7 1979 | 11:20:47 AM,5.6 1980 | 11:20:47 AM,5.6 1981 | 11:20:47 AM,5.6 1982 | 11:20:48 AM,5.4 1983 | 11:20:48 AM,6.6 1984 | 11:20:48 AM,5.9 1985 | 11:20:48 AM,5.5 1986 | 11:20:48 AM,5.3 1987 | 11:20:48 AM,5.4 1988 | 11:20:48 AM,6 1989 | 11:20:48 AM,5.6 1990 | 11:20:48 AM,5.9 1991 | 11:20:48 AM,6.4 1992 | 11:20:49 AM,5.6 1993 | 11:20:49 AM,6.7 1994 | 11:20:49 AM,5.8 1995 | 11:20:49 AM,5.5 1996 | 11:20:49 AM,6.1 1997 | 11:20:49 AM,5.4 1998 | 11:20:49 AM,5.7 1999 | 11:20:49 AM,6.2 2000 | 11:20:49 AM,5 2001 | 11:20:49 AM,6.2 2002 | 11:20:50 AM,6.1 2003 | 11:20:50 AM,6.2 2004 | 11:20:50 AM,5 2005 | 11:20:50 AM,6.4 2006 | 11:20:50 AM,5.2 2007 | 11:20:50 AM,5.5 2008 | 11:20:50 AM,5.6 2009 | 11:20:50 AM,5.6 2010 | 11:20:50 AM,5.3 2011 | 11:20:50 AM,5.9 2012 | 11:20:51 AM,6.3 2013 | 11:20:51 AM,5.9 2014 | 11:20:51 AM,6.2 2015 | 11:20:51 AM,5.2 2016 | 11:20:51 AM,5.1 2017 | 11:20:51 AM,6.4 2018 | 11:20:51 AM,5.1 2019 | 11:20:51 AM,5.3 2020 | 11:20:51 AM,4.9 2021 | 11:20:51 AM,5.3 2022 | 11:20:52 AM,6.1 2023 | 11:20:52 AM,5.6 2024 | 11:20:52 AM,5.6 2025 | 11:20:52 AM,6 2026 | 11:20:52 AM,5.2 2027 | 11:20:52 AM,5.2 2028 | 11:20:52 AM,6.9 2029 | 11:20:52 AM,6 2030 | 11:20:52 AM,6.1 2031 | 11:20:52 AM,5.3 2032 | 11:20:53 AM,5.6 2033 | 11:20:53 AM,6.3 2034 | 11:20:53 AM,6 2035 | 11:20:53 AM,6.3 2036 | 11:20:53 AM,5.5 2037 | 11:20:53 AM,6.4 2038 | 11:20:53 AM,5.6 2039 | 11:20:53 AM,6.5 2040 | 11:20:53 AM,5.6 2041 | 11:20:53 AM,5.2 2042 | 11:20:54 AM,5.9 2043 | 11:20:54 AM,5.7 2044 | 11:20:54 AM,5.6 2045 | 11:20:54 AM,5.9 2046 | 11:20:54 AM,5.6 2047 | 11:20:54 AM,6 2048 | 11:20:54 AM,5.8 2049 | 11:20:54 AM,5.2 2050 | 11:20:54 AM,5.1 2051 | 11:20:54 AM,5.2 2052 | 11:20:55 AM,5.4 2053 | 11:20:55 AM,5.3 2054 | 11:20:55 AM,5.2 2055 | 11:20:55 AM,5.6 2056 | 11:20:55 AM,5.2 2057 | 11:20:55 AM,5.4 2058 | 11:20:55 AM,5.3 2059 | 11:20:55 AM,5.6 2060 | 11:20:55 AM,4.4 2061 | 11:20:55 AM,5.6 2062 | 11:20:56 AM,5.5 2063 | 11:20:56 AM,6.2 2064 | 11:20:56 AM,5.5 2065 | 11:20:56 AM,5.7 2066 | 11:20:56 AM,6.4 2067 | 11:20:56 AM,5.3 2068 | 11:20:56 AM,5.2 2069 | 11:20:56 AM,5.2 2070 | 11:20:56 AM,5 2071 | 11:20:56 AM,5.8 2072 | 11:20:57 AM,6.4 2073 | 11:20:57 AM,6 2074 | 11:20:57 AM,5.4 2075 | 11:20:57 AM,5.7 2076 | 11:20:57 AM,5.6 2077 | 11:20:57 AM,6.2 2078 | 11:20:57 AM,6 2079 | 11:20:57 AM,5.6 2080 | 11:20:57 AM,6 2081 | 11:20:57 AM,6.4 2082 | 11:20:58 AM,5.3 2083 | 11:20:58 AM,5.4 2084 | 11:20:58 AM,5.5 2085 | 11:20:58 AM,4.8 2086 | 11:20:58 AM,5.7 2087 | 11:20:58 AM,6.3 2088 | 11:20:58 AM,5.8 2089 | 11:20:58 AM,5.6 2090 | 11:20:58 AM,7.1 2091 | 11:20:58 AM,4.2 2092 | 11:20:59 AM,5.6 2093 | 11:20:59 AM,5.2 2094 | 11:20:59 AM,5.7 2095 | 11:20:59 AM,5.2 2096 | 11:20:59 AM,5.2 2097 | 11:20:59 AM,5.6 2098 | 11:20:59 AM,5.2 2099 | 11:20:59 AM,5.6 2100 | 11:20:59 AM,4.9 2101 | 11:20:59 AM,5.6 2102 | 11:21:00 AM,5.2 2103 | 11:21:00 AM,4.7 2104 | 11:21:00 AM,4.8 2105 | 11:21:00 AM,4.4 2106 | 11:21:00 AM,4.9 2107 | 11:21:00 AM,5 2108 | 11:21:00 AM,5.4 2109 | 11:21:00 AM,5.5 2110 | 11:21:00 AM,5.1 2111 | 11:21:00 AM,5.1 2112 | 11:21:01 AM,5.4 2113 | 11:21:01 AM,5.2 2114 | 11:21:01 AM,5.4 2115 | 11:21:01 AM,5.3 2116 | 11:21:01 AM,6 2117 | 11:21:01 AM,6 2118 | 11:21:01 AM,5.2 2119 | 11:21:01 AM,5.9 2120 | 11:21:01 AM,6.2 2121 | 11:21:01 AM,5.5 2122 | 11:21:02 AM,5.6 2123 | 11:21:02 AM,5.2 2124 | 11:21:02 AM,5.5 2125 | 11:21:02 AM,4.5 2126 | 11:21:02 AM,4.9 2127 | 11:21:02 AM,4.6 2128 | 11:21:02 AM,5 2129 | 11:21:02 AM,4.5 2130 | 11:21:02 AM,4.8 2131 | 11:21:02 AM,5.6 2132 | 11:21:03 AM,4.8 2133 | 11:21:03 AM,5.1 2134 | 11:21:03 AM,5.5 2135 | 11:21:03 AM,4.6 2136 | 11:21:03 AM,4.7 2137 | 11:21:03 AM,5.2 2138 | 11:21:03 AM,5.2 2139 | 11:21:03 AM,6.3 2140 | 11:21:03 AM,6.1 2141 | 11:21:03 AM,4.7 2142 | 11:21:04 AM,4.5 2143 | 11:21:04 AM,4.4 2144 | 11:21:04 AM,5.3 2145 | 11:21:04 AM,4 2146 | 11:21:04 AM,4.9 2147 | 11:21:04 AM,5.4 2148 | 11:21:04 AM,5.1 2149 | 11:21:04 AM,5.1 2150 | 11:21:04 AM,5.2 2151 | 11:21:04 AM,5.6 2152 | 11:21:05 AM,6 2153 | 11:21:05 AM,5 2154 | 11:21:05 AM,5.4 2155 | 11:21:05 AM,4.7 2156 | 11:21:05 AM,5.6 2157 | 11:21:05 AM,5.5 2158 | 11:21:05 AM,5.6 2159 | 11:21:05 AM,5.6 2160 | 11:21:05 AM,6.1 2161 | 11:21:05 AM,5.3 2162 | 11:21:06 AM,4.8 2163 | 11:21:06 AM,5.6 2164 | 11:21:06 AM,5 2165 | 11:21:06 AM,4.9 2166 | 11:21:06 AM,4.7 2167 | 11:21:06 AM,6.1 2168 | 11:21:06 AM,5.3 2169 | 11:21:06 AM,5 2170 | 11:21:06 AM,5.6 2171 | 11:21:06 AM,5.4 2172 | 11:21:07 AM,5.2 2173 | 11:21:07 AM,4.4 2174 | 11:21:07 AM,4.7 2175 | 11:21:07 AM,5.8 2176 | 11:21:07 AM,4.9 2177 | 11:21:07 AM,5.3 2178 | 11:21:07 AM,5 2179 | 11:21:07 AM,4.5 2180 | 11:21:07 AM,4.3 2181 | 11:21:07 AM,4.8 2182 | 11:21:08 AM,4.2 2183 | 11:21:08 AM,4.8 2184 | 11:21:08 AM,4.5 2185 | 11:21:08 AM,4.4 2186 | 11:21:08 AM,4.2 2187 | 11:21:08 AM,5 2188 | 11:21:08 AM,4.6 2189 | 11:21:08 AM,5 2190 | 11:21:08 AM,4.6 2191 | 11:21:08 AM,4.7 2192 | 11:21:09 AM,4.4 2193 | 11:21:09 AM,5.4 2194 | 11:21:09 AM,4.6 2195 | 11:21:09 AM,5.3 2196 | 11:21:09 AM,4.9 2197 | 11:21:09 AM,5.6 2198 | 11:21:09 AM,5.5 2199 | 11:21:09 AM,5.4 2200 | 11:21:09 AM,6.1 2201 | 11:21:09 AM,4.8 2202 | 11:21:10 AM,5.3 2203 | 11:21:10 AM,4.5 2204 | 11:21:10 AM,5.3 2205 | 11:21:10 AM,5.2 2206 | 11:21:10 AM,4.7 2207 | 11:21:10 AM,5.2 2208 | 11:21:10 AM,5.3 2209 | 11:21:10 AM,5.2 2210 | 11:21:10 AM,5.4 2211 | 11:21:10 AM,5.2 2212 | 11:21:11 AM,3.9 2213 | 11:21:11 AM,5.2 2214 | 11:21:11 AM,4 2215 | 11:21:11 AM,4.1 2216 | 11:21:11 AM,4.5 2217 | 11:21:11 AM,4.6 2218 | 11:21:11 AM,4.5 2219 | 11:21:11 AM,3.5 2220 | 11:21:11 AM,4.1 2221 | 11:21:11 AM,4.1 2222 | 11:21:12 AM,4.4 2223 | 11:21:12 AM,5.2 2224 | 11:21:12 AM,4.6 2225 | 11:21:12 AM,5.1 2226 | 11:21:12 AM,4.3 2227 | 11:21:12 AM,5.3 2228 | 11:21:12 AM,4.6 2229 | 11:21:12 AM,4.8 2230 | 11:21:12 AM,2.9 2231 | 11:21:12 AM,4.7 2232 | 11:21:13 AM,4.8 2233 | 11:21:13 AM,5.2 2234 | 11:21:13 AM,5.2 2235 | 11:21:13 AM,4.4 2236 | 11:21:13 AM,5.1 2237 | 11:21:13 AM,5.4 2238 | 11:21:13 AM,5.1 2239 | 11:21:13 AM,5.5 2240 | 11:21:13 AM,5.2 2241 | 11:21:13 AM,5.2 2242 | 11:21:14 AM,4.5 2243 | 11:21:14 AM,5 2244 | 11:21:14 AM,4.6 2245 | 11:21:14 AM,5.8 2246 | 11:21:14 AM,5.2 2247 | 11:21:14 AM,5.3 2248 | 11:21:14 AM,6.2 2249 | 11:21:14 AM,4.5 2250 | 11:21:14 AM,4.8 2251 | 11:21:14 AM,4.3 2252 | 11:21:15 AM,3.7 2253 | 11:21:15 AM,4.4 2254 | 11:21:15 AM,4.3 2255 | 11:21:15 AM,4.7 2256 | 11:21:15 AM,4.8 2257 | 11:21:15 AM,5.2 2258 | 11:21:15 AM,4 2259 | 11:21:15 AM,4.6 2260 | 11:21:15 AM,4.8 2261 | 11:21:15 AM,4.5 2262 | 11:21:16 AM,4.9 2263 | 11:21:16 AM,3.6 2264 | 11:21:16 AM,4.2 2265 | 11:21:16 AM,4 2266 | 11:21:16 AM,3.6 2267 | 11:21:16 AM,4.7 2268 | 11:21:16 AM,4.8 2269 | 11:21:16 AM,4.3 2270 | 11:21:16 AM,4.4 2271 | 11:21:16 AM,4.4 2272 | 11:21:17 AM,4.3 2273 | 11:21:17 AM,4.3 2274 | 11:21:17 AM,4.7 2275 | 11:21:17 AM,4.7 2276 | 11:21:17 AM,5.3 2277 | 11:21:17 AM,4.5 2278 | 11:21:17 AM,5.4 2279 | 11:21:17 AM,4.8 2280 | 11:21:17 AM,5.2 2281 | 11:21:17 AM,4.8 2282 | 11:21:18 AM,4.9 2283 | 11:21:18 AM,5.2 2284 | 11:21:18 AM,5.2 2285 | 11:21:18 AM,4.8 2286 | 11:21:18 AM,4.8 2287 | 11:21:18 AM,4.3 2288 | 11:21:18 AM,4.2 2289 | 11:21:18 AM,4.7 2290 | 11:21:18 AM,4.4 2291 | 11:21:18 AM,4.3 2292 | 11:21:19 AM,4 2293 | 11:21:19 AM,4.8 2294 | 11:21:19 AM,4.4 2295 | 11:21:19 AM,3.4 2296 | 11:21:19 AM,4.9 2297 | 11:21:19 AM,4.4 2298 | 11:21:19 AM,4.7 2299 | 11:21:19 AM,4.8 2300 | 11:21:19 AM,5.2 2301 | 11:21:19 AM,4.5 2302 | 11:21:20 AM,4.1 2303 | 11:21:20 AM,3.5 2304 | 11:21:20 AM,4.9 2305 | 11:21:20 AM,4.1 2306 | 11:21:20 AM,4.4 2307 | 11:21:20 AM,4.2 2308 | 11:21:20 AM,3.9 2309 | 11:21:20 AM,4.2 2310 | 11:21:20 AM,3.5 2311 | 11:21:20 AM,3.5 2312 | 11:21:21 AM,3.9 2313 | 11:21:21 AM,3.7 2314 | 11:21:21 AM,5.2 2315 | 11:21:21 AM,4.1 2316 | 11:21:21 AM,4.3 2317 | 11:21:21 AM,5 2318 | 11:21:21 AM,4.2 2319 | 11:21:21 AM,4 2320 | 11:21:21 AM,4.9 2321 | 11:21:21 AM,4.7 2322 | 11:21:22 AM,5.4 2323 | 11:21:22 AM,5.3 2324 | 11:21:22 AM,5.1 2325 | 11:21:22 AM,4.5 2326 | 11:21:22 AM,4.5 2327 | 11:21:22 AM,4.7 2328 | 11:21:22 AM,4.1 2329 | 11:21:22 AM,4.5 2330 | 11:21:22 AM,4.2 2331 | 11:21:22 AM,4 2332 | 11:21:23 AM,4.3 2333 | 11:21:23 AM,4 2334 | 11:21:23 AM,3.8 2335 | 11:21:23 AM,4.5 2336 | 11:21:23 AM,4.1 2337 | 11:21:23 AM,3.7 2338 | 11:21:23 AM,3.9 2339 | 11:21:23 AM,4 2340 | 11:21:23 AM,4.1 2341 | 11:21:23 AM,3.9 2342 | 11:21:24 AM,4.2 2343 | 11:21:24 AM,3.6 2344 | 11:21:24 AM,4 2345 | 11:21:24 AM,3.5 2346 | 11:21:24 AM,3.9 2347 | 11:21:24 AM,4.8 2348 | 11:21:24 AM,4.4 2349 | 11:21:24 AM,4.6 2350 | 11:21:24 AM,4.4 2351 | 11:21:24 AM,3.9 2352 | 11:21:25 AM,4.4 2353 | 11:21:25 AM,4.6 2354 | 11:21:25 AM,4.6 2355 | 11:21:25 AM,4 2356 | 11:21:25 AM,4 2357 | 11:21:25 AM,4.8 2358 | 11:21:25 AM,4.1 2359 | 11:21:25 AM,4.8 2360 | 11:21:25 AM,3.9 2361 | 11:21:25 AM,4.4 2362 | 11:21:26 AM,4.6 2363 | 11:21:26 AM,5.3 2364 | 11:21:26 AM,4.4 2365 | 11:21:26 AM,4.5 2366 | 11:21:26 AM,4.7 2367 | 11:21:26 AM,3.9 2368 | 11:21:26 AM,4.4 2369 | 11:21:26 AM,4.8 2370 | 11:21:26 AM,4.3 2371 | 11:21:26 AM,3.9 2372 | 11:21:27 AM,3.6 2373 | 11:21:27 AM,3.6 2374 | 11:21:27 AM,4 2375 | 11:21:27 AM,3.9 2376 | 11:21:27 AM,3.3 2377 | 11:21:27 AM,3.9 2378 | 11:21:27 AM,4.5 2379 | 11:21:27 AM,3.9 2380 | 11:21:27 AM,4 2381 | 11:21:27 AM,4.5 2382 | 11:21:28 AM,3.5 2383 | 11:21:28 AM,4 2384 | 11:21:28 AM,4.5 2385 | 11:21:28 AM,3.9 2386 | 11:21:28 AM,4.3 2387 | 11:21:28 AM,4.1 2388 | 11:21:28 AM,3.9 2389 | 11:21:28 AM,5.5 2390 | 11:21:28 AM,3.7 2391 | 11:21:28 AM,3.9 2392 | 11:21:29 AM,3.5 2393 | 11:21:29 AM,3.6 2394 | 11:21:29 AM,4.1 2395 | 11:21:29 AM,4.1 2396 | 11:21:29 AM,4.4 2397 | 11:21:29 AM,4.7 2398 | 11:21:29 AM,4.1 2399 | 11:21:29 AM,4.9 2400 | 11:21:29 AM,4 2401 | 11:21:29 AM,3.8 2402 | 11:21:30 AM,4.3 2403 | 11:21:30 AM,4.8 2404 | 11:21:30 AM,5.2 2405 | 11:21:30 AM,5 2406 | 11:21:30 AM,4 2407 | 11:21:30 AM,4.1 2408 | 11:21:30 AM,4.7 2409 | 11:21:30 AM,5.1 2410 | 11:21:30 AM,4.6 2411 | 11:21:30 AM,3.9 2412 | 11:21:31 AM,3.4 2413 | 11:21:31 AM,4 2414 | 11:21:31 AM,3.3 2415 | 11:21:31 AM,3.8 2416 | 11:21:31 AM,3.7 2417 | 11:21:31 AM,4.2 2418 | 11:21:31 AM,3.9 2419 | 11:21:31 AM,4 2420 | 11:21:31 AM,3.1 2421 | 11:21:31 AM,4.1 2422 | 11:21:32 AM,4.4 2423 | 11:21:32 AM,3 2424 | 11:21:32 AM,4 2425 | 11:21:32 AM,3.7 2426 | 11:21:32 AM,3.9 2427 | 11:21:32 AM,4.2 2428 | 11:21:32 AM,3.9 2429 | 11:21:32 AM,4.4 2430 | 11:21:32 AM,3.6 2431 | 11:21:32 AM,4.7 2432 | 11:21:33 AM,4.2 2433 | 11:21:33 AM,4 2434 | 11:21:33 AM,4.1 2435 | 11:21:33 AM,3.5 2436 | 11:21:33 AM,4.4 2437 | 11:21:33 AM,3.5 2438 | 11:21:33 AM,3.8 2439 | 11:21:33 AM,4.6 2440 | 11:21:33 AM,4.4 2441 | 11:21:33 AM,4.2 2442 | 11:21:34 AM,3.1 2443 | 11:21:34 AM,3.8 2444 | 11:21:34 AM,5.1 2445 | 11:21:34 AM,4.4 2446 | 11:21:34 AM,4.3 2447 | 11:21:34 AM,4.7 2448 | 11:21:34 AM,4.3 2449 | 11:21:34 AM,4.4 2450 | 11:21:34 AM,4.4 2451 | 11:21:34 AM,4.4 2452 | 11:21:35 AM,4 2453 | 11:21:35 AM,2.7 2454 | 11:21:35 AM,4.6 2455 | 11:21:35 AM,4.8 2456 | 11:21:35 AM,3.5 2457 | 11:21:35 AM,4.2 2458 | 11:21:35 AM,3.2 2459 | 11:21:35 AM,3.7 2460 | 11:21:35 AM,3.8 2461 | 11:21:35 AM,3.5 2462 | 11:21:36 AM,3.4 2463 | 11:21:36 AM,3.9 2464 | 11:21:36 AM,3.4 2465 | 11:21:36 AM,4 2466 | 11:21:36 AM,4.1 2467 | 11:21:36 AM,3.5 2468 | 11:21:36 AM,3.5 2469 | 11:21:36 AM,3.1 2470 | 11:21:36 AM,3.9 2471 | -------------------------------------------------------------------------------- /Guides/python/assets/coolingExample.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/python/assets/coolingExample.xlsx -------------------------------------------------------------------------------- /Guides/python/assets/example.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rocketproplab/Guides/165f0ffc6ed2ea746de08941077e2c2e0c2af554/Guides/python/assets/example.xlsx -------------------------------------------------------------------------------- /Guides/python/csvToPandas.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Import csv To Pandas\n", 8 | "\n", 9 | "This file covers the process of importing excel files into a pandas dataframe.\n", 10 | "\n", 11 | "The function used is [read_csv](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html).\n", 12 | "\n", 13 | "### Step 1\n", 14 | "Lets start by importing pandas and os. We will be using pandas to create a dataframe from our data, and os to get file paths." 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": { 21 | "collapsed": true 22 | }, 23 | "outputs": [], 24 | "source": [ 25 | "import pandas as pd\n", 26 | "import os" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "### Step 2\n", 34 | "Now lets create a variable, filePath, that is a string containing the full path to the file we want to import. The code below looks in the current working directory for the file given a file name input by the user. This isn't necessary, and is just included for convienence. Alternatively, user can input a full path into the filePath variable." 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 5, 40 | "metadata": { 41 | "collapsed": false 42 | }, 43 | "outputs": [], 44 | "source": [ 45 | "cwd = os.getcwd()\n", 46 | "fileName = 'example.csv'\n", 47 | "filePath = os.path.join(cwd, fileName)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "### Step 3\n", 55 | "Great! Now lets read the data into a dataframe called df.\n", 56 | "This will allow our data to be accessible by the string in the header." 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 7, 62 | "metadata": { 63 | "collapsed": false 64 | }, 65 | "outputs": [ 66 | { 67 | "name": "stdout", 68 | "output_type": "stream", 69 | "text": [ 70 | " Time (s) - Dev1/ai0 Amplitude - Dev1/ai0\n", 71 | "0 0.000 -0.5\n", 72 | "1 0.002 -0.5\n", 73 | "2 0.004 -0.5\n", 74 | "3 0.006 -0.5\n", 75 | "4 0.008 -0.5\n" 76 | ] 77 | } 78 | ], 79 | "source": [ 80 | "df = pd.read_csv(filePath,header=0)\n", 81 | "print(df)" 82 | ] 83 | }, 84 | { 85 | "cell_type": "markdown", 86 | "metadata": {}, 87 | "source": [ 88 | "Our data is now accessible by a key value. The keys are the column headers in the dataframe. In this example case, those are 'Time (s) - Dev1/ai0' and 'Amplitude - Dev1/ai0'. For example, lets access the data in the first column." 89 | ] 90 | }, 91 | { 92 | "cell_type": "code", 93 | "execution_count": 8, 94 | "metadata": { 95 | "collapsed": false 96 | }, 97 | "outputs": [ 98 | { 99 | "data": { 100 | "text/plain": [ 101 | "0 0.000\n", 102 | "1 0.002\n", 103 | "2 0.004\n", 104 | "3 0.006\n", 105 | "4 0.008\n", 106 | "Name: Time (s) - Dev1/ai0, dtype: float64" 107 | ] 108 | }, 109 | "execution_count": 8, 110 | "metadata": {}, 111 | "output_type": "execute_result" 112 | } 113 | ], 114 | "source": [ 115 | "df['Time (s) - Dev1/ai0']" 116 | ] 117 | }, 118 | { 119 | "cell_type": "markdown", 120 | "metadata": {}, 121 | "source": [ 122 | "What would happen if we tried to access the data with an invalid key, say 1 for example? Lets try it to find out.\n", 123 | "\n", 124 | "Note: I enclose this code in a try: except: statement in order to prevent a huge error from being generated." 125 | ] 126 | }, 127 | { 128 | "cell_type": "code", 129 | "execution_count": 9, 130 | "metadata": { 131 | "collapsed": false 132 | }, 133 | "outputs": [ 134 | { 135 | "name": "stdout", 136 | "output_type": "stream", 137 | "text": [ 138 | "KeyError: 1 - not a valid key\n" 139 | ] 140 | } 141 | ], 142 | "source": [ 143 | "try:\n", 144 | " df[1]\n", 145 | "except KeyError:\n", 146 | " print(\"KeyError: 1 - not a valid key\")" 147 | ] 148 | }, 149 | { 150 | "cell_type": "markdown", 151 | "metadata": {}, 152 | "source": [ 153 | "So lets say you have a large dataframe with unknown columns. There is a simple way to index them without having prior knowledge of what the dataframe columns are. Namely, the columns method in pandas." 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 10, 159 | "metadata": { 160 | "collapsed": false 161 | }, 162 | "outputs": [ 163 | { 164 | "name": "stdout", 165 | "output_type": "stream", 166 | "text": [ 167 | "0 0.000\n", 168 | "1 0.002\n", 169 | "2 0.004\n", 170 | "3 0.006\n", 171 | "4 0.008\n", 172 | "Name: Time (s) - Dev1/ai0, dtype: float64\n", 173 | "0 -0.5\n", 174 | "1 -0.5\n", 175 | "2 -0.5\n", 176 | "3 -0.5\n", 177 | "4 -0.5\n", 178 | "Name: Amplitude - Dev1/ai0, dtype: float64\n" 179 | ] 180 | } 181 | ], 182 | "source": [ 183 | "cols = df.columns\n", 184 | "for col in cols:\n", 185 | " print(df[col])" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": null, 191 | "metadata": { 192 | "collapsed": true 193 | }, 194 | "outputs": [], 195 | "source": [] 196 | } 197 | ], 198 | "metadata": { 199 | "kernelspec": { 200 | "display_name": "Python 3", 201 | "language": "python", 202 | "name": "python3" 203 | }, 204 | "language_info": { 205 | "codemirror_mode": { 206 | "name": "ipython", 207 | "version": 3 208 | }, 209 | "file_extension": ".py", 210 | "mimetype": "text/x-python", 211 | "name": "python", 212 | "nbconvert_exporter": "python", 213 | "pygments_lexer": "ipython3", 214 | "version": "3.6.0" 215 | } 216 | }, 217 | "nbformat": 4, 218 | "nbformat_minor": 2 219 | } 220 | -------------------------------------------------------------------------------- /Guides/python/dataAnalysis.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": false 8 | }, 9 | "outputs": [ 10 | { 11 | "ename": "ModuleNotFoundError", 12 | "evalue": "No module named 'plotly'", 13 | "output_type": "error", 14 | "traceback": [ 15 | "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", 16 | "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", 17 | "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mplotly\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", 18 | "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'plotly'" 19 | ] 20 | } 21 | ], 22 | "source": [ 23 | "import numpy as np\n", 24 | "import plotly" 25 | ] 26 | }, 27 | { 28 | "cell_type": "code", 29 | "execution_count": null, 30 | "metadata": { 31 | "collapsed": true 32 | }, 33 | "outputs": [], 34 | "source": [] 35 | } 36 | ], 37 | "metadata": { 38 | "kernelspec": { 39 | "display_name": "Python 3", 40 | "language": "python", 41 | "name": "python3" 42 | }, 43 | "language_info": { 44 | "codemirror_mode": { 45 | "name": "ipython", 46 | "version": 3 47 | }, 48 | "file_extension": ".py", 49 | "mimetype": "text/x-python", 50 | "name": "python", 51 | "nbconvert_exporter": "python", 52 | "pygments_lexer": "ipython3", 53 | "version": "3.6.0" 54 | } 55 | }, 56 | "nbformat": 4, 57 | "nbformat_minor": 2 58 | } 59 | -------------------------------------------------------------------------------- /Guides/python/intro.md: -------------------------------------------------------------------------------- 1 | # Introduction to Python 2 | 3 | Python is an object oriented programming language with easy-to-read syntax. It has become considerably prevalent in industry and academia today due to it's great documentation, community support, and the plethora of open-source libraries that enhance it's capabilities. 4 | 5 | ## Installing Python 6 | Almost all of the python programs that we will be using for engineering purposes use some common libraries: numpy, scipy, matplotlib. 7 | The standard python installation doesn't come with these libraries. Therefore, I recommend installing python using the "anaconda" distribution. This distribution comes with a bunch of useful libraries. 8 | __Install the python 3 anaconda distribution [here](https://www.continuum.io/downloads)__ 9 | 10 | ### Python 3 or Python 2 11 | There are currently two major python versions which are in common use: python 3 and python 2. Code written for one version isn't necessarily compatible with the other. Therefore, RPL has decided to use python3 exclusively. 12 | 13 | ## Running Python 14 | __Note: This part of the tutorial assumes that you are familiar with the command line. If you are not yet comfortable entering commands, look at the command line tutorials [here](../acronyms.md)__ 15 | Python is a scriptable language, meaning that you can enter code into a python terminal and immediately get feedback without having to compile. While useful for quick development, this feature is limited. Programs are generally written in .py files. On Windows, Mac, and Linux machines with python installed, these can be run using the following commands: 16 | 17 | python fileName.py 18 | python3 fileName.py 19 | -------------------------------------------------------------------------------- /Guides/python/jupyternotebooks.md: -------------------------------------------------------------------------------- 1 | ## Jupyter Notebooks 2 | 3 | One of my favorite ways of programming and presenting results in python is through the use of Jupyter Notebooks. 4 | 5 | The "standard" form of output from python, command line output, is ugly, hard to read, and doesn't persist when the code is committed to github. Jupyter Notebooks allow output formatting, save output cells, works with pandoc to generate pdfs, and renders natively in github. Checkout some of our computations from the Launchy McLaunchface project [here](). 6 | 7 | ### Using Jupyter Notebooks 8 | Using Jupyter Notebooks is incredibly simple. The command jupyter notebook will start a local server which allows you to run, edit and save notebooks. Follow the steps below to start a jupyter notebook session. 9 | 10 | 1. __Step 1:__ 11 | __Note:__ Skip this step if you installed python using the anaconda distribution. 12 | 13 | First thing to do is to check to see if you have jupyter installed. 14 | -------------------------------------------------------------------------------- /Guides/python/plotly-basic-plotting.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import plotly.plotly as py\n", 12 | "import plotly.graph_objs as go\n", 13 | "import numpy as np\n", 14 | "import pandas as pd\n", 15 | "import os" 16 | ] 17 | }, 18 | { 19 | "cell_type": "markdown", 20 | "metadata": {}, 21 | "source": [ 22 | "# Plotly Basics of Plotting" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### Importing Data\n", 30 | "Let's start by importing our data using the methods described in the excelToPandas notebook." 31 | ] 32 | }, 33 | { 34 | "cell_type": "code", 35 | "execution_count": 8, 36 | "metadata": { 37 | "collapsed": false 38 | }, 39 | "outputs": [], 40 | "source": [ 41 | "dirPath = os.path.realpath('.')\n", 42 | "fileName = 'assets/coolingExample.xlsx'\n", 43 | "filePath = os.path.join(dirPath, fileName)\n", 44 | "df = pd.read_excel(filePath,header=0)\n", 45 | "cols = df.columns" 46 | ] 47 | }, 48 | { 49 | "cell_type": "markdown", 50 | "metadata": {}, 51 | "source": [ 52 | "### Creating the plot\n", 53 | "\n", 54 | "Plots in plotly are generated using the graph_objs object from the plotly library.\n", 55 | "\n", 56 | "Additionally, the layout is declared in a dictionary with parameters title, xaxis, and yaxis, where xaxis and yaxis also are declared as dictionaries with one entry, title " 57 | ] 58 | }, 59 | { 60 | "cell_type": "code", 61 | "execution_count": 7, 62 | "metadata": { 63 | "collapsed": false 64 | }, 65 | "outputs": [ 66 | { 67 | "data": { 68 | "text/html": [ 69 | "" 70 | ], 71 | "text/plain": [ 72 | "" 73 | ] 74 | }, 75 | "execution_count": 7, 76 | "metadata": {}, 77 | "output_type": "execute_result" 78 | } 79 | ], 80 | "source": [ 81 | "# Create a trace\n", 82 | "trace = go.Scatter(\n", 83 | " x = df[cols[0]],\n", 84 | " y = df[cols[1]]\n", 85 | ")\n", 86 | "\n", 87 | "data = [trace]\n", 88 | "\n", 89 | "# Edit the layout\n", 90 | "layout = dict(title='Temperature vs. Time',\n", 91 | " xaxis=dict(title='Time'),\n", 92 | " yaxis=dict(title='Temperature (C)'),\n", 93 | " )\n", 94 | "\n", 95 | "fig = dict(data=data, layout=layout)\n", 96 | "py.iplot(fig, filename='Thermal Data')" 97 | ] 98 | } 99 | ], 100 | "metadata": { 101 | "kernelspec": { 102 | "display_name": "Python 3", 103 | "language": "python", 104 | "name": "python3" 105 | }, 106 | "language_info": { 107 | "codemirror_mode": { 108 | "name": "ipython", 109 | "version": 3 110 | }, 111 | "file_extension": ".py", 112 | "mimetype": "text/x-python", 113 | "name": "python", 114 | "nbconvert_exporter": "python", 115 | "pygments_lexer": "ipython3", 116 | "version": "3.6.0" 117 | } 118 | }, 119 | "nbformat": 4, 120 | "nbformat_minor": 2 121 | } 122 | -------------------------------------------------------------------------------- /Guides/python/timing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Timing Functions in Python\n", 8 | "\n", 9 | "time library [link to docs](https://docs.python.org/2/library/time.html)
\n", 10 | "timeit library [link to docs](https://docs.python.org/2/library/timeit.html)
" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": { 17 | "collapsed": true 18 | }, 19 | "outputs": [], 20 | "source": [ 21 | "import time\n", 22 | "import timeit" 23 | ] 24 | }, 25 | { 26 | "cell_type": "markdown", 27 | "metadata": {}, 28 | "source": [ 29 | "### UTC and local time\n", 30 | "\n", 31 | "time has methods which return the UTC time and local time in a somewhat useless structure format.
\n", 32 | "time.gmtime() returns the structure with the current gm or UTC time.
\n", 33 | "time.localtime() returns a structure with the current local time
" 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 2, 39 | "metadata": { 40 | "collapsed": false 41 | }, 42 | "outputs": [ 43 | { 44 | "name": "stdout", 45 | "output_type": "stream", 46 | "text": [ 47 | "time.struct_time(tm_year=2017, tm_mon=4, tm_mday=23, tm_hour=2, tm_min=4, tm_sec=19, tm_wday=6, tm_yday=113, tm_isdst=0)\n" 48 | ] 49 | } 50 | ], 51 | "source": [ 52 | "currentTime = time.gmtime()\n", 53 | "print(currentTime)" 54 | ] 55 | }, 56 | { 57 | "cell_type": "markdown", 58 | "metadata": {}, 59 | "source": [ 60 | "As you can see, the returned values are not very interesting or useful themselves. Lets parse structure into more useful forms.
\n", 61 | "
\n", 62 | "First, lets parse it into a __human-readable form__. This is useful for printing the time to the console, but generally would be used with a secondary form that is easier for a computer to read." 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": { 69 | "collapsed": false 70 | }, 71 | "outputs": [ 72 | { 73 | "data": { 74 | "text/plain": [ 75 | "'Sun, 23 Apr 2017 02:04:19 +0000'" 76 | ] 77 | }, 78 | "execution_count": 3, 79 | "metadata": {}, 80 | "output_type": "execute_result" 81 | } 82 | ], 83 | "source": [ 84 | "time.strftime(\"%a, %d %b %Y %H:%M:%S +0000\", currentTime)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "Now lets parse it into a __computer-friendly form__. To start with, we should understand what type of structure currentTime is." 92 | ] 93 | }, 94 | { 95 | "cell_type": "code", 96 | "execution_count": 4, 97 | "metadata": { 98 | "collapsed": false 99 | }, 100 | "outputs": [ 101 | { 102 | "data": { 103 | "text/plain": [ 104 | "time.struct_time" 105 | ] 106 | }, 107 | "execution_count": 4, 108 | "metadata": {}, 109 | "output_type": "execute_result" 110 | } 111 | ], 112 | "source": [ 113 | "type(currentTime)" 114 | ] 115 | }, 116 | { 117 | "cell_type": "markdown", 118 | "metadata": {}, 119 | "source": [ 120 | "As we can see, currentTime is an instance of a class, struct_time as is defined in the time library." 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "The string that was returned when we ran print(currentTime) showed us the values associated with several of the class variables. We can access these class variables by using the dot \".\" notation." 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 5, 133 | "metadata": { 134 | "collapsed": false 135 | }, 136 | "outputs": [ 137 | { 138 | "data": { 139 | "text/plain": [ 140 | "2" 141 | ] 142 | }, 143 | "execution_count": 5, 144 | "metadata": {}, 145 | "output_type": "execute_result" 146 | } 147 | ], 148 | "source": [ 149 | "currentTime.tm_hour" 150 | ] 151 | }, 152 | { 153 | "cell_type": "markdown", 154 | "metadata": {}, 155 | "source": [ 156 | "With this knowledge, it becomes trivial to parse this data into a more usable format." 157 | ] 158 | }, 159 | { 160 | "cell_type": "code", 161 | "execution_count": 6, 162 | "metadata": { 163 | "collapsed": false 164 | }, 165 | "outputs": [], 166 | "source": [ 167 | "def parseTime(timeObj):\n", 168 | " '''parseTime:\n", 169 | " takes time.struct_time instances\n", 170 | " :return time displayed as string - year month day hour min sec'''\n", 171 | " return (str(timeObj.tm_year) + str(timeObj.tm_mon) + str(timeObj.tm_mday) +\n", 172 | " str(timeObj.tm_hour) + str(timeObj.tm_min) + str(timeObj.tm_sec))" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 7, 178 | "metadata": { 179 | "collapsed": false 180 | }, 181 | "outputs": [ 182 | { 183 | "data": { 184 | "text/plain": [ 185 | "'20174232419'" 186 | ] 187 | }, 188 | "execution_count": 7, 189 | "metadata": {}, 190 | "output_type": "execute_result" 191 | } 192 | ], 193 | "source": [ 194 | "parseTime(currentTime)" 195 | ] 196 | } 197 | ], 198 | "metadata": { 199 | "kernelspec": { 200 | "display_name": "Python 3", 201 | "language": "python", 202 | "name": "python3" 203 | }, 204 | "language_info": { 205 | "codemirror_mode": { 206 | "name": "ipython", 207 | "version": 3 208 | }, 209 | "file_extension": ".py", 210 | "mimetype": "text/x-python", 211 | "name": "python", 212 | "nbconvert_exporter": "python", 213 | "pygments_lexer": "ipython3", 214 | "version": "3.6.0" 215 | } 216 | }, 217 | "nbformat": 4, 218 | "nbformat_minor": 2 219 | } 220 | -------------------------------------------------------------------------------- /Guides/python/values.md: -------------------------------------------------------------------------------- 1 | ## Values in Python 2 | 3 | Values, such as 3.14, 'hello', 10, etc., are one of the basic elements that python manipulates in programs. 4 | 5 | In programming, it is significant to note how the program is storing these values. For example passing a large structure to a function is significantly more computationally expensive than passing a pointer. 6 | -------------------------------------------------------------------------------- /Guides/sensors/accelerometer.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Accelerometer Typical Calculations\n", 8 | "\n", 9 | "Herein lies a collection of typical calculations that are done with a 6-axis accelerometer.\n" 10 | ] 11 | } 12 | ], 13 | "metadata": { 14 | "kernelspec": { 15 | "display_name": "Python 3", 16 | "language": "python", 17 | "name": "python3" 18 | }, 19 | "language_info": { 20 | "codemirror_mode": { 21 | "name": "ipython", 22 | "version": 3 23 | }, 24 | "file_extension": ".py", 25 | "mimetype": "text/x-python", 26 | "name": "python", 27 | "nbconvert_exporter": "python", 28 | "pygments_lexer": "ipython3", 29 | "version": "3.6.0" 30 | } 31 | }, 32 | "nbformat": 4, 33 | "nbformat_minor": 2 34 | } 35 | -------------------------------------------------------------------------------- /Guides/sensors/load_cell.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [] 11 | } 12 | ], 13 | "metadata": { 14 | "kernelspec": { 15 | "display_name": "Python 3", 16 | "language": "python", 17 | "name": "python3" 18 | }, 19 | "language_info": { 20 | "codemirror_mode": { 21 | "name": "ipython", 22 | "version": 3 23 | }, 24 | "file_extension": ".py", 25 | "mimetype": "text/x-python", 26 | "name": "python", 27 | "nbconvert_exporter": "python", 28 | "pygments_lexer": "ipython3", 29 | "version": "3.6.0" 30 | } 31 | }, 32 | "nbformat": 4, 33 | "nbformat_minor": 2 34 | } 35 | -------------------------------------------------------------------------------- /Guides/stacksGuides/DMM_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "!pip3 install --user git+https://bitbucket.org/subinitial/subinitial.git" 12 | ] 13 | }, 14 | { 15 | "cell_type": "markdown", 16 | "metadata": {}, 17 | "source": [ 18 | "Digital Multimeter Example Code\n", 19 | "-----------------\n", 20 | "\n", 21 | "This is an example script showcasing some of the functionality of the Digital Multimeter(DMM).\n", 22 | "\n", 23 | "Connect your device to DMM channel 0.\n", 24 | "\n", 25 | "[DMM Software Documentation](http://subinitial.com/misc/doc/subinitial.analog.html#dmm)\n" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": null, 31 | "metadata": { 32 | "collapsed": true 33 | }, 34 | "outputs": [], 35 | "source": [ 36 | "import subinitial.stacks as stacks\n", 37 | "\n", 38 | "#connect to Stacks and analog deck\n", 39 | "core = stacks.Core(host=\"192.168.1.49\")\n", 40 | "analogdeck = stacks.AnalogDeck(core_deck=core, bus_address=2)\n", 41 | "\n", 42 | "#read voltage\n", 43 | "voltage = analogdeck.dmm.measure(channel=0)\n" 44 | ] 45 | } 46 | ], 47 | "metadata": { 48 | "kernelspec": { 49 | "display_name": "Python 3", 50 | "language": "python", 51 | "name": "python3" 52 | }, 53 | "language_info": { 54 | "codemirror_mode": { 55 | "name": "ipython", 56 | "version": 3 57 | }, 58 | "file_extension": ".py", 59 | "mimetype": "text/x-python", 60 | "name": "python", 61 | "nbconvert_exporter": "python", 62 | "pygments_lexer": "ipython3", 63 | "version": "3.6.1" 64 | } 65 | }, 66 | "nbformat": 4, 67 | "nbformat_minor": 2 68 | } 69 | -------------------------------------------------------------------------------- /Guides/stacksGuides/Source_Meter_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 2, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "Collecting git+https://bitbucket.org/subinitial/subinitial.git\n", 13 | " Cloning https://bitbucket.org/subinitial/subinitial.git to c:\\users\\patrick\\appdata\\local\\temp\\pip-03uzvla4-build\n", 14 | "Installing collected packages: subinitial.stacks\n", 15 | " Found existing installation: subinitial.stacks 1.13.0\n", 16 | " Uninstalling subinitial.stacks-1.13.0:\n", 17 | " Successfully uninstalled subinitial.stacks-1.13.0\n", 18 | " Running setup.py install for subinitial.stacks: started\n", 19 | " Running setup.py install for subinitial.stacks: finished with status 'done'\n", 20 | "Successfully installed subinitial.stacks-1.14.1\n" 21 | ] 22 | } 23 | ], 24 | "source": [ 25 | "!pip3 install --user git+https://bitbucket.org/subinitial/subinitial.git" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "Source Meter Usage and Examples\n", 33 | "================\n", 34 | "\n", 35 | "This is an example script showcasing all the functionality of the source meter.\n", 36 | "\n", 37 | "The source meter provides a constant positive voltage.\n", 38 | "To use, connect the Stacks to the analog deck, then connect your device to the source meter pin(pin 1), and the ground pin \n", 39 | "next to it. Then, connect your computer to the Stacks via the Ethernet cable.\n", 40 | "\n", 41 | "Make sure your device can handle two volts before running this.\n", 42 | "\n", 43 | "[Source Meter Documentation](http://subinitial.com/misc/doc/subinitial.analog.html#source-meter)" 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "execution_count": 3, 49 | "metadata": { 50 | "collapsed": true 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "import subinitial.stacks as stacks\n", 55 | "\n", 56 | "core = stacks.Core(host=\"192.168.1.49\") # Default host IP\n", 57 | "analogdeck = stacks.AnalogDeck(core, bus_address=2) # Default Analog Deck bus address\n", 58 | "\n", 59 | "\"\"\" BASIC USAGE \"\"\"\n", 60 | "\n", 61 | "analogdeck.sourcemeter.set_sourcevoltage(2) # Set the sourcemeter output voltage\n", 62 | "\n", 63 | "#Demo sourcemeter internal measurements\n", 64 | "print(\"This should show 2V: {0}\".format(analogdeck.sourcemeter.get_sourcevoltage()))\n", 65 | "print(\"Show the measured telemetry:\")\n", 66 | "print(\"Voltage (V): {0}\".format(analogdeck.sourcemeter.get_metervoltage()))\n", 67 | "print(\"Current (A): {0}\".format(analogdeck.sourcemeter.get_metercurrent()))\n", 68 | "\n", 69 | "print(\"Show the measured power:\")\n", 70 | "print(\"Power(W): {0}\".format(analogdeck.sourcemeter.get_meterpower()));" 71 | ] 72 | } 73 | ], 74 | "metadata": { 75 | "kernelspec": { 76 | "display_name": "Python 3", 77 | "language": "python", 78 | "name": "python3" 79 | }, 80 | "language_info": { 81 | "codemirror_mode": { 82 | "name": "ipython", 83 | "version": 3 84 | }, 85 | "file_extension": ".py", 86 | "mimetype": "text/x-python", 87 | "name": "python", 88 | "nbconvert_exporter": "python", 89 | "pygments_lexer": "ipython3", 90 | "version": "3.6.1" 91 | } 92 | }, 93 | "nbformat": 4, 94 | "nbformat_minor": 2 95 | } 96 | -------------------------------------------------------------------------------- /Guides/stacksGuides/Stacks_Getting_Started.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Stacks Getting Started\n", 8 | "============\n", 9 | "\n", 10 | "Welcome to the Subinitial Stacks Getting Started Guide!\n", 11 | "This document will guide you through setup of the Stacks and your first script.\n", 12 | "\n", 13 | "\n", 14 | "Useful Links\n", 15 | "-------------\n", 16 | "\n", 17 | "[Official Hardware Getting Started Guide](http://www.subinitial.com/misc/pub/SD00167_Stacks_Getting_Started_Guide.pdf)\n", 18 | "\n", 19 | "[Official Software Getting Started Guide](https://bitbucket.org/subinitial/subinitial/wiki/Getting_Started)\n", 20 | "\n", 21 | "[All Official Documentation](https://www.subinitial.com/documentation)\n", 22 | "\n", 23 | "[Subinitial Python Library Documentation](https://bitbucket.org/subinitial/subinitial/wiki/Home)\n", 24 | "\n", 25 | "Installing Python and Required Libraries\n", 26 | "------------------------------------------\n", 27 | "\n", 28 | "Python 3.5+ is required to use the Stacks. Install Python by following this link:\n", 29 | "\n", 30 | "[Python Download](https://www.python.org/downloads/)\n", 31 | "\n", 32 | "Install git if you haven't(it's a good idea!).\n", 33 | "\n", 34 | "[Git](http://git-scm.com/downloads)\n", 35 | "\n", 36 | "Then, install the Subinitial Python Library by running the following command in your command line:\n" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "metadata": { 43 | "collapsed": true 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "!pip3 install --user git+https://bitbucket.org/subinitial/subinitial.git" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "Run the following code to make sure the library installed correctly." 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 1, 60 | "metadata": {}, 61 | "outputs": [ 62 | { 63 | "name": "stdout", 64 | "output_type": "stream", 65 | "text": [ 66 | "Stacks Library Major Version: 1\n" 67 | ] 68 | } 69 | ], 70 | "source": [ 71 | "import subinitial.stacks as stacks\n", 72 | "print(\"Stacks Library Major Version:\", stacks.VERSION_STACKS[0])" 73 | ] 74 | }, 75 | { 76 | "cell_type": "markdown", 77 | "metadata": {}, 78 | "source": [ 79 | "You should see the following output:\n", 80 | " \n", 81 | " Stacks Library Major Version: 1\n", 82 | " \n", 83 | "Setting up your Stacks\n", 84 | "-----------------------\n", 85 | "\n", 86 | "For best results, use the Stacks with a laptop with a Wi-Fi connection.\n", 87 | "\n", 88 | "Connect an Ethernet cable from the Stacks to your computer. Verify that the second light from the top in the light bank\n", 89 | "is lit. \n", 90 | "* If this light is not lit, verify the connection.\n", 91 | "\n", 92 | "Open your terminal or command prompt, and type the following command:" 93 | ] 94 | }, 95 | { 96 | "cell_type": "code", 97 | "execution_count": 3, 98 | "metadata": {}, 99 | "outputs": [ 100 | { 101 | "name": "stdout", 102 | "output_type": "stream", 103 | "text": [ 104 | "\n", 105 | "Pinging 192.168.1.49 with 32 bytes of data:\n", 106 | "Request timed out.\n", 107 | "Request timed out.\n", 108 | "Request timed out.\n", 109 | "Request timed out.\n", 110 | "\n", 111 | "Ping statistics for 192.168.1.49:\n", 112 | " Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),\n" 113 | ] 114 | } 115 | ], 116 | "source": [ 117 | "!ping 192.168.1.49" 118 | ] 119 | }, 120 | { 121 | "cell_type": "markdown", 122 | "metadata": {}, 123 | "source": [ 124 | "If you are able to ping it successfully, great! The Stacks is now communicating with your computer. \n", 125 | "* If the ping failed, try assigning a static IP to your computer.\n", 126 | "* Assign IP: 192.168.1.40 and Subnet mask: 255.255.255.0\n", 127 | " + On Windows 10, right-click on the Wi-Fi icon, and click on Open Network and Sharing Center.\n", 128 | " + Click on Change adapter settings.\n", 129 | " + Right-click on your Ethernet connection(the one with a cable), and select Properties.\n", 130 | " + Select Internet Protocol Version 4(TCP/IPv4).\n", 131 | " + Click the Properties button.\n", 132 | " + When the window pops up, click on Use the following IP address, and enter the following information:\n", 133 | " - IP: 192.168.1.40\n", 134 | " - Subnet mast: 255.255.255.0\n", 135 | " \n", 136 | "Run the following script to verify that everything works:" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 1, 142 | "metadata": {}, 143 | "outputs": [ 144 | { 145 | "name": "stdout", 146 | "output_type": "stream", 147 | "text": [ 148 | ">id\n", 149 | "Core (cor1 SA13729)\n", 150 | "v1.13.0_2017-01-22_21:40:27\n", 151 | "Bus Address:1\n" 152 | ] 153 | } 154 | ], 155 | "source": [ 156 | "import subinitial.stacks1 as stacks\n", 157 | "core = stacks.Core(host=\"192.168.1.49\")\n", 158 | "core.print_console(\"id\")\n" 159 | ] 160 | }, 161 | { 162 | "cell_type": "markdown", 163 | "metadata": {}, 164 | "source": [ 165 | "The output from this script should read:\n", 166 | " >id\n", 167 | " Core (cor1 SA13729)\n", 168 | " v1.13.0_2017-01-22_21:40:27\n", 169 | " Bus Address:1\n" 170 | ] 171 | } 172 | ], 173 | "metadata": { 174 | "kernelspec": { 175 | "display_name": "Python 3", 176 | "language": "python", 177 | "name": "python3" 178 | }, 179 | "language_info": { 180 | "codemirror_mode": { 181 | "name": "ipython", 182 | "version": 3 183 | }, 184 | "file_extension": ".py", 185 | "mimetype": "text/x-python", 186 | "name": "python", 187 | "nbconvert_exporter": "python", 188 | "pygments_lexer": "ipython3", 189 | "version": "3.6.1" 190 | } 191 | }, 192 | "nbformat": 4, 193 | "nbformat_minor": 2 194 | } 195 | -------------------------------------------------------------------------------- /Guides/styleGuides/rpl_c_style_guide.md: -------------------------------------------------------------------------------- 1 | Rocket Propulsion Laboratory C Style Guide 2 | ========================================== 3 | 4 | *Written by Patrick Liu* 5 | 6 | *Last updated: April 30, 2017* 7 | 8 | All C code written for RPL purposes should follow the guidelines outlined 9 | in this document. 10 | 11 | File extensions 12 | --------------- 13 | 14 | * All C source files should have the file extension .c. 15 | Similarly, all C header files should have the file extension .h 16 | 17 | Good: foo.c, foo_header.h 18 | 19 | Bad: foo 20 | 21 | * All executable files should have the file extension .o, and 22 | should not be the default name(a.out) 23 | 24 | Good: foo.o 25 | 26 | Bad: foo 27 | 28 | 29 | Headers and Comments 30 | -------------------- 31 | 32 | * All files should have a file header, containing at least: 33 | + Name of the file 34 | + Date the file was last modified 35 | + Author(s) of the file 36 | + Team that the file is associated with 37 | + Short description of the file 38 | 39 | /* 40 | * Filename: example.c 41 | * Last Modified: April 30, 2017 42 | * Author: Patrick Liu 43 | * Team: Launchy McLaunchface/Avionics 44 | * Description: Example of a file header for a C source file 45 | */ 46 | 47 | * Complex blocks of code should have a comment 48 | + Function calls, loops, and if-statements should have a 49 | comment describing what they do 50 | + Assume the reader knows C, but doesn't know what your code does 51 | 52 | 53 | Good: 54 | //If the test succeeds, print a notification 55 | if(success){ 56 | printf("Yay"); 57 | } 58 | 59 | Bad: 60 | if(success){ 61 | printf("Yay"); 62 | } 63 | 64 | Bad: 65 | //if success evaluates to true, print "Yay" to the terminal 66 | if(success){ 67 | printf("Yay"); 68 | } 69 | 70 | Preprocessor Directives 71 | ----------------------- 72 | 73 | * Preprocessor directives should be at the top of the C source or header file, 74 | immediately below the file header 75 | 76 | * Preprocessor directives should be grouped by type, and different types 77 | of preprocessor directives should be separated by a blank line 78 | 79 | Good: 80 | #include 81 | #include 82 | 83 | #define FOO 10 84 | #define BAR 11 85 | 86 | Bad: 87 | #include 88 | #define FOO 10 89 | #include 90 | #define BAR 11 91 | 92 | Organization, Whitespace, and Indentation 93 | ----------------------------------------- 94 | 95 | * Nested blocks of code should be indented by two spaces per level of 96 | nesting 97 | + This means that your header, preprocessor directives, and outer 98 | functions should be left-justified, and each block of code inside 99 | curly braces should be indented by another four spaces 100 | + Do NOT use tabs unless your tab key is configured to enter spaces 101 | 102 | Good: 103 | #include 104 | 105 | main(){ 106 | int bar; 107 | bar = 10; 108 | if(bar == 100){ 109 | printf("Foo"); 110 | } 111 | 112 | } 113 | 114 | Bad: 115 | #include 116 | 117 | main(){ 118 | 119 | int bar; 120 | bar = 10; 121 | if(bar == 100){ 122 | printf("Foo"); } 123 | } 124 | 125 | * An opening curly brace should be placed immediately adjacent to 126 | the statement requiring it, and a closing curly brace should be 127 | by itself on a new line, with the same level of indentation as the 128 | original statement 129 | + Furthermore, the code inside that curly brace should start on the 130 | line immediately following the opening curly brace 131 | + Curly braces should always be used when they can, even if they are 132 | optional 133 | 134 | 135 | Good: 136 | if(1){ 137 | //something 138 | } 139 | 140 | Bad: 141 | if(1) 142 | { //something } 143 | 144 | * Each statement should be on its own line 145 | + This means that multiple variable declarations should not be used 146 | 147 | 148 | Good: 149 | int foo; 150 | int bar; 151 | 152 | Bad: 153 | int foo, bar; 154 | 155 | * Each line of code in a file should be a maximum of 80 characters long 156 | 157 | Variables 158 | -------- 159 | 160 | * Variable names should be descriptive 161 | + This means that single letter variable names should 162 | generally not be used 163 | + An exception to this rule is loop iteration variables named i and j, 164 | as those are generally expected practice, as well as fd for file 165 | descriptor 166 | 167 | Good: 168 | int foo_count; 169 | int bar_count; 170 | 171 | Bad: 172 | int x; 173 | int y; 174 | 175 | * Variable names should be lowercase, with words separated by underscores, 176 | and should not have leading or trailing underscores 177 | + Constants should be in ALL CAPS 178 | 179 | 180 | Good: 181 | #define FOO_CONSTANT 10 182 | 183 | int foo_count; 184 | int bar_count; 185 | 186 | Bad: 187 | #define foo_constant 10 188 | 189 | int foocount; 190 | int BarCount; 191 | 192 | Miscellaneous 193 | ------------- 194 | 195 | * Always close files explicitly when file operations are complete 196 | 197 | * Use stderr for error output or diagnostic output 198 | + This means using fprintf() 199 | 200 | 201 | -------------------------------------------------------------------------------- /Guides/styleGuides/rpl_python_style_guide.md: -------------------------------------------------------------------------------- 1 | Rocket Propulsion Laboratory Python Style Guide 2 | =============================================== 3 | 4 | *Author: Patrick Liu* 5 | 6 | *Last Modified: April 30, 2017* 7 | 8 | All Python code written for RPL purposes should follow 9 | the guidelines outlined in this document. 10 | 11 | All Python code written for RPL should be interpreted with Python 3.6+ 12 | For anything not covered in this guide, refer to the official Python style guide: 13 | 14 | [Official Python Style Guide](https://www.python.org/dev/peps/pep-0008) 15 | 16 | File Extensions and Naming 17 | --------------- 18 | 19 | * All Python source files should have the file extension .py 20 | * All Python sources files should be in all lowercase 21 | 22 | Headers and Comments 23 | -------------------- 24 | 25 | * At the top of every Python source file, there should be a docstring 26 | with a file header, containing: 27 | + Name of the file 28 | + Date the file was last modified 29 | + Author(s) of the file 30 | + Team that the file is associated with 31 | + Short description of the file 32 | 33 | 34 | """ 35 | Filename: example.py 36 | Last Modified: April 30, 2017 37 | Author: Patrick Liu 38 | Team: Launchy McLaunchface/Avionics 39 | Description: Example header for a Python source file 40 | """ 41 | * Complex blocks of code should have a comment 42 | + Function calls, loops, and if-statements should have a comment 43 | describing what they do 44 | + Assume the reader knows Python, but doesn't know what your code does 45 | 46 | Good: 47 | #if foo, inform user that foo happened 48 | if foo: 49 | print("Foo happened") 50 | 51 | Bad: 52 | #if foo 53 | if foo: 54 | #print "Foo happened" 55 | 56 | 57 | * Above each function, there should be a docstring with a function header, containing: 58 | + Name of the function 59 | + Description of the function 60 | + Parameters expected by the function 61 | + Expected return value 62 | 63 | 64 | """ 65 | Function name: foo 66 | Description: Example function header 67 | Parameters: None 68 | Return Value: none 69 | """ 70 | * Above a block of tests, there should be a docstring, containing the name of 71 | the module to be tested 72 | 73 | 74 | """ 75 | Module to be tested: foo 76 | """ 77 | 78 | * Above each test case, there should be a docstring, containing: 79 | + Input 80 | + Expected output 81 | 82 | 83 | """ 84 | Input: 5 85 | Expected output: true 86 | """ 87 | 88 | Namespaces 89 | ---------- 90 | 91 | *To learn more about namespaces in Python, visit 92 | [Namespace/Class Tutorial](https://docs.python.org/3/tutorial/classes.html) 93 | 94 | * When declaring and assigning variables in functions, avoid using the same 95 | name as another variable in the same scope. 96 | 97 | 98 | Good: 99 | scopes(): 100 | def do_bar(): 101 | bar = "bar" 102 | 103 | foo = "foo" 104 | do_bar() 105 | print(foo) 106 | 107 | Bad: 108 | scopes(): 109 | def do_bar(): 110 | foo = "bar" 111 | 112 | foo = "foo" 113 | do_bar() 114 | print(foo) 115 | 116 | * Do not declare global-scope variables 117 | 118 | Organization and Whitespace 119 | --------------------------- 120 | 121 | * To indent blocks of code, use four spaces 122 | + Do not use tabs, unless you configured your tab key to output spaces 123 | 124 | * Attempt to avoid parentheses, if possible 125 | + Python is designed to be as readable as possible, and avoiding 126 | parentheses vastly improves readability 127 | 128 | 129 | Good: 130 | if foo: 131 | #code 132 | 133 | Bad: 134 | if(foo): 135 | #code 136 | 137 | * Avoid numbers that aren't 0, 1, -1 in your code. Instead, define 138 | module-level constants to hold these values 139 | 140 | . 141 | Good: 142 | FOO_CONSTANT = 5 143 | 144 | foo = FOO_CONSTANT 145 | 146 | Bad: 147 | foo = 5 148 | 149 | * Lines of code should be at most 80 characters long 150 | 151 | Variables 152 | --------- 153 | 154 | * Variable names should be descriptive 155 | + This means, in general, that single letter variable names should not be used 156 | + Variables should be all lowercase, with words connected by spaces 157 | + Variable names should not include leading or trailing underscores 158 | 159 | 160 | Good: 161 | foo_counter = 1 162 | bar_counter = 2 163 | 164 | Bad: 165 | x = 1 166 | fooCounter = 1 167 | Bar_Counter = 1 168 | _foobar_ = 1 169 | 170 | * Module-level constants should be in ALL_CAPS, separated by spaces 171 | 172 | 173 | Good: 174 | FOO_CONSTANT = 5 175 | 176 | Bad: 177 | fooConstant = 5 178 | 179 | Strings 180 | ------- 181 | 182 | * When using string literals, wrap strings in double quotes 183 | + If you want a quotation mark to appear in the string, use the single 184 | quote 185 | + Use three double quote characters in a row to create a triple quoted string 186 | + More information on strings: 187 | [Strings in Python](https://docs.python.org/3/tutorial/introduction.html#strings) 188 | 189 | 190 | 191 | Good: 192 | print("foobar") 193 | 194 | Bad: 195 | print('foobar') 196 | 197 | Miscellaneous 198 | ------------ 199 | 200 | * Close files explicitly after file operations are complete 201 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Rocket Propulsion Laboratory 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Guides 2 | General body of knowledge for Rocket Propulsion Laboratory. 3 | 4 | ## Welcome to the Rocket Propulsion Laboratory! 5 | 6 | Use this guide to help you manage your way through your first few days on the team. 7 | 8 | ### Welcome Presentation 9 | [Here is the link](https://docs.google.com/presentation/d/179IhBbxB5hHLqUIPrMc4lzRnvwq8eTzQYkINsrbej8I/edit#slide=id.g1d5fcbfeb0_0_68) to the welcome presentation that you were shown at the beginning of your first day.
10 | Important points from the presentation, as well as links, are summarized below. 11 | 12 | ##### RPL Goals 13 | * Provide a stimulating and challenging environment 14 | * Develop strong engineering intuition 15 | * Create the best and most talented university team 16 | * Catalyze the development of clean energy 17 | * Accelerate growth of technology for Mars 18 | * Network with industry professionals 19 | 20 | ##### RPL Principles 21 | * Design from First Principles 22 | * Opensource 23 | * Integrity 24 | * Never oversell 25 | * Never take shortcuts 26 | * Safety 27 | * Trust and Respect 28 | * Community 29 | 30 | ### What to do Now? 31 | Well, you're here, so you must know about RPL's [Guides](https://github.com/rocketproplab). These are tutorials are continuously updated. They will cover a variety of topics relevant to the engineering and projects done in the Rocket Propulsion Laboratory. 32 | 33 | ### Tutorials and Guides 34 | Checkout the index for an _organized_ list of the guides and jupyter notebook tutorials. 35 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | # Index 2 | 3 | 1. [General Guides](/Guides/general/README.md) 4 | 5 | 1. [Experimental Techniques and Sensors](/Guides/experimentalTechniquesAndSensors/README.md) 6 | 1. [Python](/Guides/python/README.md) 7 | * [Intro to Python](/Guides/python/intro.md) 8 | * [Jupyter Notebooks](/Guides/python/jupyternotebooks.md) 9 | * [Importing Data with Pandas](/Guides/python/excelToPandas.ipynb) 10 | * [Plotting with Plotly](/Guides/python/plotly-basic-plotting.ipynb) 11 | * [Intro to Data Analysis](/Guides/python/dataAnalysis.ipynb) 12 | --------------------------------------------------------------------------------