AN_RB_PLI3.a5.ipynb 19.2 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
22
23
24
25
26
27
28
29
    "\n",
    "source: Powering Procedure and Acceptance Criteria for the 13 kA Dipole Circuits, MP3 Procedure, <a href=\"https://edms.cern.ch/document/874713/5.1\">https://edms.cern.ch/document/874713/5.1</a>"
   ]
  },
  {
   "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
76
    "\n",
    "analysis_start_time = Time.get_analysis_start_time()\n",
    "clear_output()\n",
    "lhcsmapi.get_lhcsmapi_version()\n",
77
78
    "lhcsmapi.get_lhcsmhwc_version('../__init__.py')\n",
    "print('Analysis performed by %s' % HwcSearchModuleMediator.get_user())"
79
80
81
82
83
84
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
    "# 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"
106
107
108
109
   ]
  },
  {
   "cell_type": "code",
110
   "execution_count": null,
111
   "metadata": {
112
    "deletable": false,
Michal Maciejewski's avatar
Michal Maciejewski committed
113
    "scrolled": false
114
   },
115
   "outputs": [],
116
   "source": []
117
118
119
120
121
122
123
124
125
126
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Query All Signals Prior to Analysis"
   ]
  },
  {
   "cell_type": "code",
127
   "execution_count": null,
128
   "metadata": {
129
    "scrolled": true,
130
131
132
133
    "tags": [
     "skip_output"
    ]
   },
134
   "outputs": [],
135
   "source": [
136
137
138
139
140
141
142
143
144
145
146
    "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
147
    "rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=6)\n",
148
    "rb_analysis = RbCircuitAnalysis(circuit_type, None, is_automatic=is_automatic)\n",
149
150
    "\n",
    "with Timer():\n",
151
    "    # PC\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
152
    "    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",
153
    "    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
154
    "    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",
155
156
    "\n",
    "    # BUSBAR\n",
157
    "    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",
158
    "    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",
159
    "    res_busbar_df = rb_analysis.convert_to_col(res_busbar_row_df, signal_name='U_RES')\n",
160
    "    \n",
161
    "    # MAGNET\n",
162
    "    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",
163
    "    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",
164
    "    res_magnet_df = rb_analysis.convert_to_col(res_magnet_row_df, signal_name='U_MAG')\n",
165
    "    \n",
166
    "    # LEADS\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
167
168
    "    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",
169
    "\n",
170
171
172
    "    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"
173
174
175
176
177
178
179
180
181
182
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Power Converter\n",
    "## 3.1. Plot of the Power Converter Main Current\n",
    "\n",
    "*ANALYSIS*:\n",
183
    "\n",
184
185
    "- Calculation of the duration of current plateaus\n",
    "\n",
186
187
    "*GRAPHS*:\n",
    "\n",
188
189
    "- 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"
190
191
192
193
   ]
  },
  {
   "cell_type": "code",
194
   "execution_count": null,
195
196
197
   "metadata": {
    "scrolled": false
   },
198
   "outputs": [],
199
   "source": [
200
201
202
203
204
205
    "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)"
206
207
208
209
210
211
212
213
214
215
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Busbar\n",
    "## 4.1. Busbar Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
216
    "\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
217
    "- 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",
218
    "\n",
219
220
221
222
223
224
    "*CRITERIA*:\n",
    "\n",
    "- Check if the busbar resistance is below 3 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
225
    "- The busbar resistance, R\n",
226
    "- The green box denotes the validity region of the busbar resostance (0, 3] nOhm"
227
228
229
230
   ]
  },
  {
   "cell_type": "code",
231
   "execution_count": null,
232
   "metadata": {},
233
   "outputs": [],
234
   "source": [
235
    "res_busbar_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_busbar_df, signal_name='R_RES', value_max=3e-9)"
236
237
238
239
   ]
  },
  {
   "cell_type": "code",
240
   "execution_count": null,
241
242
243
244
245
   "metadata": {
    "editable": false
   },
   "outputs": [],
   "source": [
246
    "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)"
247
248
   ]
  },
249
250
251
252
253
254
255
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.2. Magnet Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
256
    "\n",
257
    "- 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",
258
259
    "\n",
    "*CRITERIA*\n",
260
    "\n",
261
262
263
264
265
    "- Check if the resistance is below 50 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
    "- The magnet resistance, R\n",
266
    "- The green box denotes the validity region of the magnet resistance (0, 50] nOhm\n"
267
268
269
270
   ]
  },
  {
   "cell_type": "code",
271
   "execution_count": null,
272
   "metadata": {},
273
   "outputs": [],
274
   "source": [
275
    "res_magnet_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_magnet_df, signal_name='R_MAG', value_max=50e-9)"
276
277
278
279
   ]
  },
  {
   "cell_type": "code",
280
   "execution_count": null,
281
   "metadata": {},
282
283
   "outputs": [],
   "source": [
284
    "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)"
285
286
   ]
  },
287
288
289
290
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
291
292
    "# 5. DFB\n",
    "## 5.1. DFB Voltage - U_RES\n",
293
    "\n",
294
295
    "*CRITERIA*:\n",
    "- Check if, at constant current, U_RES is constant (no drift < 2mV/h)\n",
296
    "\n",
297
    "*GRAPHS*:\n",
298
    "- t = 0 s corresponds to the start time of the test\n"
299
300
301
302
   ]
  },
  {
   "cell_type": "code",
303
   "execution_count": null,
304
305
306
307
   "metadata": {
    "deletable": false,
    "editable": false
   },
308
   "outputs": [],
309
   "source": [
310
    "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))"
311
312
313
314
315
316
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
317
    "## 5.2. DFB Voltage - U_HTS\n",
318
    "\n",
319
    "*CRITERIA*:  \n",
320
    "- Check if the voltage is below 50% of the threshold -> Abs(U_HTS) < 0.5 mV\n",
321
    "\n",
322
    "*GRAPHS*:\n",
323
    "- t = 0 s corresponds to the start time of the test"
324
325
326
327
   ]
  },
  {
   "cell_type": "code",
328
   "execution_count": null,
329
   "metadata": {
330
331
    "deletable": false,
    "editable": false,
332
333
    "scrolled": false
   },
334
   "outputs": [],
335
   "source": [
336
    "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))"
337
338
339
340
341
342
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
343
    "## 5.3. DFB Temperature - TT893.TEMPERATURECALC\n",
344
    "\n",
345
346
347
348
349
    "*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",
350
351
352
    "\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",
353
    "- t = 0 s corresponds to the start time of the test"
354
355
356
357
   ]
  },
  {
   "cell_type": "code",
358
   "execution_count": null,
359
   "metadata": {
360
361
    "deletable": false,
    "editable": false,
362
363
    "scrolled": false
   },
364
   "outputs": [],
365
   "source": [
366
    "RbCircuitAnalysis.assert_tt893_min_max_value(tt893_nxcals_dfs, value_range=(280, 320))"
367
368
369
370
371
372
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
373
    "## 5.4. DFB Temperature - TT891A.TEMPERATURECALC\n",
374
    "\n",
375
376
377
378
379
    "*CRITERIA*:\n",
    "\n",
    "- Check if the temperature is regulated around 50 K -> 46 K < TT891A < 54 K, even without current\n",
    "\n",
    "*GRAPHS*:\n",
380
381
382
383
    "\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",
384
    "- t = 0 s corresponds to the start time of the test\n"
385
386
387
388
   ]
  },
  {
   "cell_type": "code",
389
   "execution_count": null,
390
   "metadata": {
391
392
    "deletable": false,
    "editable": false,
393
394
    "scrolled": false
   },
395
   "outputs": [],
396
   "source": [
397
    "RbCircuitAnalysis.assert_tt891a_min_max_value(tt891a_nxcals_dfs, value_range=(46, 54))"
398
399
400
401
402
403
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
404
    "## 5.5. DFB Valve Regulation - CV891.POSST\n",
405
    "\n",
406
407
408
409
410
411
    "*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",
412
413
414
415
    "\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",
416
    "- Green box denotes the valve opening validity region [2, 50] % of the TT891A temperature regulation"
417
418
419
420
   ]
  },
  {
   "cell_type": "code",
421
   "execution_count": null,
422
   "metadata": {
423
424
    "deletable": false,
    "editable": false,
425
426
    "scrolled": false
   },
427
   "outputs": [],
428
   "source": [
429
    "RbCircuitAnalysis.assert_cv891_min_max_value(cv891_nxcals_dfs, value_range=(2, 50))"
430
431
432
433
   ]
  },
  {
   "cell_type": "code",
434
   "execution_count": null,
435
436
437
438
   "metadata": {
    "deletable": false,
    "editable": false
   },
439
   "outputs": [],
440
   "source": [
441
    "RbCircuitAnalysis.assert_cv891_min_max_variation(cv891_nxcals_dfs, 8, plateau_start, plateau_end, Time.to_unix_timestamp(t_start))"
442
443
444
445
446
447
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
448
    "# 6. Signature Decision"
449
450
451
452
   ]
  },
  {
   "cell_type": "code",
453
   "execution_count": null,
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
   "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": {},
471
   "outputs": [],
472
   "source": [
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
}