AN_RB_PLI3.a5.ipynb 22 KB
Newer Older
1
2
3
4
{
 "cells": [
  {
   "cell_type": "markdown",
5
6
7
   "metadata": {
    "deletable": false
   },
8
9
   "source": [
    "<h1><center>Analysis of a PLI3.a5 HWC in an RB Circuit</center></h1>\n",
10
    "<img src=\"https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png\" width=75%>\n",
11
12
13
    "\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",
14
    "<img src=\"https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/PLI3_current.png\" width=50%>\n",
15
16
17
18
19
    "\n",
    "The required analysis and signatures are listed below.\n",
    "\n",
    "|Responsible|Type of analysis|Criterion|\n",
    "|-----------|----------------|---------|\n",
20
21
22
    "|-|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",
23
    "\n",
24
    "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>"
25
26
27
28
   ]
  },
  {
   "cell_type": "markdown",
29
30
31
   "metadata": {
    "deletable": false
   },
32
33
   "source": [
    "# Analysis Assumptions\n",
34
35
    "- 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",
36
37
    "\n",
    "# Plot Convention\n",
38
39
    "- 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",
40
    "- 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",
41
42
43
    "- 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",
44
    "- Each plot has an individual time-synchronization mentioned explicitly in the description.\n",
45
    "- If an axis has a single signal, then the color of the label matches the signal's color. Otherwise, the label color is black."
46
47
48
49
   ]
  },
  {
   "cell_type": "markdown",
50
51
52
   "metadata": {
    "deletable": false
   },
53
   "source": [
54
    "# 0. Initialise Working Environment"
55
56
57
58
   ]
  },
  {
   "cell_type": "code",
59
   "execution_count": null,
60
   "metadata": {
61
    "deletable": false,
62
63
    "scrolled": false
   },
64
   "outputs": [],
65
   "source": [
66
    "# External libraries\n",
67
    "print('Loading (1/11)'); import sys; import pandas as pd\n",
68
    "print('Loading (2/11)'); from IPython.display import display, Javascript, clear_output\n",
69
70
    "\n",
    "# Internal libraries\n",
71
72
73
74
75
76
77
78
79
    "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",
80
    "\n",
81
82
83
    "pd.set_option('display.max_columns', None) \n",
    "pd.set_option('display.max_rows', None)\n",
    "\n",
84
85
    "clear_output()\n",
    "lhcsmapi.get_lhcsmapi_version()\n",
86
87
    "lhcsmapi.get_lhcsmhwc_version('../__init__.py')\n",
    "print('Analysis performed by %s' % HwcSearchModuleMediator.get_user())"
88
89
90
91
   ]
  },
  {
   "cell_type": "markdown",
92
93
94
   "metadata": {
    "deletable": false
   },
95
   "source": [
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
    "# 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"
117
118
119
120
   ]
  },
  {
   "cell_type": "code",
121
   "execution_count": null,
122
   "metadata": {
123
    "deletable": false,
Michal Maciejewski's avatar
Michal Maciejewski committed
124
    "scrolled": false
125
   },
126
   "outputs": [],
127
   "source": []
128
  },
129
130
131
132
133
134
135
136
137
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('hwc_test = \\'%s\\'\\ncircuit_name = \\'%s\\'\\ncampaign = \\'%s\\'\\nt_start = \\'%s\\'\\nt_end = \\'%s\\'' % (hwc_test, circuit_name, campaign, t_start, t_end))"
   ]
  },
138
139
  {
   "cell_type": "markdown",
140
141
142
   "metadata": {
    "deletable": false
   },
143
144
145
146
147
148
   "source": [
    "# 2. Query All Signals Prior to Analysis"
   ]
  },
  {
   "cell_type": "code",
149
   "execution_count": null,
150
   "metadata": {
151
    "deleteable": false,
152
    "scrolled": true,
153
154
155
156
    "tags": [
     "skip_output"
    ]
   },
157
   "outputs": [],
158
   "source": [
159
160
161
162
163
164
165
166
167
168
169
    "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
170
    "rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=6)\n",
171
    "rb_analysis = RbCircuitAnalysis(circuit_type, None, is_automatic=is_automatic)\n",
172
173
    "\n",
    "with Timer():\n",
174
    "    # PC\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
175
    "    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",
176
    "    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
177
    "    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",
178
179
    "\n",
    "    # BUSBAR\n",
180
    "    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",
181
    "    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",
182
    "    res_busbar_df = rb_analysis.convert_to_col(res_busbar_row_df, signal_name='U_RES')\n",
183
    "    \n",
184
    "    # MAGNET\n",
185
    "    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",
186
    "    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",
187
    "    res_magnet_df = rb_analysis.convert_to_col(res_magnet_row_df, signal_name='U_MAG')\n",
188
    "    \n",
189
    "    # LEADS\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
190
191
    "    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",
192
    "\n",
193
194
195
    "    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"
196
197
198
199
   ]
  },
  {
   "cell_type": "markdown",
200
201
202
   "metadata": {
    "deletable": false
   },
203
204
205
206
207
   "source": [
    "# 3. Power Converter\n",
    "## 3.1. Plot of the Power Converter Main Current\n",
    "\n",
    "*ANALYSIS*:\n",
208
    "\n",
209
210
    "- Calculation of the duration of current plateaus\n",
    "\n",
211
212
    "*GRAPHS*:\n",
    "\n",
213
214
    "- 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"
215
216
217
218
   ]
  },
  {
   "cell_type": "code",
219
   "execution_count": null,
220
   "metadata": {
221
    "deletable": false,
222
223
    "scrolled": false
   },
224
   "outputs": [],
225
   "source": [
226
227
228
229
230
231
    "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)"
232
233
234
235
   ]
  },
  {
   "cell_type": "markdown",
236
237
238
   "metadata": {
    "deletable": false
   },
239
240
241
242
243
   "source": [
    "# 4. Busbar\n",
    "## 4.1. Busbar Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
244
    "\n",
Michal Maciejewski's avatar
Michal Maciejewski committed
245
    "- 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",
246
    "\n",
247
248
249
250
251
252
    "*CRITERIA*:\n",
    "\n",
    "- Check if the busbar resistance is below 3 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
253
    "- The busbar resistance, R\n",
254
    "- The green box denotes the validity region of the busbar resostance (0, 3] nOhm"
255
256
257
258
   ]
  },
  {
   "cell_type": "code",
259
   "execution_count": null,
260
261
262
   "metadata": {
    "deletable": false
   },
263
   "outputs": [],
264
   "source": [
265
266
    "title = '%s, %s: %s-%s' % (circuit_name, hwc_test, Time.to_string(t_start).split('.')[0], Time.to_string(t_end).split('.')[0])\n",
    "res_busbar_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_busbar_df, signal_name='R_RES', value_max=3e-9, title=title)"
267
268
269
270
   ]
  },
  {
   "cell_type": "code",
271
   "execution_count": null,
272
   "metadata": {
273
    "deletable": false
274
275
276
   },
   "outputs": [],
   "source": [
277
    "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)"
278
279
   ]
  },
280
281
282
283
284
285
286
287
288
289
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "busbar_metadata_resistance_df = rb_analysis.merge_busbar_metadata_with_resistance(res_busbar_df, circuit_type, circuit_name)\n",
    "rb_analysis.display_busbar_metadata_resistance_with_threshold(busbar_metadata_resistance_df, threshold=3e-9)"
   ]
  },
290
291
  {
   "cell_type": "markdown",
292
293
294
   "metadata": {
    "deletable": false
   },
295
296
297
298
   "source": [
    "## 4.2. Magnet Resistance\n",
    "\n",
    "*ANALYSIS*:\n",
299
    "\n",
300
    "- 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",
301
302
    "\n",
    "*CRITERIA*\n",
303
    "\n",
304
305
306
307
308
    "- Check if the resistance is below 50 nOhm\n",
    "\n",
    "*GRAPHS*:\n",
    "\n",
    "- The magnet resistance, R\n",
309
    "- The green box denotes the validity region of the magnet resistance (0, 50] nOhm\n"
310
311
312
313
   ]
  },
  {
   "cell_type": "code",
314
   "execution_count": null,
315
316
317
   "metadata": {
    "deletable": false
   },
318
   "outputs": [],
319
   "source": [
320
321
    "title = '%s, %s: %s-%s' % (circuit_name, hwc_test, Time.to_string(t_start).split('.')[0], Time.to_string(t_end).split('.')[0])\n",
    "res_magnet_outliers_df = rb_analysis.analyze_busbar_magnet_resistance(res_magnet_df, signal_name='R_MAG', value_max=50e-9, title=title)"
322
323
324
325
   ]
  },
  {
   "cell_type": "code",
326
   "execution_count": null,
327
   "metadata": {
328
329
    "deletable": false,
    "scrolled": false
330
   },
331
332
   "outputs": [],
   "source": [
333
    "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)"
334
335
   ]
  },
336
337
338
339
340
341
342
343
344
345
346
347
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "magnet_metadata_resistance_df = rb_analysis.merge_busbar_metadata_with_resistance(res_busbar_df, circuit_type, circuit_name)\n",
    "rb_analysis.display_busbar_metadata_resistance_with_threshold(magnet_metadata_resistance_df, threshold=50e-9)"
   ]
  },
348
349
  {
   "cell_type": "markdown",
350
351
352
   "metadata": {
    "deletable": false
   },
353
   "source": [
354
355
    "# 5. DFB\n",
    "## 5.1. DFB Voltage - U_RES\n",
356
    "\n",
357
358
    "*CRITERIA*:\n",
    "- Check if, at constant current, U_RES is constant (no drift < 2mV/h)\n",
359
    "\n",
360
    "*GRAPHS*:\n",
361
    "- t = 0 s corresponds to the start time of the test\n"
362
363
364
365
   ]
  },
  {
   "cell_type": "code",
366
   "execution_count": null,
367
   "metadata": {
368
    "deletable": false
369
   },
370
   "outputs": [],
371
   "source": [
372
    "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))"
373
374
375
376
   ]
  },
  {
   "cell_type": "markdown",
377
378
379
   "metadata": {
    "deletable": false
   },
380
   "source": [
381
    "## 5.2. DFB Voltage - U_HTS\n",
382
    "\n",
383
    "*CRITERIA*:  \n",
384
    "- Check if the voltage is below 50% of the threshold -> Abs(U_HTS) < 0.5 mV\n",
385
    "\n",
386
    "*GRAPHS*:\n",
387
    "- t = 0 s corresponds to the start time of the test"
388
389
390
391
   ]
  },
  {
   "cell_type": "code",
392
   "execution_count": null,
393
   "metadata": {
394
    "deletable": false,
395
396
    "scrolled": false
   },
397
   "outputs": [],
398
   "source": [
399
    "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))"
400
401
402
403
   ]
  },
  {
   "cell_type": "markdown",
404
405
406
   "metadata": {
    "deletable": false
   },
407
   "source": [
408
    "## 5.3. DFB Temperature - TT893.TEMPERATURECALC\n",
409
    "\n",
410
411
412
413
414
    "*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",
415
416
417
    "\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",
418
    "- t = 0 s corresponds to the start time of the test"
419
420
421
422
   ]
  },
  {
   "cell_type": "code",
423
   "execution_count": null,
424
   "metadata": {
425
    "deletable": false,
426
427
    "scrolled": false
   },
428
   "outputs": [],
429
   "source": [
430
    "RbCircuitAnalysis.assert_tt893_min_max_value(tt893_nxcals_dfs, value_range=(280, 320))"
431
432
433
434
   ]
  },
  {
   "cell_type": "markdown",
435
436
437
   "metadata": {
    "deletable": false
   },
438
   "source": [
439
    "## 5.4. DFB Temperature - TT891A.TEMPERATURECALC\n",
440
    "\n",
441
442
443
444
445
    "*CRITERIA*:\n",
    "\n",
    "- Check if the temperature is regulated around 50 K -> 46 K < TT891A < 54 K, even without current\n",
    "\n",
    "*GRAPHS*:\n",
446
447
448
449
    "\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",
450
    "- t = 0 s corresponds to the start time of the test\n"
451
452
453
454
   ]
  },
  {
   "cell_type": "code",
455
   "execution_count": null,
456
   "metadata": {
457
    "deletable": false,
458
459
    "scrolled": false
   },
460
   "outputs": [],
461
   "source": [
462
    "RbCircuitAnalysis.assert_tt891a_min_max_value(tt891a_nxcals_dfs, value_range=(46, 54))"
463
464
465
466
   ]
  },
  {
   "cell_type": "markdown",
467
468
469
   "metadata": {
    "deletable": false
   },
470
   "source": [
471
    "## 5.5. DFB Valve Regulation - CV891.POSST\n",
472
    "\n",
473
474
475
476
477
478
    "*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",
479
480
481
482
    "\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",
483
    "- Green box denotes the valve opening validity region [2, 50] % of the TT891A temperature regulation"
484
485
486
487
   ]
  },
  {
   "cell_type": "code",
488
   "execution_count": null,
489
   "metadata": {
490
    "deletable": false,
491
492
    "scrolled": false
   },
493
   "outputs": [],
494
   "source": [
495
    "RbCircuitAnalysis.assert_cv891_min_max_value(cv891_nxcals_dfs, value_range=(2, 50))"
496
497
498
499
   ]
  },
  {
   "cell_type": "code",
500
   "execution_count": null,
501
   "metadata": {
502
    "deletable": false
503
   },
504
   "outputs": [],
505
   "source": [
506
    "RbCircuitAnalysis.assert_cv891_min_max_variation(cv891_nxcals_dfs, 8, plateau_start, plateau_end, Time.to_unix_timestamp(t_start))"
507
508
509
510
   ]
  },
  {
   "cell_type": "markdown",
511
512
513
   "metadata": {
    "deletable": false
   },
514
   "source": [
515
    "# 6. Signature Decision"
516
517
518
519
   ]
  },
  {
   "cell_type": "code",
520
   "execution_count": null,
521
522
523
   "metadata": {
    "deletable": false
   },
524
525
526
527
528
529
530
   "outputs": [],
   "source": [
    "signature = get_expert_decision('Expert Signature Decision: ', ['PASSED', 'FAILED'])"
   ]
  },
  {
   "cell_type": "markdown",
531
532
533
   "metadata": {
    "deletable": false
   },
534
535
536
537
538
539
540
   "source": [
    "# 7. Final Report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
541
542
543
   "metadata": {
    "deletable": false
   },
544
   "outputs": [],
545
   "source": [
546
    "analysis_start_time = Time.get_analysis_start_time()\n",
547
    "apply_report_template()\n",
548
    "\n",
549
550
    "!mkdir -p /eos/project/m/mp3/RB/$circuit_name/$hwc_test\n",
    "\n",
551
552
553
554
555
556
557
558
559
560
    "file_name_csv = '{}_{}-{}-{}_{}_BUSBAR_RESISTANCE.csv'.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_csv)\n",
    "busbar_metadata_resistance_df.to_csv(full_path)\n",
    "print('Busbar resistance table saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n",
    "\n",
    "file_name_csv = '{}_{}-{}-{}_{}_MAGNET_RESISTANCE.csv'.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_csv)\n",
    "magnet_metadata_resistance_df.to_csv(full_path)\n",
    "print('Magnet resistance table saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n",
    "\n",
561
562
    "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",
563
    "print('Compact notebook report saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n",
564
    "\n",
565
    "display(Javascript('IPython.notebook.save_notebook();'))\n",
566
    "Time.sleep(5)\n",
567
    "!{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\"]'"
568
   ]
Michal Maciejewski's avatar
Michal Maciejewski committed
569
570
571
572
573
574
575
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
  }
 ],
 "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": {
597
598
599
   "bundled_options": [
    "NXCALS"
   ],
Michal Maciejewski's avatar
Michal Maciejewski committed
600
   "list_of_options": []
601
602
603
604
605
606
607
608
609
610
611
612
613
  },
  "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
614
615
616
617
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
Michal Maciejewski's avatar
Michal Maciejewski committed
618
}