Skip to content
Snippets Groups Projects
Commit 0093a285 authored by unknown's avatar unknown
Browse files

implemented class for the analyzer (works)

parent d94ff2da
No related branches found
No related tags found
No related merge requests found
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 5
}
'''
hp4155a instrument driver
TODO:
'''
import pyvisa
#import enum
# https://realpython.com/documenting-python-code/#commenting-vs-documenting-code
class HP_4155A(object):
def __init__(self, address):
"""
Parameters
----------
adress : str
Adress string of the GPIB interface "GPIB0::15::INSTR"
"""
self._address = address
self._rm = pyvisa.ResourceManager()
self._inst = self._rm.open_resource(address)
# Code to "setup" hp4155a to recieve commands from script
def __del__(self):
# Code to release hp4155a
self._rm.close()
# testing the code
if __name__ == '__main__':
import numpy
import time
instrument0 = HP_4155A("GPIB0::15::INSTR")
while True:
try:
pass
except:
del instrument0
# pyvisa-py will try to load the root-level gpib module, eg. from the linux-gpib project.
# To make pyvisa-py use gpib_ctypes.gpib instead, monkey patch it by calling gpib_ctypes.make_default_gpib().
from gpib_ctypes import make_default_gpib
make_default_gpib()
import pyvisa
import time
class HP_4155A(object):
class HP4155a(object):
#adress
def __init__(self,address):
self.address = address
def __init__(self,adress):
self.adress = adress
self.rm = pyvisa.ResourceManager()
self.inst = self.rm.open_resource(address)
self.inst = self.rm.open_resource(adress)
def idn(self):
return self.inst.query("*IDN?")
#delete instrument
def __del__(self):
self.rm.close()
#reset instrument
def reset(self):
self.inst.write("*RST")
#smu mode
def smu_mode(smu_number,mode):
command = f":PAGE:CHAN:SMU{smu_number}:MODE {mode}"
def smu_mode(self,smu_number,mode):
command = f":PAGE:STR:SMU{smu_number}:MODE {mode}"
self.inst.write(command)
#smu constant value for stress measurement
def smu_value(smu_number,value):
def smu_value(self,smu_number,value):
command =f":PAGE:STR:SET:CONS:SMU{smu_number} {value}"
self.inst.write(command)
#set the stess time in seconds
def stress_time(time):
def stress_time(self,time):
command = f":PAGE:STR:SET:DUR {time}"
self.inst.write(command)
return time
#start stress operation
def start_stress():
self.inst.write(":PAGE:SCON:STR [ :STAR]")
def start_stress(self):
#inst.write(":PAGE:SCONtrol:STRess[:STARt]")
self.inst.write(":PAGE:SCON:STR")
#inst.write("*TRG")
#self.inst.query('*OPC?')
#stop current operation
def stop_operation():
def stop_operation(self):
self.inst.write(":PAGE:SCONtrol:STOP")
#read values for a specific period of time
def read_values(zeit):
while(time.time()<=zeit):
print(self.inst.read())
inst = HP_4155A("GPIBO::17::INSTR")
#define smus to numbers in mode and values for stress
#get data from HP4155a
def get_data(self):
self.inst.write(":FORM REAL")
data = self.inst.query(":HCOPy:ITEM:ALL:DATA?")
return data
def sync(self,smu_number,s):
if s == 0:
mode = "NSYN"
else:
mode="SYNC"
command = f":PAGE:STR:SMU{smu_number}:FUNC {mode}"
self.inst.write(command)
#mode
inst.smu_mode(1,COMM)
inst.smu_mode(2,V)
inst.smu_mode(3,V)
inst.smu_mode(4,COMM)
def single_measurement(self):
self.inst.write(":PAGE:SCON:SING")
#values
inst.smu_value(2,10)
inst.smu_value(3,-3)
#go to stress page
def stress_page(self):
self.inst.write(":PAGE:STR")
#time
time = inst.stress_time(30);
def error(self):
return self.inst.query(":SYST:ERR?")
inst.start_stress()
inst.read_values(time)
inst.stop_operation
def operation_completed(self):
return self.inst.query('*OPC?')
pip install -U pyvisa
pip install gpib-ctypes
pip install -U pyvisa-py
def show_variables(self):
return self.inst.query(":DATA:CAT?")
\ No newline at end of file
{
"cells": [],
"metadata": {},
"nbformat": 4,
"nbformat_minor": 5
}
%% Cell type:code id:d48a45d4-fec7-47d2-ae53-001c372cf79c tags:
``` python
import pyvisa
class HP4155a(object):
def __init__(self,adress):
self.adress = adress
self.rm = pyvisa.ResourceManager()
self.inst = self.rm.open_resource(adress)
def idn(self):
return self.inst.query("*IDN?")
def __del__(self):
self.rm.close()
def reset(self):
self.inst.write("*RST")
#smu mode
def smu_mode(self,smu_number,mode):
command = f":PAGE:STR:SMU{smu_number}:MODE {mode}"
self.inst.write(command)
#smu constant value for stress measurement
def smu_value(self,smu_number,value):
command =f":PAGE:STR:SET:CONS:SMU{smu_number} {value}"
self.inst.write(command)
#set the stess time in seconds
def stress_time(time):
command = f":PAGE:STR:SET:DUR {time}"
self.inst.write(command)
return time
#start stress operation
def start_stress(self):
#inst.write(":PAGE:SCONtrol:STRess[:STARt]")
self.inst.write(":PAGE:SCON:STR")
#inst.write("*TRG")
self.inst.query('*OPC?')
#stop current operation
def stop_operation(self):
self.inst.write(":PAGE:SCONtrol:STOP")
#get data from HP4155a
def get_data(self):
self.inst.write(":FORM REAL")
data = self.inst.query(":HCOPy:ITEM:ALL:DATA?")
return data
def sync(self,smu_number,s):
if s == 0:
mode = "NSYN"
else:
mode="SYNC"
command = f":PAGE:STR:SMU{smu_number}:FUNC {mode}"
self.inst.write(command)
def single_measurement():
self.inst.write(":PAGE:SCON:SING")
```
%% Cell type:code id:e783c02a-14a6-4272-b716-e7b1d0fbaac2 tags:
``` python
```
File added
File added
'''
hp4155a instrument driver
TODO:
'''
import pyvisa
#import enum
# https://realpython.com/documenting-python-code/#commenting-vs-documenting-code
class HP_4155A(object):
def __init__(self, address):
"""
Parameters
----------
adress : str
Adress string of the GPIB interface "GPIB0::15::INSTR"
"""
self._address = address
self._rm = pyvisa.ResourceManager()
self._inst = self._rm.open_resource(address)
# Code to "setup" hp4155a to recieve commands from script
def __del__(self):
# Code to release hp4155a
self._rm.close()
# testing the code
if __name__ == '__main__':
import numpy
import time
instrument0 = HP_4155A("GPIB0::17::INSTR")
while True:
try:
pass
except:
del instrument0
# pyvisa-py will try to load the root-level gpib module, eg. from the linux-gpib project.
# To make pyvisa-py use gpib_ctypes.gpib instead, monkey patch it by calling gpib_ctypes.make_default_gpib().
from gpib_ctypes import make_default_gpib
make_default_gpib()
import pyvisa
import time
class HP_4155A(object):
class HP4155a(object):
#adress
def __init__(self,address):
self.address = address
def __init__(self,adress):
self.adress = adress
self.rm = pyvisa.ResourceManager()
self.inst = self.rm.open_resource(address)
self.inst = self.rm.open_resource(adress)
def idn(self):
return self.inst.query("*IDN?")
#delete instrument
def __del__(self):
self.rm.close()
#reset instrument
def reset(self):
self.inst.write("*RST")
#smu mode
def smu_mode(smu_number,mode):
command = f":PAGE:CHAN:SMU{smu_number}:MODE {mode}"
def smu_mode(self,smu_number,mode):
command = f":PAGE:STR:SMU{smu_number}:MODE {mode}"
self.inst.write(command)
#smu constant value for stress measurement
def smu_value(smu_number,value):
def smu_value(self,smu_number,value):
command =f":PAGE:STR:SET:CONS:SMU{smu_number} {value}"
self.inst.write(command)
#set the stess time in seconds
def stress_time(time):
def stress_time(self,time):
command = f":PAGE:STR:SET:DUR {time}"
self.inst.write(command)
return time
#start stress operation
def start_stress():
self.inst.write(":PAGE:SCON:STR [ :STAR]")
def start_stress(self):
#inst.write(":PAGE:SCONtrol:STRess[:STARt]")
self.inst.write(":PAGE:SCON:STR")
#inst.write("*TRG")
#self.inst.query('*OPC?')
#stop current operation
def stop_operation():
def stop_operation(self):
self.inst.write(":PAGE:SCONtrol:STOP")
#read values for a specific period of time
def read_values(zeit):
while(time.time()<=zeit):
print(self.inst.read())
inst = HP_4155A("GPIBO::17::INSTR")
#define smus to numbers in mode and values for stress
#get data from HP4155a
def get_data(self):
self.inst.write(":FORM REAL")
data = self.inst.query(":HCOPy:ITEM:ALL:DATA?")
return data
def sync(self,smu_number,s):
if s == 0:
mode = "NSYN"
else:
mode="SYNC"
command = f":PAGE:STR:SMU{smu_number}:FUNC {mode}"
self.inst.write(command)
#mode
inst.smu_mode(1,COMM)
inst.smu_mode(2,V)
inst.smu_mode(3,V)
inst.smu_mode(4,COMM)
def single_measurement(self):
self.inst.write(":PAGE:SCON:SING")
#values
inst.smu_value(2,10)
inst.smu_value(3,-3)
#go to stress page
def stress_page(self):
self.inst.write(":PAGE:STR")
#time
time = inst.stress_time(30);
def error(self):
return self.inst.query(":SYST:ERR?")
inst.start_stress()
inst.read_values(time)
inst.stop_operation
def operation_completed(self):
return self.inst.query('*OPC?')
pip install -U pyvisa
pip install gpib-ctypes
pip install -U pyvisa-py
def show_variables(self):
return self.inst.query(":DATA:CAT?")
\ No newline at end of file
......@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"execution_count": 22,
"id": "015ce75a-0995-4c6c-921b-b476ad157aea",
"metadata": {},
"outputs": [],
......@@ -13,7 +13,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 23,
"id": "3c91f786-a90a-44ba-9cf8-84038af4ffdd",
"metadata": {},
"outputs": [
......@@ -34,7 +34,7 @@
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": 24,
"id": "3f22a85f-7d92-4c7f-9d27-2929cedb71d2",
"metadata": {},
"outputs": [
......@@ -55,7 +55,7 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": 25,
"id": "22607f93-959b-45d7-90e4-c03d2f2eee5a",
"metadata": {},
"outputs": [],
......@@ -97,7 +97,7 @@
" #inst.write(\":PAGE:SCONtrol:STRess[:STARt]\")\n",
" inst.write(\":PAGE:SCON:STR\")\n",
" #inst.write(\"*TRG\")\n",
" #inst.query('*OPC?')\n",
" inst.query('*OPC?')\n",
" \n",
"#stop current operation\n",
"def stop_operation():\n",
......@@ -118,7 +118,11 @@
" else:\n",
" mode=\"SYNC\"\n",
" command = f\":PAGE:STR:SMU{smu_number}:FUNC {mode}\"\n",
" inst.write(command)"
" inst.write(command)\n",
"\n",
"def single_measurement():\n",
" global inst\n",
" inst.write(\":PAGE:SCON:SING\")"
]
},
{
......@@ -145,7 +149,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 27,
"id": "90aefcd7-1147-4ede-85a9-cfcb0a01708c",
"metadata": {},
"outputs": [],
......@@ -166,12 +170,12 @@
"smu_value(3,-3)\n",
"smu_value(4,2)\n",
"#time\n",
"time = stress_time(30)"
"zeit=stress_time(30)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 28,
"id": "8f907560-0765-4f09-8a3a-df29313ebcc4",
"metadata": {},
"outputs": [],
......@@ -181,17 +185,17 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 29,
"id": "1db862dd-d2d8-4739-a38a-3c0e7b26b0ae",
"metadata": {},
"outputs": [],
"source": [
"inst.read()"
"single_measurement()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 20,
"id": "111eccd6-de32-49bc-bc0e-94d42c99673e",
"metadata": {
"scrolled": true
......@@ -201,24 +205,6 @@
"name": "stdout",
"output_type": "stream",
"text": [
"#0\u0000\u001b&k12H\u001b&l8C\u001b&a4L\u001b&l2E\u001b&a0R*** HP 4155A SETUP DATA *** Oct 18 21:53:35 1994 PAGE 1\n",
"\n",
"\n",
"\n",
"\n",
"STRESS: STRESS FORCE\n",
"\n",
"*STRESS (DURATION)\n",
" 30.00 s \n",
"\n",
"*STATUS\n",
" 30.00 s 100.00 % \n",
"\n",
"*ACCUMULATED STRESS\n",
" 150.000000 s \n",
"\n",
"\f",
"\u001b9\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001b*rB\n",
"\n",
"\n",
"<class 'str'>\n"
......@@ -234,7 +220,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 9,
"id": "e3ad2eff-a891-4531-aef0-455272f26acf",
"metadata": {},
"outputs": [
......@@ -242,7 +228,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"q,k,e,@PGT,@PGD,@PG1W,@PG2W,@PG1DL,@PG2DL,@PG1B,@PG2B,@PG1LD,@PG2LD,@PG1TR,@PG2TR,@TIME,@INDEX,@MX,@MY,@MY1,@MY2,@MI,@CX,@CY,@CY1,@CY2,@L1X,@L1Y,@L1Y1,@L1Y2,@L2X,@L2Y,@L2Y1,@L2Y2,@L1G,@L1G1,@L1G2,@L2G,@L2G1,@L2G2,@IX,@IY,@IY1,@IY2,@L1CO,@L2CO,V1,V2,V3,V4,I1,I2,I3,I4,VSU1,VSU2,VMU1,VMU2\n",
"\n",
"\n",
"<class 'str'>\n"
]
......@@ -256,7 +242,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 10,
"id": "8dc30f9e-5fa6-4285-aae1-680795925a79",
"metadata": {},
"outputs": [],
......@@ -267,7 +253,7 @@
},
{
"cell_type": "code",
"execution_count": 23,
"execution_count": 21,
"id": "138c9d85-c285-4045-8f4f-8b947852f6e9",
"metadata": {},
"outputs": [
......@@ -288,28 +274,17 @@
},
{
"cell_type": "code",
"execution_count": 24,
"execution_count": null,
"id": "04806fd7-52e4-4620-a3b7-8f865c23a52b",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'+0,\"No error\"\\n'"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"inst.query(\":SYST:ERR?\") # find and remove error got error 144,350 and 420"
]
},
{
"cell_type": "code",
"execution_count": 29,
"execution_count": 9,
"id": "c128748e-4bef-464c-937f-4553d6163777",
"metadata": {},
"outputs": [],
......@@ -319,50 +294,48 @@
},
{
"cell_type": "code",
"execution_count": 21,
"execution_count": null,
"id": "6ac4499e-549c-48ee-ba8c-c5c37068ab16",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1\\n'"
"outputs": [],
"source": [
"inst.query('*OPC?')"
]
},
"execution_count": 21,
{
"cell_type": "code",
"execution_count": null,
"id": "acc545c8-c60a-4236-b43d-fb1576390028",
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"inst.query('*OPC?')"
"inst.write(\":PAGE:CHAN:UVAR\") #just check what user variables are"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "acc545c8-c60a-4236-b43d-fb1576390028",
"execution_count": 2,
"id": "6c64bdc5-301d-4707-8485-f3a8c7ad4ff1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"17"
"ename": "NameError",
"evalue": "name 'rm' is not defined",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[1;32mIn[2], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[43mrm\u001b[49m\u001b[38;5;241m.\u001b[39mclose()\n",
"\u001b[1;31mNameError\u001b[0m: name 'rm' is not defined"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"inst.write(\":PAGE:CHAN:UVAR\") #just check what user variables are"
]
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "6c64bdc5-301d-4707-8485-f3a8c7ad4ff1",
"id": "43c825db-3875-456d-bc5d-2b845117a30b",
"metadata": {},
"outputs": [],
"source": []
......
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "7eecf885-88d7-4f0f-b411-027ce49f23a0",
"metadata": {},
"outputs": [],
"source": [
"import module"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "56bb9baa-d632-4d36-b7b1-febca27e1498",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"HEWLETT-PACKARD,4155A,0,01.05:01.04:01.00\n",
"\n"
]
}
],
"source": [
"device = module.HP4155a('GPIB0::17::INSTR')\n",
"print(device.idn())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "bc87824b-1f72-4b94-b47e-653586ec0eed",
"metadata": {},
"outputs": [],
"source": [
"device.stress_page()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "501561e9-4ed2-4a7f-803a-46464cab8e88",
"metadata": {},
"outputs": [],
"source": [
"#define smus to numbers in mode and values for stress \n",
"\n",
"device.timeout=None\n",
"\n",
"#mode\n",
"device.smu_mode(1,'COMM')\n",
"device.smu_mode(2,'V')\n",
"device.smu_mode(3,'V')\n",
"device.smu_mode(4,'V')\n",
"device.sync(4,1)\n",
"\n",
"#values\n",
"device.smu_value(2,10)\n",
"device.smu_value(3,-3)\n",
"device.smu_value(4,2)\n",
"#time\n",
"zeit=device.stress_time(30)"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "821d6ea7-a787-4073-be12-38e5efa7b770",
"metadata": {},
"outputs": [],
"source": [
"device.start_stress()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "089694aa-7bde-402f-a5d6-c0d3ccb4a46b",
"metadata": {},
"outputs": [],
"source": [
"device.single_measurement()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "2de5dc2f-0535-4af4-8638-38defce600ac",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"#0\u0000\u001b&k12H\u001b&l8C\u001b&a4L\u001b&l2E\u001b&a0R*** HP 4155A SETUP DATA *** Oct 20 23:01:06 1994 PAGE 1\n",
"\n",
"\n",
"\n",
"\n",
"STRESS: STRESS FORCE\n",
"\n",
"*STRESS (DURATION)\n",
" 30.00 s \n",
"\n",
"*STATUS\n",
" 30.00 s 100.00 % \n",
"\n",
"*ACCUMULATED STRESS\n",
" 60.000000 s \n",
"\n",
"\f",
"\u001b9\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u001b*rB\n",
"\n",
"\n",
"<class 'str'>\n"
]
}
],
"source": [
"#add SCPI commands to get as much data as possible\n",
"data =device.get_data()\n",
"print(data)\n",
"print(type(data))"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "1d862bb0-a7c8-4e20-a5dc-c3f455c861cf",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"q,k,e,@PGT,@PGD,@PG1W,@PG2W,@PG1DL,@PG2DL,@PG1B,@PG2B,@PG1LD,@PG2LD,@PG1TR,@PG2TR,@TIME,@INDEX,@MX,@MY,@MY1,@MY2,@MI,@CX,@CY,@CY1,@CY2,@L1X,@L1Y,@L1Y1,@L1Y2,@L2X,@L2Y,@L2Y1,@L2Y2,@L1G,@L1G1,@L1G2,@L2G,@L2G1,@L2G2,@IX,@IY,@IY1,@IY2,@L1CO,@L2CO,V1,V2,V3,V4,I1,I2,I3,I4,VSU1,VSU2,VMU1,VMU2\n",
"\n",
"<class 'str'>\n"
]
}
],
"source": [
"data1 = device.show_variables()\n",
"print(data1)\n",
"print(type(data1))"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "826b6430-bcc6-40c4-b488-bd0a33ead35f",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"+0,\"No error\"\n",
"\n",
"1\n",
"\n"
]
}
],
"source": [
"print(device.error())\n",
"print(device.operation_completed())"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "82cca764-0108-44d3-8550-57d37c09c4e6",
"metadata": {},
"outputs": [],
"source": [
"device.reset()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "ee8845a4-14d7-4cef-b6e5-eaf72233a4e2",
"metadata": {},
"outputs": [],
"source": [
"del device"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment