AN_RB_PLI3.a5.ipynb 19.1 KB
Newer Older
1
2
3
4
5
6
7
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<h1><center>Analysis of a PLI3.a5 HWC in an RB Circuit</center></h1>\n",
8
    "<img src=\"https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png\" width=75%>\n",
9
10
11
    "\n",
    "PLI3.A2 is a simple current cycle at I_INTERM_2 during TIME_INTERM_2, while PLI3.A5 is a current cycle with 2 current levels (I_SM, I_INTERM_2) during TIME_INTERM_2 each. PLI3.A5 can be performed with calorimetric measurement (original purpose). In case of calorimetric measurement, the cryogenic cooling must be stable and maintained constant during the whole cycle. The aim of this test is to check the performance of the current leads and also the splices resistance, and, in case of calorimetric measurements, to detect abnormal heating in the magnets environment.\n",
    "\n",
12
    "<img src=\"https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/PLI3_current.png\" width=50%>\n",
13
14
15
16
17
    "\n",
    "The required analysis and signatures are listed below.\n",
    "\n",
    "|Responsible|Type of analysis|Criterion|\n",
    "|-----------|----------------|---------|\n",
18
19
20
    "|-|Automatic analysis on earth current and error current|I_EARTH_PLI2_S1 < I_EARTH_MAX and I_ERR_PLI2_S1 < I_ERR_MAX|\n",
    "|MP3|Splice signals|From board A and board B separately R_bus_max <3 nOhm. Individual R_splice_max<0.5nOhm R_mag<50 nOhm|\n",
    "|MP3|Current lead|46 < TT891A < 54K; Abs(U_RES)< 40mV; and no drift Abs(U_HTS) < 0.5mV|\n",
21
    "\n",
22
    "source: Powering Procedure and Acceptance Criteria for the 13 kA Dipole Circuits, MP3 Procedure, <a href=\"https://edms.cern.ch/document/874713\">https://edms.cern.ch/document/874713</a>"
23
24
25
26
27
28
29
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Analysis Assumptions\n",
30
31
    "- We consider standard analysis scenarios, i.e., all signals can be queried. If a signal is missing, an analysis can raise a warning and continue or an error and abort the analysis.\n",
    "- It is recommended to execute each cell one after another. However, since the signals are queried prior to analysis, any order of execution is allowed. In case an analysis cell is aborted, the following ones may not be executed (e.g. I\\_MEAS not present). \n",
32
33
    "\n",
    "# Plot Convention\n",
34
35
    "- Scales are labeled with signal name followed by a comma and a unit in square brackets, e.g., I_MEAS, [A].\n",
    "- If a reference signal is present, it is represented with a dashed line.\n",
36
    "- If the main current is present, its axis is on the left. Remaining signals are attached to the axis on the right. The legend of these signals is located on the lower left and upper right, respectively.\n",
37
38
39
    "- The grid comes from the left axis.\n",
    "- The title contains timestamp, circuit name, and signal name allowing to re-access the signal.\n",
    "- The plots assigned to the left scale have colors: blue (C0) and orange (C1). Plots presented on the right have colors red (C2) and green (C3).\n",
40
    "- Each plot has an individual time-synchronization mentioned explicitly in the description.\n",
41
    "- If an axis has a single signal, then the color of the label matches the signal's color. Otherwise, the label color is black."
42
43
44
45
46
47
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
48
    "# 0. Initialise Working Environment"
49
50
51
52
   ]
  },
  {
   "cell_type": "code",
53
   "execution_count": null,
54
55
56
   "metadata": {
    "scrolled": false
   },
57
   "outputs": [],
58
   "source": [
59
    "# External libraries\n",
60
61
    "print('Loading (1/11)'); import sys\n",
    "print('Loading (2/11)'); from IPython.display import display, Javascript, clear_output\n",
62
63
    "\n",
    "# Internal libraries\n",
64
65
66
67
68
69
70
71
72
    "print('Loading (3/11)'); import lhcsmapi\n",
    "print('Loading (4/11)'); from lhcsmapi.Time import Time\n",
    "print('Loading (5/11)'); from lhcsmapi.Timer import Timer\n",
    "print('Loading (6/11)'); from lhcsmapi.analysis.RbCircuitQuery import RbCircuitQuery\n",
    "print('Loading (7/11)'); from lhcsmapi.analysis.RbCircuitAnalysis import RbCircuitAnalysis\n",
    "print('Loading (8/11)'); from lhcsmapi.analysis.report_template import apply_report_template\n",
    "print('Loading (9/11)'); from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator\n",
    "print('Loading (10/11)'); from lhcsmapi.pyedsl.PlotBuilder import create_hwc_plot_title_with_circuit_name\n",
    "print('Loading (11/11)'); from lhcsmapi.analysis.expert_input import get_expert_decision\n",
73
74
75
    "\n",
    "clear_output()\n",
    "lhcsmapi.get_lhcsmapi_version()\n",
76
77
    "lhcsmapi.get_lhcsmhwc_version('../__init__.py')\n",
    "print('Analysis performed by %s' % HwcSearchModuleMediator.get_user())"
78
79
80
81
82
83
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
    "# 1. User Input\n",
    "1. Copy code from AccTesting and paste into an empty cell below\n",
    "<img src=\"https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/swan-manual-acctesting-integration.png\">\n",
    "\n",
    "    - If you only want to test the notebook only for the copy&paste feature (without opening the AccTesting), please copy and execute the code below\n",
    "    ```\n",
    "    hwc_test = 'PLI3.a5'\n",
    "    circuit_name = 'RB.A12'\n",
    "    campaign = 'HWC_2017'\n",
    "    t_start = '2017-04-22 08:57:30.399'\n",
    "    t_end = '2017-04-22 11:32:09.824'\n",
    "    ```\n",
    "\n",
    "2. To analyze a historical test with a browser GUI, copy and execute the following code in the cell below\n",
    "```\n",
    "circuit_type = 'RB'\n",
    "hwc_test = 'PLI3.a5'\n",
    "hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')\n",
    "```\n",
    "\n",
    "    - After opening the browser GUI, choose a circuit name in order to display HWC test with, campaign name as well as start and end time"
105
106
107
108
   ]
  },
  {
   "cell_type": "code",
109
   "execution_count": null,
110
   "metadata": {
111
    "deletable": false,
Michal Maciejewski's avatar
Michal Maciejewski committed
112
    "scrolled": false
113
   },
114
   "outputs": [],
115
   "source": []
116
117
118
119
120
121
122
123
124
125
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Query All Signals Prior to Analysis"
   ]
  },
  {
   "cell_type": "code",
126
   "execution_count": null,
127
   "metadata": {
128
    "scrolled": true,
129
130
131
132
    "tags": [
     "skip_output"
    ]
   },
133
   "outputs": [],
134
   "source": [
135
136
137
138
139
140
141
142
143
144
145
    "circuit_type = 'RB'\n",
    "if 'hwcb' in locals():\n",
    "    circuit_name = hwcb.get_circuit_name()\n",
    "    t_start = Time.to_unix_timestamp(hwcb.get_start_time())\n",
    "    t_end = Time.to_unix_timestamp(hwcb.get_end_time())\n",
    "    is_automatic = hwcb.is_automatic_mode()\n",
    "else:\n",
    "    t_start = Time.to_unix_timestamp(t_start)\n",
    "    t_end = Time.to_unix_timestamp(t_end)\n",
    "    is_automatic = False\n",
    "\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
146
    "rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=6)\n",
147
    "rb_analysis = RbCircuitAnalysis(circuit_type, None, is_automatic=is_automatic)\n",
148
149
    "\n",
    "with Timer():\n",
150
    "    # PC\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
151
    "    i_meas_nxcals_df = rb_query.query_signal_nxcals(t_start, t_end, t0=t_start, system='PC', signal_names='I_MEAS', spark=spark)[0]\n",
152
    "    i_meas_raw_nxcals_df = rb_query.query_raw_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
153
    "    plateau_start, plateau_end = rb_analysis.find_plateau_start_and_end(i_meas_raw_nxcals_df, i_meas_threshold=0, min_duration_in_sec=360, time_shift_in_sec=(240, 60))\n",
154
155
    "\n",
    "    # BUSBAR\n",
156
    "    u_res_feature_df, i_meas_feature_df = rb_query.get_busbar_resistances(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), plateau_start, plateau_end, signal_name='U_RES', spark=spark)\n",
157
    "    res_busbar_row_df = rb_analysis.calculate_resistance(i_meas_feature_df, u_res_feature_df, 'U_RES', Time.to_unix_timestamp(t_start), circuit_name)\n",
158
    "    res_busbar_df = rb_analysis.convert_to_col(res_busbar_row_df, signal_name='U_RES')\n",
159
    "    \n",
160
    "    # MAGNET\n",
161
    "    u_mag_feature_df, i_meas_feature_df = rb_query.get_busbar_resistances(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), plateau_start, plateau_end, signal_name='U_MAG', spark=spark)\n",
162
    "    res_magnet_row_df = rb_analysis.calculate_resistance(i_meas_feature_df, u_mag_feature_df, 'U_MAG', Time.to_unix_timestamp(t_start), circuit_name)\n",
163
    "    res_magnet_df = rb_analysis.convert_to_col(res_magnet_row_df, signal_name='U_MAG')\n",
164
    "    \n",
165
    "    # LEADS\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
166
167
    "    u_res_nxcals_dfs = rb_query.query_signal_nxcals(t_start, t_end, t0=t_start, system=['LEADS_EVEN', 'LEADS_ODD'], signal_names='U_RES', spark=spark)\n",
    "    u_hts_nxcals_dfs = rb_query.query_signal_nxcals(t_start, t_end, t0=t_start, system=['LEADS_EVEN', 'LEADS_ODD'], signal_names='U_HTS', spark=spark)\n",
168
    "\n",
169
170
171
    "    tt891a_nxcals_dfs = rb_query.query_dfb_signal_nxcals(t_start, t_end, system=['LEADS_EVEN_WINCCOA', 'LEADS_ODD_WINCCOA'], signal_names='TT891A', spark=spark)\n",
    "    tt893_nxcals_dfs = rb_query.query_dfb_signal_nxcals(t_start, t_end, system=['LEADS_EVEN_WINCCOA', 'LEADS_ODD_WINCCOA'], signal_names='TT893', spark=spark)\n",
    "    cv891_nxcals_dfs = rb_query.query_dfb_signal_nxcals(t_start, t_end, system=['LEADS_EVEN_WINCCOA', 'LEADS_ODD_WINCCOA'], signal_names='CV891', spark=spark)\n"
172
173
174
175
176
177
178
179
180
181
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Power Converter\n",
    "## 3.1. Plot of the Power Converter Main Current\n",
    "\n",
    "*ANALYSIS*:\n",
182
    "\n",
183
184
    "- Calculation of the duration of current plateaus\n",
    "\n",
185
186
    "*GRAPHS*:\n",
    "\n",
187
188
    "- t = 0 s corresponds to the start of the test\n",
    "- Orange box(es) represent period(s) of time with constant current used for calculation of busbar resistance and DFB thresholds"
189
190
191
192
   ]
  },
  {
   "cell_type": "code",
193
   "execution_count": null,
194
195
196
   "metadata": {
    "scrolled": false
   },
197
   "outputs": [],
198
   "source": [
199
200
201
202
203
204
    "import matplotlib as mpl\n",
    "mpl.rcParams['savefig.dpi'] = 80\n",
    "mpl.rcParams['figure.dpi'] = 80\n",
    "%matplotlib notebook\n",
    "title = '%s, %s: %s-%s' % (circuit_name, hwc_test, Time.to_string(t_start).split('.')[0], Time.to_string(t_end).split('.')[0])\n",
    "rb_analysis.plot_i_meas_with_current_plateau(i_meas_nxcals_df, t0=i_meas_raw_nxcals_df.index[0], plateau_start=plateau_start, plateau_end=plateau_end, title=title)"
205
206
207
208
209
210
211
212
213
214
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Busbar\n",
    "## 4.1. Busbar Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
215
    "\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
216
    "- Calculation of the busbar resistance as the slope of a linear fit of U,I curve obtained from the corresponding mean values of the voltage and current\n",
217
    "\n",
218
219
220
221
222
223
    "*CRITERIA*:\n",
    "\n",
    "- Check if the busbar resistance is below 3 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
224
    "- The busbar resistance, R\n",
225
    "- The green box denotes the validity region of the busbar resostance (0, 3] nOhm"
226
227
228
229
   ]
  },
  {
   "cell_type": "code",
230
   "execution_count": null,
231
   "metadata": {},
232
   "outputs": [],
233
   "source": [
234
    "res_busbar_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_busbar_df, signal_name='R_RES', value_max=3e-9)"
235
236
237
238
   ]
  },
  {
   "cell_type": "code",
239
   "execution_count": null,
240
241
242
243
244
   "metadata": {
    "editable": false
   },
   "outputs": [],
   "source": [
245
    "RbCircuitQuery.query_and_plot_outlier_voltage(res_busbar_outliers_df, t_start, t_end, i_meas_raw_nxcals_df.index[0], plateau_start, plateau_end, spark=spark)"
246
247
   ]
  },
248
249
250
251
252
253
254
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.2. Magnet Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
255
    "\n",
256
    "- Calculation of the magnet resistance as the slope of a linear fit of U,I curve obtained from the corresponding mean alues of the voltage and current\n",
257
258
    "\n",
    "*CRITERIA*\n",
259
    "\n",
260
261
262
263
264
    "- Check if the resistance is below 50 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
    "- The magnet resistance, R\n",
265
    "- The green box denotes the validity region of the magnet resistance (0, 50] nOhm\n"
266
267
268
269
   ]
  },
  {
   "cell_type": "code",
270
   "execution_count": null,
271
   "metadata": {},
272
   "outputs": [],
273
   "source": [
274
    "res_magnet_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_magnet_df, signal_name='R_MAG', value_max=50e-9)"
275
276
277
278
   ]
  },
  {
   "cell_type": "code",
279
   "execution_count": null,
280
   "metadata": {},
281
282
   "outputs": [],
   "source": [
283
    "RbCircuitQuery.query_and_plot_outlier_voltage(res_magnet_outliers_df.reset_index(), t_start, t_end, i_meas_raw_nxcals_df.index[0], plateau_start, plateau_end, spark=spark)"
284
285
   ]
  },
286
287
288
289
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
290
291
    "# 5. DFB\n",
    "## 5.1. DFB Voltage - U_RES\n",
292
    "\n",
293
294
    "*CRITERIA*:\n",
    "- Check if, at constant current, U_RES is constant (no drift < 2mV/h)\n",
295
    "\n",
296
    "*GRAPHS*:\n",
297
    "- t = 0 s corresponds to the start time of the test\n"
298
299
300
301
   ]
  },
  {
   "cell_type": "code",
302
   "execution_count": null,
303
304
305
306
   "metadata": {
    "deletable": false,
    "editable": false
   },
307
   "outputs": [],
308
   "source": [
309
    "RbCircuitAnalysis.assert_u_res_min_max_slope(u_res_nxcals_dfs, plateau_start, plateau_end, Time.to_unix_timestamp(t_start), slope_range=(-2, 2))"
310
311
312
313
314
315
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
316
    "## 5.2. DFB Voltage - U_HTS\n",
317
    "\n",
318
    "*CRITERIA*:  \n",
319
    "- Check if the voltage is below 50% of the threshold -> Abs(U_HTS) < 0.5 mV\n",
320
    "\n",
321
    "*GRAPHS*:\n",
322
    "- t = 0 s corresponds to the start time of the test"
323
324
325
326
   ]
  },
  {
   "cell_type": "code",
327
   "execution_count": null,
328
   "metadata": {
329
330
    "deletable": false,
    "editable": false,
331
332
    "scrolled": false
   },
333
   "outputs": [],
334
   "source": [
335
    "RbCircuitAnalysis.assert_u_hts_min_max_slope(u_hts_nxcals_dfs, plateau_start, plateau_end, Time.to_unix_timestamp(t_start), slope_range=(-0.5, 0.5))"
336
337
338
339
340
341
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
342
    "## 5.3. DFB Temperature - TT893.TEMPERATURECALC\n",
343
    "\n",
344
345
346
347
348
    "*CRITERIA*:\n",
    "\n",
    "- Check if the temperature is over the dew point, but not overheated -> 280 K < TT893 < 320 K, even without current\n",
    "\n",
    "*GRAPHS*:\n",
349
350
351
    "\n",
    "- Temperature at the top of the current lead on the right axis, TT893.TEMPERATURECALC\n",
    "- Green box denotes the temperature validity region [280, 320] K of the temperature at the top of the current lead\n",
352
    "- t = 0 s corresponds to the start time of the test"
353
354
355
356
   ]
  },
  {
   "cell_type": "code",
357
   "execution_count": null,
358
   "metadata": {
359
360
    "deletable": false,
    "editable": false,
361
362
    "scrolled": false
   },
363
   "outputs": [],
364
   "source": [
365
    "RbCircuitAnalysis.assert_tt893_min_max_value(tt893_nxcals_dfs, value_range=(280, 320))"
366
367
368
369
370
371
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
372
    "## 5.4. DFB Temperature - TT891A.TEMPERATURECALC\n",
373
    "\n",
374
375
376
377
378
    "*CRITERIA*:\n",
    "\n",
    "- Check if the temperature is regulated around 50 K -> 46 K < TT891A < 54 K, even without current\n",
    "\n",
    "*GRAPHS*:\n",
379
380
381
382
    "\n",
    "For odd and even leads\n",
    "- Main power converter current, I_MEAS\n",
    "- Temperature between the HTS and resistive part of the current lead on the right axis, TT891A.TEMPERATURECALC\n",
383
    "- t = 0 s corresponds to the start time of the test\n"
384
385
386
387
   ]
  },
  {
   "cell_type": "code",
388
   "execution_count": null,
389
   "metadata": {
390
391
    "deletable": false,
    "editable": false,
392
393
    "scrolled": false
   },
394
   "outputs": [],
395
   "source": [
396
    "RbCircuitAnalysis.assert_tt891a_min_max_value(tt891a_nxcals_dfs, value_range=(46, 54))"
397
398
399
400
401
402
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
403
    "## 5.5. DFB Valve Regulation - CV891.POSST\n",
404
    "\n",
405
406
407
408
409
410
    "*CRITERIA*:\n",
    "\n",
    "- Check if the valve is opened (>2%), but not fully (<50%)\n",
    "- Check if the valve variation (defined as difference between the maximum and minimum value) does not exceed 8% at constant current (the ramp of the current is excluded this criterion)\n",
    "\n",
    "*GRAPHS*:\n",
411
412
413
414
    "\n",
    "- Main power converter current, I_MEAS\n",
    "- Valve for regulation of TT891A, CV891.POSST\n",
    "- t = 0 s corresponds to the start time of the test\n",
415
    "- Green box denotes the valve opening validity region [2, 50] % of the TT891A temperature regulation"
416
417
418
419
   ]
  },
  {
   "cell_type": "code",
420
   "execution_count": null,
421
   "metadata": {
422
423
    "deletable": false,
    "editable": false,
424
425
    "scrolled": false
   },
426
   "outputs": [],
427
   "source": [
428
    "RbCircuitAnalysis.assert_cv891_min_max_value(cv891_nxcals_dfs, value_range=(2, 50))"
429
430
431
432
   ]
  },
  {
   "cell_type": "code",
433
   "execution_count": null,
434
435
436
437
   "metadata": {
    "deletable": false,
    "editable": false
   },
438
   "outputs": [],
439
   "source": [
440
    "RbCircuitAnalysis.assert_cv891_min_max_variation(cv891_nxcals_dfs, 8, plateau_start, plateau_end, Time.to_unix_timestamp(t_start))"
441
442
443
444
445
446
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
447
    "# 6. Signature Decision"
448
449
450
451
   ]
  },
  {
   "cell_type": "code",
452
   "execution_count": null,
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
   "metadata": {},
   "outputs": [],
   "source": [
    "signature = get_expert_decision('Expert Signature Decision: ', ['PASSED', 'FAILED'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 7. Final Report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
470
   "outputs": [],
471
   "source": [
472
    "analysis_start_time = Time.get_analysis_start_time()\n",
473
    "apply_report_template()\n",
474
475
476
    "file_name_html = '{}_{}-{}-{}_{}.html'.format(circuit_name, hwc_test, Time.to_datetime(t_start).strftime(\"%Y-%m-%d-%Hh%M\"), analysis_start_time, signature)\n",
    "full_path = '/eos/project/m/mp3/RB/{}/{}/{}'.format(circuit_name, hwc_test, file_name_html)\n",
    "!mkdir -p /eos/project/m/mp3/RB/$circuit_name/$hwc_test\n",
477
478
    "print('Compact notebook report saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n",
    "display(Javascript('IPython.notebook.save_notebook();'))\n",
479
    "Time.sleep(5)\n",
480
    "!{sys.executable} -m jupyter nbconvert --to html $'AN_RB_PLI3.a5.ipynb' --output /eos/project/m/mp3/RB/$circuit_name/$hwc_test/$file_name_html --TemplateExporter.exclude_input=True --TagRemovePreprocessor.remove_all_outputs_tags='[\"skip_output\"]'"
481
   ]
Michal Maciejewski's avatar
Michal Maciejewski committed
482
483
484
485
486
487
488
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  },
  "sparkconnect": {
   "bundled_options": [
    "SparkMetrics",
    "NXCALS"
   ],
Michal Maciejewski's avatar
Michal Maciejewski committed
514
   "list_of_options": []
515
516
517
518
519
520
521
522
523
524
525
526
527
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": false,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
528
529
530
531
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
Michal Maciejewski's avatar
Michal Maciejewski committed
532
}