{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "

Analysis of an FPA in an 600A Circuit - RCBX Family

\n", "\n", "Figure below shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.\n", "\n", "\n", "source: Test Procedure and Acceptance Criteria for the 600 A Circuits, MP3 Procedure, https://edms.cern.ch/document/874716" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# Analysis Assumptions\n", "- We consider standard analysis scenarios, i.e., all signals can be queried. Depending on what 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 an 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", "\n", "# Plot Convention\n", "- Scales are labeled with signal name followed by a comma and a unit in the square bracket, e.g., I_MEAS, [A]\n", "- If a reference signal is present, it is represented with a dashed line\n", "- 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", "- The grid comes from the left axis\n", "- Title contains timestamp, circuit name, signal name allowing for re-access the signal.\n", "- The plots assigned to the left scale got colors: blue (C0) and orange (C1). Plots presented on the right have colors red (C2) and green (C3).\n", "- Each plot has an individual time-synchronization mentioned explicitly in the description.\n", "- If an axis has a single signal, change color of the label to match the signal's color. Otherwise, the label color is black.\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 0. Initialise Working Environment" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "scrolled": true }, "outputs": [], "source": [ "# External libraries\n", "print('Loading (1/16)'); import pandas as pd\n", "print('Loading (2/16)'); import numpy as np\n", "print('Loading (3/16)'); import sys\n", "print('Loading (4/16)'); from IPython.display import display, Javascript, clear_output, HTML\n", "\n", "# Internal libraries\n", "print('Loading (5/16)'); import lhcsmapi\n", "print('Loading (6/16)'); from lhcsmapi.Time import Time\n", "print('Loading (7/16)'); from lhcsmapi.Timer import Timer\n", "print('Loading (8/16)'); from lhcsmapi.analysis.R600ACircuitQuery import R600ACircuitQuery\n", "print('Loading (9/16)'); from lhcsmapi.analysis.R600ACircuitAnalysis import R600ACircuitAnalysis\n", "print('Loading (10/16)'); from lhcsmapi.analysis.expert_input import get_expert_decision\n", "print('Loading (11/16)'); from lhcsmapi.analysis.report_template import apply_report_template\n", "print('Loading (12/16)'); from lhcsmapi.gui.DateTimeBaseModule import DateTimeBaseModule\n", "print('Loading (13/16)'); from lhcsmapi.gui.pc.FgcPmSearchModuleMediator import FgcPmSearchModuleMediator\n", "print('Loading (14/16)'); from lhcsmapi.metadata.SignalMetadata import SignalMetadata\n", "print('Loading (15/16)'); from lhcsmnb.parameters import are_all_parameters_injected, NbType\n", "print('Loading (16/16)'); import lhcsmnb.utils\n", "\n", "clear_output()\n", "lhcsmapi.get_lhcsmapi_version()\n", "lhcsmapi.get_lhcsmhwc_version('../__init__.py')" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 1. Select FGC Post Mortem Entry" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "skip_cell" ] }, "source": [ "In order to perform the analysis of a FPA in an RCD/O 600A circuit please:\n", "1. Select circuit name (e.g., RC.A12B1)\n", "2. Choose start and end time\n", "3. Choose analysis mode (Automatic by default)\n", "\n", "Once these inputs are provided, click 'Find FGC PM entries' button. This will trigger a search of the PM database in order to provide a list of timestamps of FGC events associated with the selected circuit name for the provided period of time. Select one timestamp from the 'FGC PM Entries' list to be processed by the following cells.\n", "\n", "**Note that 24 hours is the maximum duration of a single PM query for an event. To avoid delays in querying events, please restrict your query duration as much as possible.**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "tags": [ "parameters" ] }, "outputs": [], "source": [ "fgc_pm_search = FgcPmSearchModuleMediator(DateTimeBaseModule(start_date_time='2021-01-26 00:00:00+01:00',\n", " end_date_time='2021-01-31 00:00:00+01:00'), circuit_type='600A_RCBXHV')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2. Query All Signals Prior to Analysis" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "tags": [ "skip_output" ] }, "outputs": [], "source": [ "with Timer():\n", " if not are_all_parameters_injected(NbType.FGC2, locals()):\n", " author = fgc_pm_search.get_author()\n", " is_automatic = fgc_pm_search.is_automatic_mode()\n", " circuit_type = '600A'\n", " circuit_names = fgc_pm_search.get_fgc_circuit()\n", " timestamps_fgc = fgc_pm_search.get_fgc_timestamp()\n", " \n", " timestamp_fgc_rcbxh, timestamp_fgc_rcbxv = timestamps_fgc\n", " \n", " query_rcbxh = R600ACircuitQuery(circuit_type, circuit_names[0], max_executions=9)\n", " query_rcbxv = R600ACircuitQuery(circuit_type, circuit_names[1], max_executions=9)\n", "\n", " # RCBXH\n", " i_meas_rcbxh_df, i_a_rcbxh_df, i_ref_rcbxh_df, i_earth_rcbxh_df = query_rcbxh.query_pc_pm(timestamp_fgc_rcbxh, timestamp_fgc_rcbxh, signal_names=['I_MEAS', 'I_A', 'I_REF', 'I_EARTH'])\n", " events_action_rcbxh_df, events_symbol_rcbxh_df = query_rcbxh.query_pc_pm_events(timestamp_fgc_rcbxh, signal_names=['ACTION', 'SYMBOL'])\n", " # RCBXV\n", " i_meas_rcbxv_df, i_a_rcbxv_df, i_ref_rcbxv_df, i_earth_rcbxv_df = query_rcbxv.query_pc_pm(timestamp_fgc_rcbxv, timestamp_fgc_rcbxv, signal_names=['I_MEAS', 'I_A', 'I_REF', 'I_EARTH'])\n", " events_action_rcbxv_df, events_symbol_rcbxv_df = query_rcbxv.query_pc_pm_events(timestamp_fgc_rcbxv, signal_names=['ACTION', 'SYMBOL'])\n", "\n", " # PIC\n", " # # RCBXH\n", " timestamp_pic_rcbxh = query_rcbxh.find_timestamp_pic(timestamp_fgc_rcbxh, spark=spark)\n", " # # RCBXV\n", " timestamp_pic_rcbxv = query_rcbxv.find_timestamp_pic(timestamp_fgc_rcbxv, spark=spark)\n", "\n", " # QDS NXCALS - To check if there was any drift of QDS cards prior to the trigger\n", " # # RCBXH\n", " i_meas_nxcals_rcbxh_df = query_rcbxh.query_pc_nxcals(timestamp_fgc_rcbxh, signal_names=['I_MEAS'], spark=spark)[0]\n", " u_res_nxcals_rcbxh_df = query_rcbxh.query_iqps_nxcals(timestamp_fgc_rcbxh, signal_names=['U_RES'], spark=spark)[0]\n", " # # RCBXV\n", " i_meas_nxcals_rcbxv_df = query_rcbxv.query_pc_nxcals(timestamp_fgc_rcbxv, signal_names=['I_MEAS'], spark=spark)[0]\n", " u_res_nxcals_rcbxv_df = query_rcbxv.query_iqps_nxcals(timestamp_fgc_rcbxv, signal_names=['U_RES'], spark=spark)[0]\n", "\n", " # QDS PM\n", " # # RCBXH\n", " source_timestamp_qds_rcbxh_df = query_rcbxh.find_source_timestamp_qds_board_ab(timestamp_fgc_rcbxh, duration=[(2, 's'), (2, 's')])\n", " timestamp_qds_rcbxh = lhcsmnb.utils.get_at(source_timestamp_qds_rcbxh_df, 0, 'timestamp', default=np.nan)\n", " i_dcct_rcbxh_df, i_didt_rcbxh_df, u_res_rcbxh_df, u_diff_rcbxh_df = query_rcbxh.query_qds_pm(timestamp_qds_rcbxh, timestamp_qds_rcbxh, signal_names=['I_DCCT', 'I_DIDT', 'U_RES', 'U_DIFF'])\n", " # # RCBXV\n", " source_timestamp_qds_rcbxv_df = query_rcbxv.find_source_timestamp_qds_board_ab(timestamp_fgc_rcbxv, duration=[(2, 's'), (2, 's')])\n", " timestamp_qds_rcbxv = lhcsmnb.utils.get_at(source_timestamp_qds_rcbxv_df, 0, 'timestamp', default=np.nan)\n", " i_dcct_rcbxv_df, i_didt_rcbxv_df, u_res_rcbxv_df, u_diff_rcbxv_df = query_rcbxv.query_qds_pm(timestamp_qds_rcbxv, timestamp_qds_rcbxv, signal_names=['I_DCCT', 'I_DIDT', 'U_RES', 'U_DIFF'])\n", " # LEADS\n", " # # RCBXH\n", " leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[0]) if 'LEADS' in x][0]\n", " source_timestamp_leads_rcbxh_df = query_rcbxh.find_timestamp_leads(timestamp_fgc_rcbxh, leads_name)\n", "\n", " u_hts_leads_rcbxh_dfs = query_rcbxh.query_leads(timestamp_fgc_rcbxh, source_timestamp_leads_rcbxh_df, system=leads_name, signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])\n", " u_res_leads_rcbxh_dfs = query_rcbxh.query_leads(timestamp_fgc_rcbxh, source_timestamp_leads_rcbxh_df, system=leads_name, signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])\n", "\n", " # # RCBXV\n", " leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[1]) if 'LEADS' in x][0]\n", " source_timestamp_leads_rcbxv_df = query_rcbxv.find_timestamp_leads(timestamp_fgc_rcbxv, leads_name)\n", "\n", " u_hts_leads_rcbxv_dfs = query_rcbxv.query_leads(timestamp_fgc_rcbxv, source_timestamp_leads_rcbxv_df, system=leads_name, signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])\n", " u_res_leads_rcbxv_dfs = query_rcbxv.query_leads(timestamp_fgc_rcbxv, source_timestamp_leads_rcbxv_df, system=leads_name, signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])\n", "\n", "# Create results table - RCBXH/V\n", "results_table = query_rcbxh.create_report_analysis_template_rcbx(timestamp_fgc_rcbxh, timestamp_fgc_rcbxv, '../__init__.py', circuit_names, author=author)\n", "analysis_rcbxh = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)\n", "analysis_rcbxv = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 3. Timestamps\n", "\n", "The analysis for MP3 consists of checking the existence of PM file and of consistency of the PM timestamps (PC, QPS). The criterion of passing this test described in detail in 600APIC2.\n", "In short the following criteria should be checked:\n", "\n", "- 2 PM DQAMGNA (A+B) files and 1 PM EE file should be generated for 600 A circuits with EE\n", "- Difference between QPS board A and B timestamp = 1 ms\n", "- PC timestamp is QPS timestamp +/- 20 ms\n", "\n", "If one or more of these conditions are not fulfilled, then an in-depth analysis has to be performed by the QPS team." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "timestamp_dct = {'FGC_RCBXH': timestamp_fgc_rcbxh, 'FGC_RCBXV': timestamp_fgc_rcbxv, \n", " 'PIC_RCBXH': timestamp_pic_rcbxh, 'PIC_RCBXV': timestamp_pic_rcbxv, \n", " 'QDS_A_RCBXH':lhcsmnb.utils.get_at(source_timestamp_qds_rcbxh_df, 0, 'timestamp', default=np.nan), \n", " 'QDS_B_RCBXH':lhcsmnb.utils.get_at(source_timestamp_qds_rcbxh_df, 1, 'timestamp', default=np.nan),\n", " 'QDS_A_RCBXV':lhcsmnb.utils.get_at(source_timestamp_qds_rcbxv_df, 0, 'timestamp', default=np.nan), \n", " 'QDS_B_RCBXV':lhcsmnb.utils.get_at(source_timestamp_qds_rcbxv_df, 1, 'timestamp', default=np.nan)}\n", "\n", "analysis_rcbxh.create_timestamp_table(timestamp_dct, circuit_name=circuit_names[0])" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 4. PC\n", "## 4.1. Main Current\n", "\n", "*ANALYSIS*:\n", "- determination of the source of an FPA trigger based on EVENTS.SYMBOL and EVENTS.ACTION signals\n", "- detection of the start of a quench as a deviation of I_A and I_REF\n", "- calculation of the MIITs\n", "- calculation of the quench current\n", "- calculation of the duration of a plateau / the ramp rate before a quench (based on PM event buffer)\n", "\n", "**You may manually adjust the automatically calculated quench start by clicking the right button on a mouse of a plot with current zoom.**\n", "\n", "*GRAPHS*:\n", "- dashed blue line denotes the start of a quench (I_A starts to deviate from I_REF)\n", "- t = 0 s corresponds to the FGC timestamp" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['savefig.dpi'] = 80\n", "mpl.rcParams['figure.dpi'] = 80\n", "%matplotlib notebook\n", "analysis_rcbxh.plot_coupled_circuit_current(i_meas_rcbxh_df, i_ref_rcbxh_df, i_meas_rcbxv_df, i_ref_rcbxv_df, timestamp_fgc_rcbxh, timestamp_fgc_rcbxv, circuit_names)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.plot_i_meas_pc(circuit_names[0], timestamp_fgc_rcbxh, [i_meas_rcbxh_df, i_a_rcbxh_df, i_ref_rcbxh_df])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "t_quench = analysis_rcbxh.estimate_quench_start_from_i_ref_i_a(i_ref_rcbxh_df, i_a_rcbxh_df)\n", "t_quench = 0 if t_quench is None else t_quench\n", "t_quench_correction = analysis_rcbxh.plot_i_meas_pc_with_cursor(circuit_names[0], timestamp_fgc_rcbxh, [i_meas_rcbxh_df, i_a_rcbxh_df, i_ref_rcbxh_df], t_quench)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "scrolled": false }, "outputs": [], "source": [ "t_quench = analysis_rcbxh.choose_quench_time_from_auto_or_manual(t_quench_correction)\n", "analysis_rcbxh.analyze_i_meas_pc_trigger(timestamp_fgc_rcbxh, events_action_rcbxh_df, events_symbol_rcbxh_df)\n", "analysis_rcbxh.calculate_current_miits_i_meas_i_a(i_meas_rcbxh_df, i_a_rcbxh_df, t_quench, col_name='MIITS_H')\n", "analysis_rcbxh.calculate_quench_current(i_meas_rcbxh_df, t_quench, col_name='I_Q_H')\n", "analysis_rcbxh.calculate_current_slope(i_meas_rcbxh_df, col_name=['Ramp rate H', 'Plateau duration H'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxv.plot_i_meas_pc(circuit_names[1], timestamp_fgc_rcbxv, [i_meas_rcbxv_df, i_a_rcbxv_df, i_ref_rcbxv_df])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "t_quench = analysis_rcbxv.estimate_quench_start_from_i_ref_i_a(i_ref_rcbxv_df, i_a_rcbxv_df)\n", "t_quench = 0 if t_quench is None else t_quench\n", "t_quench_correction = analysis_rcbxv.plot_i_meas_pc_with_cursor(circuit_names[1], timestamp_fgc_rcbxv, [i_meas_rcbxv_df, i_a_rcbxv_df, i_ref_rcbxv_df], t_quench)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "scrolled": false }, "outputs": [], "source": [ "t_quench = analysis_rcbxv.choose_quench_time_from_auto_or_manual(t_quench_correction)\n", "analysis_rcbxv.analyze_i_meas_pc_trigger(timestamp_fgc_rcbxv, events_action_rcbxv_df, events_symbol_rcbxv_df)\n", "analysis_rcbxv.calculate_current_miits_i_meas_i_a(i_meas_rcbxv_df, i_a_rcbxv_df, t_quench, col_name='MIITS_V')\n", "analysis_rcbxv.calculate_quench_current(i_meas_rcbxv_df, t_quench, col_name='I_Q_V')\n", "analysis_rcbxv.calculate_current_slope(i_meas_rcbxv_df, col_name=['Ramp rate V', 'Plateau duration V'])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.results_table[['Circuit Name', 'Date (FGC)', 'Time (FGC)', 'I_Q_H', 'I_Q_V', 'MIITS_H', 'MIITS_V', 'Ramp rate H', 'Ramp rate V', 'Plateau duration H', 'Plateau duration V']]" ] }, { "cell_type": "markdown", "metadata": { "scrolled": true }, "source": [ "### 4.1.1 Angle Calculation" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "analysis_rcbxv.compute_and_print_current_angle_for_combined_powering()" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "## 4.2. Earth Current\n", "\n", "*ANALYSIS*:\n", "- calculation of the maximum absolute earth current (maintaining the sign)\n", "\n", "*GRAPHS*:\n", "- t = 0 s corresponds to the FGC timestamp" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.plot_i_earth_pc(circuit_names[0], timestamp_fgc_rcbxh, i_earth_rcbxh_df)\n", "analysis_rcbxh.calculate_max_i_earth_pc(i_earth_rcbxh_df, col_name='I_Earth_max_H')" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxv.plot_i_earth_pc(circuit_names[1], timestamp_fgc_rcbxv, i_earth_rcbxv_df)\n", "analysis_rcbxv.calculate_max_i_earth_pc(i_earth_rcbxv_df, col_name='I_Earth_max_V')" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 5. QDS\n", "The quench voltage U_RES is calculated according to the following formula:\n", "\n", "\\begin{equation}\n", "U_{\\text{RES}} = U_{\\text{DIFF}} + L d/dt (I+U_{\\text{DIFF}}/R).\n", "\\end{equation}\n", "\n", "Note that I_DCCT is the QPS signal name, even though the current is actually measured not with a DCCT, but with a LEM detector, hence the poorer quality w.r.t. to the FGC I_A/B/MEAS signals that are measured with a DCCT.\n", "It can be seen from the sign convention in the figure below that a resistive voltage always has opposite sign to the measured current.\n", "\n", "\n", "\n", "As U_DIFF contributes directly to U_RES, the resolution of U_RES is, at least partially, limited by that of U_DIFF. Moreover, U_RES is affected by the noisy time derivative of the current signal.\n", "The QPS signals that are communicated to the post-mortem system have only 12 bit resolution.\n", "\n", "## 5.1. Resistive Voltage\n", "\n", "*ANALYSIS*:\n", "- Check if the U_RES signal before a quench is increasing for at least one board, which would indicate a QPS trip\n", "- Calculate the initial voltage slope of U_RES signal. The slope is calculated as a ratio of the voltage change from 50 to 200 mV and the corresponding time change.\n", "\n", "*GRAPHS*:\n", "First plot (U_RES and I_MEAS prior to a quench)\n", "- t = 0 s corresponds to the FGC timestamp\n", "\n", "Second plot (U_RES and the initial slope of U_RES)\n", "- t = 0 s corresponds to the QPS timestamp" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.plot_u_res(circuit_names[0], timestamp_qds_rcbxh, u_res_nxcals_rcbxh_df, i_meas_nxcals_rcbxh_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "u_res_rcbxh_slope_df = analysis_rcbxh.calculate_u_res_slope(u_res_rcbxh_df, col_name='dU_QPS/dt_H')\n", "analysis_rcbxh.plot_u_res_slope(circuit_names[0], timestamp_qds_rcbxh, u_res_rcbxh_df, u_res_rcbxh_slope_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxv.plot_u_res(circuit_names[1], timestamp_qds_rcbxv, u_res_nxcals_rcbxv_df, i_meas_nxcals_rcbxv_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "u_res_rcbxv_slope_df = analysis_rcbxv.calculate_u_res_slope(u_res_rcbxv_df, col_name='dU_QPS/dt_V')\n", "analysis_rcbxv.plot_u_res_slope(circuit_names[1], timestamp_qds_rcbxv, u_res_rcbxv_df, u_res_rcbxv_slope_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.results_table[['Circuit Name', 'Date (FGC)', 'Time (FGC)', 'dU_QPS/dt_H', 'dU_QPS/dt_V']]" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "## 5.2. I_DCCT, I_DIDT Currents; U_RES, U_DIFF Voltages\n", "\n", "*ANALYSIS*\n", "- Check the integrity of all four signals (U_DIFF, I_DCCT, I_DIDT and U_RES). If one of the signals (especially U_DIFF or I_DCCT) stays at zero or shows wrong values the cabling of this quench detector could have issues. Compare U_DIFF (measured signal) to U_REF (signal compensated for inductive voltage).\n", "\n", "*CRITERIA*\n", "- U_RES < 0.7*100 mV\n", "- noise of U_RES on the plateaus < 20mV\n", "\n", "*GRAPHS*:\n", "- t = 0 s corresponds to the QPS timestamp" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.plot_qds(circuit_names[0], timestamp_qds_rcbxh, i_dcct_rcbxh_df, i_didt_rcbxh_df, u_diff_rcbxh_df, u_res_rcbxh_df)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxv.plot_qds(circuit_names[1], timestamp_qds_rcbxv, i_dcct_rcbxv_df, i_didt_rcbxv_df, u_diff_rcbxv_df, u_res_rcbxv_df)" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "## 5.3. LEADS\n", "\n", "*ANALYSIS*:\n", "- check if U_HTS for 2 consecutive datapoints is above the threshold 3 mV\n", "- check if U_RES for 2 consecutive datapoints is above the threshold 160 mV\n", "\n", "*GRAPHS*:\n", "- t = 0 s corresponds to the FGC timestamp\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.analyze_leads_voltage(u_hts_leads_rcbxh_dfs, circuit_names[0], timestamp_fgc_rcbxh, signal='U_HTS', value_min=-0.003, value_max=0.003)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxh.analyze_leads_voltage(u_res_leads_rcbxh_dfs, circuit_names[0], timestamp_fgc_rcbxh, signal='U_RES', value_min=-0.16, value_max=0.16)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "analysis_rcbxv.analyze_leads_voltage(u_hts_leads_rcbxv_dfs, circuit_names[1], timestamp_fgc_rcbxv, signal='U_HTS', value_min=-0.003, value_max=0.003)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "analysis_rcbxv.analyze_leads_voltage(u_res_leads_rcbxv_dfs, circuit_names[1], timestamp_fgc_rcbxv, signal='U_RES', value_min=-0.16, value_max=0.16)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "if not is_automatic:\n", " analysis_rcbxh.results_table['FPA Reason'] = get_expert_decision('Reason for FPA: ', ['QPS trip', 'Converter trip', 'EE spurious opening', 'Spurious heater firing', 'Busbar quench', 'Magnet quench', 'HTS current lead quench' ,'RES current lead overvoltage', 'No quench', 'Unknown'])\n", " analysis_rcbxh.results_table['Type of Quench'] = get_expert_decision('Type of Quench: ', ['Training', 'Heater-provoked', 'Beam-induced', 'GHe propagation', 'QPS crate reset', 'Single Event Upset' ,'Short-to-ground', 'EM disturbance', 'No quench', 'Unknown'])\n", " analysis_rcbxh.results_table['QDS trigger origin'] = get_expert_decision('QDS trigger origin: ', ['QPS', 'HTS current lead', 'RES current lead', 'Busbar', 'No quench'])\n", " analysis_rcbxh.results_table['Quench origin'] = get_expert_decision('Quench origin: ', ['H', 'V'])" ] }, { "cell_type": "markdown", "metadata": { "deletable": false }, "source": [ "# 6. Analysis Comment" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false }, "outputs": [], "source": [ "if not is_automatic:\n", " analysis_rcbxh.results_table['Comment'] = input('Comment: ')" ] }, { "cell_type": "markdown", "metadata": { "deletable": false, "tags": [ "ignore" ] }, "source": [ "# 7. Final Report" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "scrolled": false, "tags": [ "ignore" ] }, "outputs": [], "source": [ "pd.set_option('display.max_columns', None)\n", "pd.set_option('display.max_rows', None)\n", "circuit_name = circuit_names[0]\n", "\n", "analysis_start_time = Time.get_analysis_start_time()\n", "timestamp_fgc = timestamp_fgc_rcbxh if not np.isnan(timestamp_fgc_rcbxh) else timestamp_fgc_rcbxv\n", "date_time_fgc = Time.to_datetime(timestamp_fgc).strftime(\"%Y-%m-%d-%Hh%M\")\n", "prefix_circuit_name = SignalMetadata.parse_600A_circuit_name_to_family_name(circuit_name)\n", "circuit_name_rcbx = circuit_name.replace('RCBXH', 'RCBX') if 'RCBXH' in circuit_name else circuit_name.replace('RCBXV', 'RCBX')\n", "!mkdir -p /eos/project/m/mp3/600A/$prefix_circuit_name/$circuit_name_rcbx/FPA\n", "\n", "file_name = \"{}_FPA-{}-{}\".format(circuit_name_rcbx, date_time_fgc, analysis_start_time)\n", "full_path = '/eos/project/m/mp3/600A/{}/{}/FPA/{}.csv'.format(prefix_circuit_name, circuit_name_rcbx, file_name)\n", "\n", "mp3_results_table = analysis_rcbxh.create_mp3_results_table_rcbxhv()\n", "display(HTML(mp3_results_table.T.to_html()))\n", "mp3_results_table.to_csv(full_path, index=False)\n", "print('MP3 results table saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n", "\n", "apply_report_template()\n", "\n", "full_path = '/eos/project/m/mp3/600A/{}/{}/FPA/{}.html'.format(prefix_circuit_name, circuit_name_rcbx, file_name)\n", "print('Compact notebook report saved to (Windows): ' + '\\\\\\\\cernbox-smb' + full_path.replace('/', '\\\\'))\n", "\n", "display(Javascript('IPython.notebook.save_notebook();'))\n", "Time.sleep(5)\n", "file_name_html = file_name + '.html'\n", "!{sys.executable} -m jupyter nbconvert --to html $'AN_600A_RCBXHV_FPA.ipynb' --output /eos/project/m/mp3/600A/$prefix_circuit_name/$circuit_name_rcbx/FPA/$file_name_html --TemplateExporter.exclude_input=True --TagRemovePreprocessor.remove_all_outputs_tags='[\"skip_output\"]' --TagRemovePreprocessor.remove_cell_tags='[\"skip_cell\"]'" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.8.10" }, "sparkconnect": { "bundled_options": [ "NXCALS", "SparkMetrics" ], "list_of_options": [] }, "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 } }, "nbformat": 4, "nbformat_minor": 4 }