{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import netCDF4 as nc\n", "import datetime as dt\n", "import subprocess\n", "import requests\n", "import matplotlib.pyplot as plt\n", "import cmocean\n", "import numpy as np\n", "import os\n", "import glob\n", "import dateutil as dutil\n", "from salishsea_tools import viz_tools\n", "import pickle\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "recalc=True #False" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "t0=dt.datetime(2014,12,1) # 1st start date of run\n", "if recalc:\n", " with nc.Dataset('/ocean/eolson/MEOPAR/NEMO-forcing/grid/mesh_mask201702_noLPE.nc') as fm:\n", " tmask=np.copy(fm.variables['tmask'])\n", " umask=np.copy(fm.variables['umask'])\n", " vmask=np.copy(fm.variables['vmask'])\n", " navlon=np.copy(fm.variables['nav_lon'])\n", " navlat=np.copy(fm.variables['nav_lat'])\n", " e3t_0=np.copy(fm.variables['e3t_0'])\n", " e3u_0=np.copy(fm.variables['e3u_0'])\n", " e3v_0=np.copy(fm.variables['e3v_0'])\n", " e1t=np.copy(fm.variables['e1t'])\n", " e2t=np.copy(fm.variables['e2t'])\n", " e1v=np.copy(fm.variables['e1v'])\n", " e2u=np.copy(fm.variables['e2u'])\n", " A=fm.variables['e1t'][0,:,:]*fm.variables['e2t'][0,:,:]*tmask[0,0,:,:]\n", "\n", "\n", " #te=dt.datetime(2016,12,1)# last start date of runfnum=18\n", " stm=np.shape(tmask)\n", " SiN=2.0\n", " #nlen=36*2\n", " nlen=100\n", " dlist=[t0+dt.timedelta(days=ii*10) for ii in range(0,nlen)]\n", "\n", " #sdir0='/results/SalishSea/nowcast-green/'\n", " sdir1='/results2/SalishSea/hindcast/'\n", " #sdir3='/data/eolson/MEOPAR/SS36runs/CedarRuns/spring2015_HCMZ/'\n", "\n", " tmaskC=np.copy(tmask)\n", " tmaskC[:,:,370:490,:12]=0\n", " tmaskC[:,:,887:,30:70]=0" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "ename": "IndexError", "evalue": "list index out of range", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 32\u001b[0m \u001b[0msffT\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0midir\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mcdir\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0miffT\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 33\u001b[0m \u001b[0msffP\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0midir\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mcdir\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0miffP\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 34\u001b[0;31m \u001b[0mf\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msffT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 35\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msffT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 36\u001b[0m \u001b[0mfP\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mDataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mglob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msffP\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: list index out of range" ] } ], "source": [ "if recalc:\n", " tlist=dlist\n", " SiGlobalTot=dict()\n", " SiTot=dict()\n", " BSiTot=dict()\n", " DiatTot=dict()\n", " changeSiGlobalTot=dict()\n", " for idir in (sdir1,):\n", " fformat1='%d%b%y/'\n", " if idir.startswith('/data/eolson/MEOPAR/SS36runs/CedarRuns/'):\n", " fformatT='SalishSea_1h_*_ptrc_T_%Y%m%d-*.nc'\n", " fformatP='SalishSea_1h_*_ptrc_T_%Y%m%d-*.nc'\n", " #elif idir==sdir0:\n", " # fformatT='SalishSea_1h_%Y%m%d_%Y%m%d_ptrc_T.nc'\n", " # fformatP='SalishSea_1h_%Y%m%d_%Y%m%d_grid_T.nc'\n", " elif idir==sdir1:\n", " fformatT='SalishSea_1h_%Y%m%d_%Y%m%d_ptrc_T.nc'\n", " fformatP='SalishSea_1h_%Y%m%d_%Y%m%d_carp_T.nc'\n", " sumSi=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumBSi=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumDiat=np.zeros((len(tlist),stm[2],stm[3]))\n", " ind=-1\n", " for idt0 in tlist:\n", " ind=ind+1\n", " cdir=idt0.strftime(fformat1).lower()\n", " iffT=idt0.strftime(fformatT)\n", " iffP=idt0.strftime(fformatP)\n", " if idir.startswith('/data/eolson/MEOPAR/SS36runs/CedarRuns/'):\n", " sffT=idir+iffT\n", " sffP=idir+iffP\n", " elif idir.startswith('/results/') or idir.startswith('/results2/'):\n", " sffT=idir+cdir+iffT\n", " sffP=idir+cdir+iffP\n", " f=nc.Dataset(glob.glob(sffT)[0])\n", " print(sffT)\n", " fP=nc.Dataset(glob.glob(sffP)[0])\n", " #if idir==sdir0:\n", " # e3t=np.expand_dims((1+fP.variables['sossheig'][0,:,:]/np.sum(e3t_0*tmask,1)),0)*e3t_0\n", " if idir==sdir1:\n", " e3t=fP.variables['e3t'][:2,:,:,:]\n", " Vol=A*e3t\n", " sumSi[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['silicon'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumBSi[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['biogenic_silicon'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumDiat[ind,:,:]=SiN*1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['diatoms'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " f.close()\n", " fP.close()\n", " SiGlobalTot[idir]=np.sum(np.sum(sumSi+sumBSi+sumDiat,2),1)\n", " SiTot[idir]=np.sum(np.sum(sumSi,2),1)\n", " BSiTot[idir]=np.sum(np.sum(sumBSi,2),1)\n", " DiatTot[idir]=np.sum(np.sum(sumDiat,2),1)\n", " changeSiGlobalTot[idir]=[SiGlobalTot[idir][ii+1]-SiGlobalTot[idir][ii] for ii in range(0,len(tlist)-1)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#test=np.sum(np.sum((sumSi[-1,:,:]+np.sum(1e-3*7*tmaskC[0,:,:,:]*Vol[0,:,:,:],0))+sumBSi[-1,:,:]+sumDiat[-1,:,:],1),0)\n", "#test2=np.sum(np.sum(sumSi[-1,:,:]+sumBSi[-1,:,:]+sumDiat[-1,:,:],1),0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "if recalc:\n", " fig,ax=plt.subplots(1,1,figsize=(6,5))\n", " ax.plot(SiGlobalTot[sdir1]-SiGlobalTot[sdir1][0],'b-')\n", " ax.set_xlabel('10-day intervals since '+t0.strftime('%b $d $Y'))\n", " ax.set_ylabel('Difference in Total Si')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# copy restart and add 7 to Si old and new" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## repeat for N" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "if recalc:\n", " tlist=dlist\n", " NGlobalTot=dict()\n", " VolTot=dict()\n", " NO3Tot=dict()\n", " NH4Tot=dict()\n", " PONTot=dict()\n", " DONTot=dict()\n", " DiatTot=dict()\n", " MyriTot=dict()\n", " NanoTot=dict()\n", " MiZoTot=dict()\n", " changeNGlobalTot=dict()\n", " for idir in (sdir1,):\n", " fformat1='%d%b%y/'\n", " if idir.startswith('/data/eolson/MEOPAR/SS36runs/CedarRuns/'):\n", " fformatT='SalishSea_1h_*_ptrc_T_%Y%m%d-*.nc'\n", " fformatP='SalishSea_1h_*_ptrc_T_%Y%m%d-*.nc'\n", " #elif idir==sdir0:\n", " # fformatT='SalishSea_1h_%Y%m%d_%Y%m%d_ptrc_T.nc'\n", " # fformatP='SalishSea_1h_%Y%m%d_%Y%m%d_grid_T.nc'\n", " elif idir==sdir1:\n", " fformatT='SalishSea_1h_%Y%m%d_%Y%m%d_ptrc_T.nc'\n", " fformatP='SalishSea_1h_%Y%m%d_%Y%m%d_carp_T.nc'\n", " sumNO3=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumVol=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumNH4=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumPON=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumDON=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumDiat=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumMyri=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumNano=np.zeros((len(tlist),stm[2],stm[3]))\n", " sumMiZo=np.zeros((len(tlist),stm[2],stm[3]))\n", " ind=-1\n", " for idt0 in tlist:\n", " ind=ind+1\n", " cdir=idt0.strftime(fformat1).lower()\n", " iffT=idt0.strftime(fformatT)\n", " iffP=idt0.strftime(fformatP)\n", " if idir.startswith('/data/eolson/MEOPAR/SS36runs/CedarRuns/'):\n", " sffT=idir+iffT\n", " sffP=idir+iffP\n", " elif idir.startswith('/results/') or idir.startswith('/results2/'):\n", " sffT=idir+cdir+iffT\n", " sffP=idir+cdir+iffP\n", " f=nc.Dataset(glob.glob(sffT)[0])\n", " print(sffT)\n", " fP=nc.Dataset(glob.glob(sffP)[0])\n", " #if idir==sdir0:\n", " # e3t=np.expand_dims((1+fP.variables['sossheig'][0,:,:]/np.sum(e3t_0*tmask,1)),0)*e3t_0\n", " if idir==sdir1:\n", " e3t=fP.variables['e3t'][:2,:,:,:]\n", " Vol=A*e3t\n", " sumVol[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumNO3[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['nitrate'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumNH4[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['ammonium'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumPON[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['particulate_organic_nitrogen'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumDON[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['dissolved_organic_nitrogen'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumDiat[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['diatoms'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumMyri[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['ciliates'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " sumMiZo[ind,:,:]=1e-3*np.sum(tmaskC[0,:,:,:]*Vol[0,:,:,:]*f.variables['microzooplankton'][0,:,:,:],0) #mmol/m3*m3*10^-3=mol\n", " f.close()\n", " fP.close()\n", " NGlobalTot[idir]=np.sum(np.sum(sumNO3+sumNH4+sumPON+sumDON+sumDiat+sumMyri+sumNano+sumMiZo,2),1)\n", " VolTot[idir]=np.sum(np.sum(sumVol,2),1)\n", " NO3Tot[idir]=np.sum(np.sum(sumNO3,2),1)\n", " NH4Tot[idir]=np.sum(np.sum(sumNH4,2),1)\n", " PONTot[idir]=np.sum(np.sum(sumPON,2),1)\n", " DONTot[idir]=np.sum(np.sum(sumDON,2),1)\n", " DiatTot[idir]=np.sum(np.sum(sumDiat,2),1)\n", " MyriTot[idir]=np.sum(np.sum(sumMyri,2),1)\n", " NanoTot[idir]=np.sum(np.sum(sumNano,2),1)\n", " MiZoTot[idir]=np.sum(np.sum(sumMiZo,2),1)\n", " changeNGlobalTot[idir]=[NGlobalTot[idir][ii+1]-NGlobalTot[idir][ii] for ii in range(0,len(tlist)-1)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "if recalc:\n", " #plt.plot(SiGlobalTot[sdir0]-SiGlobalTot[sdir0][0],'r-')\n", " #plt.plot(SiGlobalTot[sdir3]-SiGlobalTot[sdir3][0],'g-')\n", " #plt.plot(40,test-SiGlobalTot[sdir1][0],'r*')\n", " #plt.plot(40,test2-SiGlobalTot[sdir1][0],'k*')\n", " fig,ax=plt.subplots(1,1,figsize=(6,5))\n", " ax.plot(NGlobalTot[sdir1]-NGlobalTot[sdir1][0],'r-')\n", " ax.set_xlabel('10-day intervals since '+t0.strftime('%b $d $Y'))\n", " ax.set_ylabel('Difference in Total N')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "if recalc:\n", " plt.plot(SiGlobalTot[sdir1]-SiGlobalTot[sdir1][0],'b-')\n", " plt.plot(NGlobalTot[sdir1]-NGlobalTot[sdir1][0],'r-')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "if recalc:\n", " pickle.dump(SiGlobalTot[sdir1],open('SiGlobalTot_HC.pkl','wb'))\n", " pickle.dump(NGlobalTot[sdir1],open('NGlobalTot_HC.pkl','wb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "SiGlobalTotHC=pickle.load(open('SiGlobalTot_HC.pkl','rb'))\n", "NGlobalTotHC=pickle.load(open('NGlobalTot_HC.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#SiGlobalTotT3=pickle.load(open('SiGlobalTotT3.pkl','rb'))\n", "#NGlobalTotT3=pickle.load(open('NGlobalTotT3.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#SiGlobalTotZ1=pickle.load(open('SiGlobalTotZ1.pkl','rb'))\n", "#NGlobalTotZ1=pickle.load(open('NGlobalTotZ1.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#tit='spring2015_Z3'\n", "#SiGlobalTotZ3=pickle.load(open('SiGlobalTot_'+tit+'.pkl','rb'))\n", "#NGlobalTotZ3=pickle.load(open('NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "bdir='/data/eolson/MEOPAR/SS36runs/CedarRuns/'" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tit='spring15spun_Ztest'\n", "SiGlobalTotZtest=pickle.load(open(bdir+tit+'/SiGlobalTot_'+tit+'.pkl','rb'))\n", "NGlobalTotZtest=pickle.load(open(bdir+tit+'/NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tit='spring15spun_Z4'\n", "SiGlobalTotZ4=pickle.load(open(bdir+tit+'/SiGlobalTot_'+tit+'.pkl','rb'))\n", "NGlobalTotZ4=pickle.load(open(bdir+tit+'/NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tit='spring15spun_Z5'\n", "SiGlobalTotZ5=pickle.load(open(bdir+tit+'/SiGlobalTot_'+tit+'.pkl','rb'))\n", "NGlobalTotZ5=pickle.load(open(bdir+tit+'/NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tit='spring16spun_Z6'\n", "SiGlobalTotZ6=pickle.load(open(bdir+tit+'/SiGlobalTot_'+tit+'.pkl','rb'))\n", "NGlobalTotZ6=pickle.load(open(bdir+tit+'/NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "tit='spring16spun_Z7'\n", "SiGlobalTotZ7=pickle.load(open(bdir+tit+'/SiGlobalTot_'+tit+'.pkl','rb'))\n", "NGlobalTotZ7=pickle.load(open(bdir+tit+'/NGlobalTot_'+tit+'.pkl','rb'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "fig,ax=plt.subplots(1,1,figsize=(8,16))\n", "plt.plot([t0+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotHC))],SiGlobalTotHC,'y-')\n", "plt.plot([t0+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotHC))],NGlobalTotHC,'y-')\n", "plt.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ4))],SiGlobalTotZ4,'c--')\n", "plt.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ4))],NGlobalTotZ4,'c--')\n", "\n", "ax.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ5))],SiGlobalTotZ5,'m:')\n", "ax.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ5))],NGlobalTotZ5,'m:')\n", "ax.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZtest))],SiGlobalTotZtest,'b:')\n", "ax.plot([dt.datetime(2015,1,11)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZtest))],NGlobalTotZtest,'b:')\n", "\n", "ax.plot([dt.datetime(2016,1,6)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ6))],SiGlobalTotZ6,'r:')\n", "ax.plot([dt.datetime(2016,1,6)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ6))],NGlobalTotZ6,'r:')\n", "ax.plot([dt.datetime(2016,1,6)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ7))],SiGlobalTotZ7,'g:')\n", "ax.plot([dt.datetime(2016,1,6)+dt.timedelta(10*ii) for ii in range(0,len(SiGlobalTotZ7))],NGlobalTotZ7,'g:')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda env:python36]", "language": "python", "name": "conda-env-python36-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 1 }