Commit 0f1ee1da authored by Michal Maciejewski's avatar Michal Maciejewski
Browse files

Added HWC plots for IT circuit

parent 3493e3a7
%% Cell type:markdown id: tags:
<h1><center>Analysis of an FPA in an 600A Circuit - RCBX Family</center></h1>
Figure below shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/600A/600A_without_EE.png" width=75%>
source: Test Procedure and Acceptance Criteria for the 600 A Circuits, MP3 Procedure, <a href="https://edms.cern.ch/document/874716/5.3">https://edms.cern.ch/document/874716/5.3</a>
%% Cell type:markdown id: tags:
# Analysis Assumptions
- 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.
- In case an analyzed signal can't be queried, a particular analysis is skipped. In other words, all signals have to be available in order to perform an analysis.
- 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).
# Plot Convention
- Scales are labeled with signal name followed by a comma and a unit in the square bracket, e.g., I_MEAS, [A]
- If a reference signal is present, it is represented with a dashed line
- 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.
- The grid comes from the left axis
- Title contains timestamp, circuit name, signal name allowing for re-access the signal.
- 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).
- Each plot has an individual time-synchronization mentioned explicitly in the description.
- If an axis has a single signal, change color of the label to match the signal's color. Otherwise, the label color is black.
%% Cell type:markdown id: tags:
- What signal is used to calculate quench current (I_MEAS/I_DCCT)?
- How is the I_DCCT MIITs calculated (definition of start of decay)?
- How is the dU_RES/dt calculated?
- What is analysed for each system?
- What are the circuit families for different tabs in Excel files?
- How do we get circuit family?
- What timestamp is reported in the table? (QPS vs FGC)?
%% Cell type:markdown id: tags:
# 0. Initialise Working Environment
## 0.1. Import Necessary Packages
%% Cell type:code id: tags:
``` python
import io
import re
import sys
import pandas as pd
import numpy as np
from datetime import datetime
# lhc-sm-api
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.pyedsl.QueryBuilder import QueryBuilder
from lhcsmapi.analysis.R600ACircuitQuery import R600ACircuitQuery
from lhcsmapi.analysis.CircuitAnalysis import get_expert_decision
from lhcsmapi.analysis.R600ACircuitAnalysis import R600ACircuitAnalysis
from lhcsmapi.metadata.SignalMetadata import SignalMetadata
# GUI
from lhcsmapi.gui.qh.DateTimeBaseModule import DateTimeBaseModule
from lhcsmapi.gui.pc.FgcPmSearchModuleMediator import FgcPmSearchModuleMediator
from lhcsmapi.gui.pc.R600AFgcPmSearchBaseModule import R600ARcbxhvFgcPmSearchBaseModule
analysis_start_time = datetime.now().strftime("%Y.%m.%d_%H%M%S.%f")
```
%% Cell type:markdown id: tags:
## 0.2. LHCSMAPI Version
%% Cell type:code id: tags:
``` python
import lhcsmapi
print('Analysis executed with lhcsmapi version: {}'.format(lhcsmapi.__version__))
```
%% Cell type:markdown id: tags:
## 0.3. Notebook Version
%% Cell type:code id: tags:
``` python
with io.open("../__init__.py", "rt", encoding="utf8") as f:
version = re.search(r'__version__ = "(.*?)"', f.read()).group(1)
print('Analysis executed with lhc-sm-hwc notebooks version: {}'.format(version))
```
%% Cell type:markdown id: tags:
# 1. Select FGC Post Mortem Entry
%% Cell type:code id: tags:
``` python
fgc_pm_search = FgcPmSearchModuleMediator(DateTimeBaseModule(start_date_time='2017-04-26 00:00:00+01:00',
end_date_time='2017-04-28 00:00:00+01:00'), R600ARcbxhvFgcPmSearchBaseModule(), circuit_type='600A_RCBXHV')
display(fgc_pm_search.widget)
```
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:
``` python
with Timer():
author = fgc_pm_search.get_author()
is_automatic = fgc_pm_search.is_automatic_mode()
circuit_type = '600A'
circuit_names = fgc_pm_search.get_fgc_circuit()
timestamp_fgc_rcbxh, timestamp_fgc_rcbxv = fgc_pm_search.get_fgc_timestamp()
query_rcbxh = R600ACircuitQuery(circuit_type, circuit_names[0])
query_rcbxv = R600ACircuitQuery(circuit_type, circuit_names[1])
# RCBXH
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'])
events_action_rcbxh_df, events_symbol_rcbxh_df = query_rcbxh.query_pc_pm_events(timestamp_fgc_rcbxh, signal_names=['ACTION', 'SYMBOL'])
# RCBXV
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'])
events_action_rcbxv_df, events_symbol_rcbxv_df = query_rcbxv.query_pc_pm_events(timestamp_fgc_rcbxv, signal_names=['ACTION', 'SYMBOL'])
# PIC
# # RCBXH
timestamp_pic_rcbxh = query_rcbxh.find_timestamp_pic(timestamp_fgc_rcbxh, spark=spark)
# # RCBXV
timestamp_pic_rcbxv = query_rcbxv.find_timestamp_pic(timestamp_fgc_rcbxv, spark=spark)
# QDS NXCALS - To check if there was any drift of QDS cards prior to the trigger
# # RCBXH
u_res_nxcals_rcbxh_df = query_rcbxh.query_iqps_nxcals(timestamp_fgc_rcbxh, signal_names=['U_RES'], spark=spark)[0]
# # RCBXV
u_res_nxcals_rcbxv_df = query_rcbxv.query_iqps_nxcals(timestamp_fgc_rcbxv, signal_names=['U_RES'], spark=spark)[0]
# QDS PM
# # RCBXH
source_timestamp_qds_rcbxh_df = query_rcbxh.find_source_timestamp_qds(timestamp_fgc_rcbxh, duration=[(2, 's'), (2, 's')])
timestamp_qds_rcbxh = np.nan if source_timestamp_qds_rcbxh_df.empty else source_timestamp_qds_rcbxh_df.loc[0, 'timestamp']
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'])
# # RCBXV
source_timestamp_qds_rcbxv_df = query_rcbxv.find_source_timestamp_qds(timestamp_fgc_rcbxv, duration=[(2, 's'), (2, 's')])
timestamp_qds_rcbxv = np.nan if source_timestamp_qds_rcbxv_df.empty else source_timestamp_qds_rcbxv_df.loc[0, 'timestamp']
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'])
# LEADS
# # RCBXH
leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[0]) if 'LEADS' in x][0]
source_timestamp_leads_rcbxh_df = query_rcbxh.find_timestamp_leads(timestamp_fgc_rcbxh, leads_name)
u_hts_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')])
u_res_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')])
# # RCBXV
leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[1]) if 'LEADS' in x][0]
source_timestamp_leads_rcbxv_df = query_rcbxv.find_timestamp_leads(timestamp_fgc_rcbxv, leads_name)
u_hts_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')])
u_res_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')])
# Create results table - RCBXH/V
results_table = query_rcbxh.create_report_analysis_template_rcbx(timestamp_fgc_rcbxh, timestamp_fgc_rcbxv, circuit_names, author=author)
analysis_rcbxh = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)
analysis_rcbxv = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)
```
%% Cell type:markdown id: tags:
# 3. Timestamps
The analysis for MP3 consists of checking the existence of PM file and of consistency of the PM time stamps (PC, QPS, EE if applicable). The criterion of passing this test described in detail in 600APIC2.
In short the following criteria should be checked:
- 2 PM DQAMGNA (A+B) files should be generated for 600 A circuits without EE
- Difference between QPS board A and B timestamp = 1 ms
- PC time stamp is QPS time stamp plus-minus 20 ms
- EE time stamp can be plus-minus 20 ms from the QPS time stamp.
If this is not the case, an in-depth analysis has to be performed by the QPS team.
%% Cell type:code id: tags:
``` python
timestamp_dct = {'FGC_RCBXH': timestamp_fgc_rcbxh, 'FGC_RCBXV': timestamp_fgc_rcbxv,
'PIC_RCBXH': timestamp_pic_rcbxh, 'PIC_RCBXV': timestamp_pic_rcbxv,
'QDS_A_RCBXH':source_timestamp_qds_rcbxh_df.loc[0, 'timestamp'] if len(source_timestamp_qds_rcbxh_df) > 0 else np.nan,
'QDS_B_RCBXH':source_timestamp_qds_rcbxh_df.loc[1, 'timestamp'] if len(source_timestamp_qds_rcbxh_df) > 1 else np.nan,
'QDS_A_RCBXV':source_timestamp_qds_rcbxv_df.loc[0, 'timestamp'] if len(source_timestamp_qds_rcbxv_df) > 0 else np.nan,
'QDS_B_RCBXV':source_timestamp_qds_rcbxv_df.loc[1, 'timestamp'] if len(source_timestamp_qds_rcbxv_df) > 1 else np.nan}
analysis_rcbxh.create_timestamp_table(timestamp_dct, circuit_name=circuit_names[0])
```
%% Cell type:markdown id: tags:
# 4. PC
## 4.1. Main Current
*QUERY*:
- PM for the main current of the power converter, I_MEAS
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_meas_df |DataFrame |A |Main current of the power converter, I_MEAS|
*ANALYSIS*:
- calculation of the ramp rate
- calculation of the duration of a plateau prior to a quench
*PLOT*:
- current of the power converter on the left axis, I_MEAS
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
t_quench = analysis_rcbxh.find_time_of_quench(i_ref_rcbxh_df, i_a_rcbxh_df)
analysis_rcbxh.plot_i_meas_pc(circuit_names[0], timestamp_fgc_rcbxh, [i_meas_rcbxh_df, i_ref_rcbxh_df, i_a_rcbxh_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rcbxh.plot_i_meas_pc_zoom(circuit_names[0], timestamp_fgc_rcbxh, t_quench, [i_meas_rcbxh_df, i_ref_rcbxh_df, i_a_rcbxh_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rcbxh.analyze_i_meas_pc_trigger(timestamp_fgc_rcbxh, events_action_rcbxh_df, events_symbol_rcbxh_df)
analysis_rcbxh.calculate_current_miits(i_meas_rcbxh_df, t_quench, col_name='I_MEAS MIITs H')
analysis_rcbxh.calculate_quench_current(i_meas_rcbxh_df, t_quench, col_name='I_Q_H')
analysis_rcbxh.calculate_current_slope(i_meas_rcbxh_df, col_name='Ramp Rate H')
t_quench = analysis_rcbxv.find_time_of_quench(i_ref_rcbxv_df, i_a_rcbxv_df)
analysis_rcbxv.plot_i_meas_pc(circuit_names[1], timestamp_fgc_rcbxv, [i_meas_rcbxv_df, i_ref_rcbxv_df, i_a_rcbxv_df], xlim=(t_quench-1, t_quench+1))
analysis_rcbxv.plot_i_meas_pc_zoom(circuit_names[1], timestamp_fgc_rcbxv, t_quench, [i_meas_rcbxv_df, i_ref_rcbxv_df, i_a_rcbxv_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rcbxv.analyze_i_meas_pc_trigger(timestamp_fgc_rcbxv, events_action_rcbxv_df, events_symbol_rcbxv_df)
analysis_rcbxv.calculate_current_miits(i_meas_rcbxv_df, t_quench, col_name='I_MEAS MIITs V')
analysis_rcbxv.calculate_quench_current(i_meas_rcbxv_df, t_quench, col_name='I_Q_V')
analysis_rcbxv.calculate_current_slope(i_meas_rcbxv_df, col_name='Ramp Rate V')
analysis_rcbxh.results_table[['Circuit Name', 'Date', 'Time', 'I_Q_H', 'I_Q_V', 'I_MEAS MIITs H', 'I_MEAS MIITs V', 'Ramp Rate H', 'Ramp Rate V', 'Plateau Duration']]
```
%% Cell type:markdown id: tags:
## 4.2. Earth Current
*QUERY*:
- PM for the earth current of power converter, I_EARTH
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_earth_df |DataFrame |A |Earth current of the power converter, I_EARTH|
*ANALYSIS*:
- calculation of the maximum earth current
*PLOT*:
- current of the power converter on the left axis, I_EARTH
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcbxh.plot_i_earth_pc(circuit_names[0], timestamp_fgc_rcbxh, i_earth_rcbxh_df)
analysis_rcbxh.calculate_max_i_earth_pc(i_earth_rcbxh_df, col_name='Earth Current H')
analysis_rcbxv.plot_i_earth_pc(circuit_names[1], timestamp_fgc_rcbxv, i_earth_rcbxv_df)
analysis_rcbxv.calculate_max_i_earth_pc(i_earth_rcbxv_df, col_name='Earth Current V')
```
%% Cell type:markdown id: tags:
# 5. QDS
## 5.1. Resistive Voltage
*QUERY*:
- PM for the resistive voltage of magnets measured with QPS, U_RES
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|u_res_df |DataFrame |V |Resistive voltage of magnets measured with QPS, U_RES|
*ANALYSIS*:
- Initial voltage rise of U_RES signal, calculting by dividing the detection threshold voltage by the time it took for U_RES to rise to the threshold (from 50 to 250 mV).
- **Warning in case the slope of U_RES differs from history.**
- The quench voltage U_RES is calculated according to the following formula:
\begin{equation}
U_{\text{RES}} = U_{\text{DIFF}} + L d/dt (I+U_{\text{DIFF}}/R),
\end{equation}
where I = I_DCCT is heavily filtered over 1.3 s to make the calculation stable. It can be seen from the sign convention in Fig. 1 that a resistive voltage always has the opposite sign than the measured current. 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.
*PLOT*:
- resistive voltage of magnets measured with QPS on the left axis, U_RES
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcbxh.plot_u_res(circuit_names[0], timestamp_qds_rcbxh, u_res_nxcals_rcbxh_df)
u_res_rcbxh_slope_df = analysis_rcbxh.calculate_u_res_slope(u_res_rcbxh_df, col_name='dUres/dt H')
analysis_rcbxh.plot_u_res_slope(circuit_names[0], timestamp_qds_rcbxh, u_res_rcbxh_df, u_res_rcbxh_slope_df)
analysis_rcbxv.plot_u_res(circuit_names[1], timestamp_qds_rcbxv, u_res_nxcals_rcbxv_df)
u_res_rcbxv_slope_df = analysis_rcbxv.calculate_u_res_slope(u_res_rcbxv_df, col_name='dUres/dt V')
analysis_rcbxv.plot_u_res_slope(circuit_names[1], timestamp_qds_rcbxv, u_res_rcbxv_df, u_res_rcbxv_slope_df)
analysis_rcbxh.results_table[['Circuit Name', 'Date', 'Time', 'dUres/dt H', 'dUres/dt V']]
```
%% Cell type:markdown id: tags:
## 5.2. I_DCCT, I_DIDT Currents; U_RES, U_DIFF Voltages
*QUERY*:
- PM for the DC current leads of QPS, I_DCCT
- PM for the didt current leads of QPS, I_DIDT
- PM for the diffrential voltage of QPS, U_DIFF
- PM for the resistive voltage of QPS, U_REF
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_dcct_df |DataFrame |A |DC current leads of QPS, I_DCCT|
*ANALYSIS*:
- *No analysis is performed*
*PLOT*:
- current of the DC current leads of QPS on the left axis, I_DCCT
- didt current leads of QPS on the left axis, I_DIDT
- diffrential voltage of QPS on the right axis, U_DIFF
- resistive voltage of QPS on the right axis, U_RES
- t = 0 s corresponds to the QPS timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcbxh.analyze_qds(circuit_names[0], timestamp_qds_rcbxh, i_dcct_rcbxh_df, i_didt_rcbxh_df, u_diff_rcbxh_df, u_res_rcbxh_df, col_names=['Reason H', 'Quench Origin H'])
analysis_rcbxv.analyze_qds(circuit_names[1], timestamp_qds_rcbxv, i_dcct_rcbxv_df, i_didt_rcbxv_df, u_diff_rcbxv_df, u_res_rcbxv_df, col_names=['Reason V', 'Quench Origin V'])
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)
# Get expert input on reason
analysis.results_table['Reason H'] = get_expert_decision('Reason for FPA: ', ['quench', 'coupling', 'other'])
# Get expert input on quench origin
analysis.results_table['Quench Origin H'] = get_expert_decision('Origin of a quench', ['magnet', 'busbar', 'other'])
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)
# Get expert input on reason
analysis.results_table['Reason V'] = get_expert_decision('Reason for FPA: ', ['quench', 'coupling', 'other'])
# Get expert input on quench origin
analysis.results_table['Quench Origin V'] = get_expert_decision('Origin of a quench', ['magnet', 'busbar', 'other'])
```
%% Cell type:markdown id: tags:
# 6. LEADS
## 6.1. Plot of Current Leads
*QUERY*:
- PM for leads voltage, U_HTS, U_RES
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|u_leads_df |DataFrame |V |Leads voltage, U_HTS, U_RES|
*ANALYSIS*:
- quench detection for U_HTS for 2 consecutive datapoints above the threshold **(3 mV)**
- detection for U_RES for 2 consecutive datapoints above the threshold **(100 mV)**
*PLOT*:
- voltage of the normal conducting leads on the left axis, U_RES
- voltage of the HTS leads on the left axis, U_HTS
- t = 0 s corresponds to the LEADS timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcbxh.analyze_leads_voltage(u_hts_rcbxh_dfs, circuit_names[0], timestamp_fgc_rcbxh, signal='U_HTS', value_min=-0.003, value_max=0.003)
analysis_rcbxh.analyze_leads_voltage(u_res_rcbxh_dfs, circuit_names[0], timestamp_fgc_rcbxh, signal='U_RES', value_min=-0.1, value_max=0.1)
analysis_rcbxv.analyze_leads_voltage(u_hts_rcbxv_dfs, circuit_names[1], timestamp_fgc_rcbxv, signal='U_HTS', value_min=-0.003, value_max=0.003)
analysis_rcbxv.analyze_leads_voltage(u_res_rcbxv_dfs, circuit_names[1], timestamp_fgc_rcbxv, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
# 7. Final Report
## 7.1. Display Results Table
%% Cell type:code id: tags:
``` python
pd.set_option('display.max_columns', None)
analysis_rcbxh.results_table
```
%% Cell type:markdown id: tags:
## 7.2. Write Results Table to CSV
%% Cell type:code id: tags:
``` python
timestamp_fgc = timestamp_fgc_rcbxh if not np.isnan(timestamp_fgc_rcbxh) else timestamp_fgc_rcbxv
file_name = "{}-{}-PM_600A_RCBX_FPA".format(Time.to_datetime(timestamp_fgc).strftime("%Y.%m.%d_%H%M%S.%f"), analysis_start_time)
```
%% Cell type:code id: tags:
``` python
# Create folder for circuit_name
circuit_name = circuit_names[0]
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
analysis_rcbxh.results_table.to_csv('/eos/project/l/lhcsm/operation/600A/{}/{}_results_table.csv'.format(circuit_name, file_name))
```
%% Cell type:markdown id: tags:
## 7.3. Display MP3 Results Table
%% Cell type:code id: tags:
``` python
mp3_results_table = analysis_rcbxh.create_mp3_results_table_rcbxhv()
mp3_results_table
```
%% Cell type:markdown id: tags:
## 7.4. Write MP3 Quench Database Table to CSV
%% Cell type:code id: tags:
``` python
# Create folder for circuit_name
circuit_name = circuit_names[0]
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
mp3_results_table.to_csv('/eos/project/l/lhcsm/operation/600A/{}/{}_mp3_results_table.csv'.format(circuit_name, file_name))
```
%% Cell type:markdown id: tags:
## 7.5. Export Notebook as an HTML File
%% Cell type:code id: tags:
``` python
file_name_html = file_name + '_report.html'
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
!{sys.executable} -m jupyter nbconvert --to html $'AN_600A_RCBXHV_FPA.ipynb' --output /eos/project/l/lhcsm/operation/600A/$circuit_name/$file_name_html
```
%% Cell type:code id: tags:
``` python
```
......
%% Cell type:markdown id: tags:
<h1><center>Analysis of an FPA in an 600A Circuit - RCD-RCO Family</center></h1>
Figure below shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/600A/600A_without_EE.png" width=75%>
source: Test Procedure and Acceptance Criteria for the 600 A Circuits, MP3 Procedure, <a href="https://edms.cern.ch/document/874716/5.3">https://edms.cern.ch/document/874716/5.3</a>
%% Cell type:markdown id: tags:
# Analysis Assumptions
- 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.
- In case an analyzed signal can't be queried, a particular analysis is skipped. In other words, all signals have to be available in order to perform an analysis.
- 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).
# Plot Convention
- Scales are labeled with signal name followed by a comma and a unit in the square bracket, e.g., I_MEAS, [A]
- If a reference signal is present, it is represented with a dashed line
- 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.
- The grid comes from the left axis
- Title contains timestamp, circuit name, signal name allowing for re-access the signal.
- 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).
- Each plot has an individual time-synchronization mentioned explicitly in the description.
- If an axis has a single signal, change color of the label to match the signal's color. Otherwise, the label color is black.
%% Cell type:markdown id: tags:
# 0. Initialise Working Environment
## 0.1. Import Necessary Packages
%% Cell type:code id: tags:
``` python
import io
import re
import sys
import pandas as pd
import numpy as np
from datetime import datetime
# lhc-sm-api
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.pyedsl.QueryBuilder import QueryBuilder
from lhcsmapi.analysis.R600ACircuitQuery import R600ACircuitQuery
from lhcsmapi.analysis.CircuitAnalysis import get_expert_decision
from lhcsmapi.analysis.R600ACircuitAnalysis import R600ACircuitAnalysis
from lhcsmapi.metadata.SignalMetadata import SignalMetadata
# GUI
from lhcsmapi.gui.qh.DateTimeBaseModule import DateTimeBaseModule
from lhcsmapi.gui.pc.FgcPmSearchModuleMediator import FgcPmSearchModuleMediator
from lhcsmapi.gui.pc.R600AFgcPmSearchBaseModule import R600ARcdoFgcPmSearchBaseModule
analysis_start_time = datetime.now().strftime("%Y.%m.%d_%H%M%S.%f")
```
%% Cell type:markdown id: tags:
## 0.2. LHCSMAPI Version
%% Cell type:code id: tags:
``` python
import lhcsmapi
print('Analysis executed with lhcsmapi version: {}'.format(lhcsmapi.__version__))
```
%% Cell type:markdown id: tags:
## 0.3. Notebook Version
%% Cell type:code id: tags:
``` python
with io.open("../__init__.py", "rt", encoding="utf8") as f:
version = re.search(r'__version__ = "(.*?)"', f.read()).group(1)
print('Analysis executed with lhc-sm-hwc notebooks version: {}'.format(version))
```
%% Cell type:markdown id: tags:
# 1. Select FGC Post Mortem Entry
%% Cell type:code id: tags:
``` python
fgc_pm_search = FgcPmSearchModuleMediator(DateTimeBaseModule(start_date_time='2018-03-19 00:00:00+01:00',
end_date_time='2018-03-20 00:00:00+01:00'), R600ARcdoFgcPmSearchBaseModule(), circuit_type='600A_RCDO')
display(fgc_pm_search.widget)
```
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:
``` python
with Timer():
author = fgc_pm_search.get_author()
is_automatic = fgc_pm_search.is_automatic_mode()
circuit_type = '600A'
circuit_names = fgc_pm_search.get_fgc_circuit()
timestamp_fgc_rcd, timestamp_fgc_rco = fgc_pm_search.get_fgc_timestamp()
query_rcd = R600ACircuitQuery(circuit_type, circuit_names[0])
query_rco = R600ACircuitQuery(circuit_type, circuit_names[1])
# RCD
i_meas_rcd_df, i_a_rcd_df, i_ref_rcd_df, i_earth_rcd_df = query_rcd.query_pc_pm(timestamp_fgc_rcd, timestamp_fgc_rcd,
signal_names=['I_MEAS', 'I_A', 'I_REF', 'I_EARTH'])
events_action_rcd_df, events_symbol_rcd_df = query_rcd.query_pc_pm_events(timestamp_fgc_rcd, signal_names=['ACTION', 'SYMBOL'])
# RCO
i_meas_rco_df, i_a_rco_df, i_ref_rco_df, i_earth_rco_df = query_rco.query_pc_pm(timestamp_fgc_rco, timestamp_fgc_rco,
signal_names=['I_MEAS', 'I_A', 'I_REF', 'I_EARTH'])
events_action_rco_df, events_symbol_rco_df = query_rco.query_pc_pm_events(timestamp_fgc_rco, signal_names=['ACTION', 'SYMBOL'])
# PIC
# # RCD
timestamp_pic_rcd = query_rcd.find_timestamp_pic(timestamp_fgc_rcd, spark=spark)
# # RCO
timestamp_pic_rco = query_rco.find_timestamp_pic(timestamp_fgc_rco, spark=spark)
# QDS NXCALS - To check if there was any drift of QDS cards prior to the trigger
# # RCD
u_res_nxcals_rcd_df = query_rcd.query_iqps_nxcals(timestamp_fgc_rcd, signal_names=['U_RES'], spark=spark)[0]
# # RCO
u_res_nxcals_rco_df = query_rco.query_iqps_nxcals(timestamp_fgc_rco, signal_names=['U_RES'], spark=spark)[0]
# QDS PM
# # RCD
source_timestamp_qds_rcd_df = query_rcd.find_source_timestamp_qds(timestamp_fgc_rcd, duration=[(2, 's'), (2, 's')])
timestamp_qds_rcd = np.nan if source_timestamp_qds_rcd_df.empty else source_timestamp_qds_rcd_df.loc[0, 'timestamp']
i_dcct_rcd_df, i_didt_rcd_df, u_res_rcd_df, u_diff_rcd_df = query_rcd.query_qds_pm(timestamp_qds_rcd, timestamp_qds_rcd,
signal_names=['I_DCCT', 'I_DIDT', 'U_RES', 'U_DIFF'])
# # RCO
source_timestamp_qds_rco_df = query_rco.find_source_timestamp_qds(timestamp_fgc_rco, duration=[(2, 's'), (2, 's')])
timestamp_qds_rco = np.nan if source_timestamp_qds_rco_df.empty else source_timestamp_qds_rco_df.loc[0, 'timestamp']
i_dcct_rco_df, i_didt_rco_df, u_res_rco_df, u_diff_rco_df = query_rco.query_qds_pm(timestamp_qds_rco, timestamp_qds_rco,
signal_names=['I_DCCT', 'I_DIDT', 'U_RES', 'U_DIFF'])
# LEADS
# # RCD
leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[0]) if 'LEADS' in x][0]
source_timestamp_leads_rcd_df = query_rcd.find_timestamp_leads(timestamp_fgc_rcd, leads_name)
u_hts_rcd_dfs = query_rcd.query_leads(timestamp_fgc_rcd, source_timestamp_leads_rcd_df, system=leads_name, signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])
u_res_rcd_dfs = query_rcd.query_leads(timestamp_fgc_rcd, source_timestamp_leads_rcd_df, system=leads_name, signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])
# # RCO
leads_name = [x for x in SignalMetadata.get_system_types_per_circuit_name(circuit_type, circuit_names[1]) if 'LEADS' in x][0]
source_timestamp_leads_rco_df = query_rco.find_timestamp_leads(timestamp_fgc_rco, leads_name)
u_hts_rco_dfs = query_rco.query_leads(timestamp_fgc_rco, source_timestamp_leads_rco_df, system=leads_name, signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])
u_res_rco_dfs = query_rco.query_leads(timestamp_fgc_rco, source_timestamp_leads_rco_df, system=leads_name, signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])
# Create results table - RCD/O
results_table = query_rcd.create_report_analysis_template_rcd(timestamp_fgc_rcd, timestamp_fgc_rco, circuit_names, author=author)
analysis_rcd = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)
analysis_rco = R600ACircuitAnalysis(circuit_type, results_table, is_automatic=is_automatic)
```
%% Cell type:markdown id: tags:
# 3. Timestamps
The analysis for MP3 consists of checking the existence of PM file and of consistency of the PM time stamps (PC, QPS, EE if applicable). The criterion of passing this test described in detail in 600APIC2.
In short the following criteria should be checked:
- 2 PM DQAMGNA (A+B) files should be generated for 600 A circuits without EE
- Difference between QPS board A and B timestamp = 1 ms
- PC time stamp is QPS time stamp plus-minus 20 ms
- EE time stamp can be plus-minus 20 ms from the QPS time stamp.
If this is not the case, an in-depth analysis has to be performed by the QPS team.
%% Cell type:code id: tags:
``` python
timestamp_dct = {'FGC_RCD': timestamp_fgc_rcd, 'FGC_RCO': timestamp_fgc_rco,
'PIC_RCD': timestamp_pic_rcd, 'PIC_RCO': timestamp_pic_rco,
'QDS_A_RCD':source_timestamp_qds_rcd_df.loc[0, 'timestamp'] if len(source_timestamp_qds_rcd_df) > 0 else np.nan,
'QDS_B_RCD':source_timestamp_qds_rcd_df.loc[1, 'timestamp'] if len(source_timestamp_qds_rcd_df) > 1 else np.nan,
'QDS_A_RCO':source_timestamp_qds_rco_df.loc[0, 'timestamp'] if len(source_timestamp_qds_rco_df) > 0 else np.nan,
'QDS_B_RCO':source_timestamp_qds_rco_df.loc[1, 'timestamp'] if len(source_timestamp_qds_rco_df) > 1 else np.nan}
analysis_rcd.create_timestamp_table(timestamp_dct, circuit_names[0])
```
%% Cell type:markdown id: tags:
# 4. PC
## 4.1. Main Current
*QUERY*:
- PM for the main current of the power converter, I_MEAS
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_meas_df |DataFrame |A |Main current of the power converter, I_MEAS|
*ANALYSIS*:
- calculation of the ramp rate
- **calculation of the duration of a plateau prior to a quench**
*PLOT*:
- current of the power converter on the left axis, I_MEAS
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
t_quench = analysis_rcd.find_time_of_quench(i_ref_rcd_df, i_a_rcd_df)
analysis_rcd.plot_i_meas_pc(circuit_names[0], timestamp_fgc_rcd, [i_meas_rcd_df, i_ref_rcd_df, i_a_rcd_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rcd.plot_i_meas_pc_zoom(circuit_names[0], timestamp_fgc_rcd, t_quench, [i_meas_rcd_df, i_ref_rcd_df, i_a_rcd_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rcd.analyze_i_meas_pc_trigger(timestamp_fgc_rcd, events_action_rcd_df, events_symbol_rcd_df)
analysis_rcd.calculate_current_miits(i_meas_rcd_df, t_quench, col_name='I_MEAS MIITs RCD')
analysis_rcd.calculate_quench_current(i_meas_rcd_df, t_quench, col_name='I_Q_RCD')
analysis_rcd.calculate_current_slope(i_meas_rcd_df, col_name='Ramp Rate RCD')
t_quench = analysis_rco.find_time_of_quench(i_ref_rco_df, i_a_rco_df)
analysis_rco.plot_i_meas_pc(circuit_names[1], timestamp_fgc_rco, [i_meas_rco_df, i_ref_rco_df, i_a_rco_df], xlim=(t_quench-1, t_quench+1))
analysis_rco.plot_i_meas_pc_zoom(circuit_names[1], timestamp_fgc_rco, t_quench, [i_meas_rco_df, i_ref_rco_df, i_a_rco_df], xlim=(t_quench-0.1, t_quench+0.1))
analysis_rco.analyze_i_meas_pc_trigger(timestamp_fgc_rco, events_action_rco_df, events_symbol_rco_df)
analysis_rco.calculate_current_miits(i_meas_rco_df, t_quench, col_name='I_MEAS MIITs RCO')
analysis_rco.calculate_quench_current(i_meas_rco_df, t_quench, col_name='I_Q_RCO')
analysis_rco.calculate_current_slope(i_meas_rco_df, col_name='Ramp Rate RCO')
analysis_rcd.results_table[['Circuit Name', 'Date', 'Time', 'I_Q_RCD', 'I_Q_RCO', 'I_MEAS MIITs RCD', 'I_MEAS MIITs RCO', 'Ramp Rate RCD', 'Ramp Rate RCO', 'Plateau Duration']]
```
%% Cell type:markdown id: tags:
## 4.2. Earth Current
*QUERY*:
- PM for the earth current of power converter, I_EARTH
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_earth_df |DataFrame |A |Earth current of the power converter, I_EARTH|
*ANALYSIS*:
- calculation of the maximum earth current
*PLOT*:
- current of the power converter on the left axis, I_EARTH
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcd.plot_i_earth_pc(circuit_names[0], timestamp_fgc_rcd, i_earth_rcd_df)
analysis_rcd.calculate_max_i_earth_pc(i_earth_rcd_df, col_name='Earth Current RCD')
analysis_rco.plot_i_earth_pc(circuit_names[0], timestamp_fgc_rco, i_earth_rco_df)
analysis_rco.calculate_max_i_earth_pc(i_earth_rco_df, col_name='Earth Current RCO')
```
%% Cell type:markdown id: tags:
# 5. QDS
## 5.1. Resistive Voltage
*QUERY*:
- PM for the resistive voltage of magnets measured with QPS, U_RES
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|u_res_df |DataFrame |V |Resistive voltage of magnets measured with QPS, U_RES|
*ANALYSIS*:
- Initial voltage rise of U_RES signal, calculting by dividing the detection threshold voltage by the time it took for U_RES to rise to the threshold (from 50 to 250 mV).
- **Warning in case the slope of U_RES differs from history.**
- The quench voltage U_RES is calculated according to the following formula:
\begin{equation}
U_{\text{RES}} = U_{\text{DIFF}} + L d/dt (I+U_{\text{DIFF}}/R),
\end{equation}
where I = I_DCCT is heavily filtered over 1.3 s to make the calculation stable. It can be seen from the sign convention in Fig. 1 that a resistive voltage always has the opposite sign than the measured current. 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.
*PLOT*:
- resistive voltage of magnets measured with QPS on the left axis, U_RES
- t = 0 s corresponds to the FGC timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcd.plot_u_res(circuit_names[0], timestamp_qds_rcd, u_res_nxcals_rcd_df)
u_res_rcd_slope_df = analysis_rcd.calculate_u_res_slope(u_res_rcd_df, col_name='dUres/dt RCD')
analysis_rcd.plot_u_res_slope(circuit_names[0], timestamp_qds_rcd, u_res_rcd_df, u_res_rcd_slope_df)
analysis_rco.plot_u_res(circuit_names[1], timestamp_qds_rco, u_res_nxcals_rco_df)
u_res_rco_slope_df = analysis_rco.calculate_u_res_slope(u_res_rco_df, col_name='dUres/dt RCO')
analysis_rco.plot_u_res_slope(circuit_names[1], timestamp_qds_rco, u_res_rco_df, u_res_rco_slope_df)
analysis_rcd.results_table[['Circuit Name', 'Date', 'Time', 'dUres/dt RCD', 'dUres/dt RCO']]
```
%% Cell type:markdown id: tags:
## 5.2. I_DCCT, I_DIDT Currents; U_RES, U_DIFF Voltages
*QUERY*:
- PM for the DC current leads of QPS, I_DCCT
- PM for the didt current leads of QPS, I_DIDT
- PM for the diffrential voltage of QPS, U_DIFF
- PM for the resistive voltage of QPS, U_REF
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|i_dcct_df |DataFrame |A |DC current leads of QPS, I_DCCT|
*ANALYSIS*:
- *No analysis is performed*
*PLOT*:
- current of the DC current leads of QPS on the left axis, I_DCCT
- didt current leads of QPS on the left axis, I_DIDT
- diffrential voltage of QPS on the right axis, U_DIFF
- resistive voltage of QPS on the right axis, U_RES
- t = 0 s corresponds to the QPS timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcd.analyze_qds(circuit_names[0], timestamp_qds_rcd, i_dcct_rcd_df, i_didt_rcd_df, u_diff_rcd_df, u_res_rcd_df, col_names=['Reason RCD', 'Quench Origin RCD'])
analysis_rco.analyze_qds(circuit_names[1], timestamp_qds_rco, i_dcct_rco_df, i_didt_rco_df, u_diff_rco_df, u_res_rco_df, col_names=['Reason RCO', 'Quench Origin RCO'])
analysis_rcd.plot_qds(circuit_names[0], timestamp_qds_rcd, i_dcct_rcd_df, i_didt_rcd_df, u_diff_rcd_df, u_res_rcd_df)
# Get expert input on reason
analysis.results_table['Reason RCD'] = get_expert_decision('Reason for FPA: ', ['quench', 'coupling', 'other'])
# Get expert input on quench origin
analysis.results_table['Quench Origin RCD'] = get_expert_decision('Origin of a quench', ['magnet', 'busbar', 'other'])
analysis_rco.plot_qds(circuit_names[1], timestamp_qds_rco, i_dcct_rco_df, i_didt_rco_df, u_diff_rco_df, u_res_rco_df)
# Get expert input on reason
analysis.results_table['Reason RCO'] = get_expert_decision('Reason for FPA: ', ['quench', 'coupling', 'other'])
# Get expert input on quench origin
analysis.results_table['Quench Origin RCO'] = get_expert_decision('Origin of a quench', ['magnet', 'busbar', 'other'])
```
%% Cell type:markdown id: tags:
# 6. LEADS
## 6.1. Plot of Current Leads
*QUERY*:
- PM for leads voltage, U_HTS, U_RES
*INPUT*:
|Variable Name |Variable Type |Variable Unit |Comment
|---------------|---------------|---------------|------|
|circuit_type |str |- |Type of the analyzed circuit, e.g., '600A'|
|circuit_name |str |- |Name of the analyzed circuit, e.g., 'RQTL9.L7B2'|
|u_leads_df |DataFrame |V |Leads voltage, U_HTS, U_RES|
*ANALYSIS*:
- quench detection for U_HTS for 2 consecutive datapoints above the threshold **(3 mV)**
- detection for U_RES for 2 consecutive datapoints above the threshold **(100 mV)**
*PLOT*:
- voltage of the normal conducting leads on the left axis, U_RES
- voltage of the HTS leads on the left axis, U_HTS
- t = 0 s corresponds to the LEADS timestamp.
*OUTPUT*:
- *No output is generated*
%% Cell type:code id: tags:
``` python
analysis_rcd.analyze_leads_voltage(u_hts_rcd_dfs, circuit_names[0], timestamp_fgc_rcd, signal='U_HTS', value_min=-0.003, value_max=0.003)
analysis_rcd.analyze_leads_voltage(u_res_rcd_dfs, circuit_names[0], timestamp_fgc_rcd, signal='U_RES', value_min=-0.1, value_max=0.1)
analysis_rco.analyze_leads_voltage(u_hts_rco_dfs, circuit_names[1], timestamp_fgc_rco, signal='U_HTS', value_min=-0.003, value_max=0.003)
analysis_rco.analyze_leads_voltage(u_res_rco_dfs, circuit_names[1], timestamp_fgc_rco, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
# 7. Final Report
## 7.1. Display Results Table
%% Cell type:code id: tags:
``` python
pd.set_option('display.max_columns', None)
analysis_rcd.results_table
```
%% Cell type:markdown id: tags:
## 7.2. Write Results Table to CSV
%% Cell type:code id: tags:
``` python
timestamp_fgc = timestamp_fgc_rcd if not np.isnan(timestamp_fgc_rcd) else timestamp_fgc_rco
file_name = "{}-{}-PM_600A_RCD-RCO_FPA".format(Time.to_datetime(timestamp_fgc).strftime("%Y.%m.%d_%H%M%S.%f"), analysis_start_time)
```
%% Cell type:code id: tags:
``` python
# Create folder for circuit_name
circuit_name = circuit_names[0]
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
analysis_rcd.results_table.to_csv('/eos/project/l/lhcsm/operation/600A/{}/{}_results_table.csv'.format(circuit_name, file_name))
```
%% Cell type:markdown id: tags:
## 7.3. Display MP3 Results Table
%% Cell type:code id: tags:
``` python
mp3_results_table = analysis_rcd.create_mp3_results_table_rcdo()
mp3_results_table
```
%% Cell type:markdown id: tags:
## 7.4. Write MP3 Quench Database Table to CSV
%% Cell type:code id: tags:
``` python
# Create folder for circuit_name
circuit_name = circuit_names[0]
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
mp3_results_table.to_csv('/eos/project/l/lhcsm/operation/600A/{}/{}_mp3_results_table.csv'.format(circuit_name, file_name))
```
%% Cell type:markdown id: tags:
## 7.5. Export Notebook as an HTML File
%% Cell type:code id: tags:
``` python
file_name_html = file_name + '_report.html'
!mkdir -p /eos/project/l/lhcsm/operation/600A/$circuit_name
!{sys.executable} -m jupyter nbconvert --to html $'AN_600A_RCDO_FPA.ipynb' --output /eos/project/l/lhcsm/operation/600A/$circuit_name/$file_name_html
```
......
This source diff could not be displayed because it is too large. You can view the blob instead.
%% Cell type:markdown id: tags:
# Notebooks for Circuit Analysis of HWC Tests and Events during Operation
Although, as the project name indicates, our primary goal is the development of signal monitoring applications, we realized that the analysis modules developed so far can be pieced together into HWC test and operation analysis notebooks.
Even though, we develop the analyses system by system, they were developed in a general way to account for all circuits in which the system was present. Thus, by taking a perpendicular view of the analysis table, a circuit analysis for this stance was possible.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/monitoring-vs-hwc.png" width=50%></center>
In particular, thotebooks are suited for HWC tests:
- can be adjusted on-the-fly for new requirements while performing a test;
- can immediately generate a report for storage and distribution among a team of domain experts;
- provide a sequential way of testing each system in a given order.
%% Cell type:markdown id: tags:
# Supported Circuits
## 1. RB - Main Dipole Circuit
<center><img src = "https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%></center>
<p>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></p>
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|HWC|PIC2|I_MIN_OP|Interlock tests with PC connected to the leads|[AN\_RB\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PIC2.ipynb)|[AN\_RB\_PIC2](https://sigmon.web.cern.ch/node/47)|
|HWC|PIC2|I\_MIN\_OP|Interlock tests with PC connected to the leads|[AN\_RB\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PIC2.ipynb)|[AN\_RB\_PIC2](https://sigmon.web.cern.ch/node/47)|
|HWC|PLI1.a2|I\_INJECTION|Current cycle to I\_INJECTION|[AN\_RB\_PLI1.a2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.a2.ipynb)|[AN\_RB\_PLI1.a2](https://sigmon.web.cern.ch/node/48)|
|HWC|PLI1.b2|I\_INJECTION|Energy Extraction from QPS|[AN\_RB\_PLI1.b2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.b2.ipynb)|[AN\_RB\_PLI1.b2](https://sigmon.web.cern.ch/node/49)|
|HWC|PLI1.d2|I\_INJECTION|Unipolar Powering Failure|[AN\_RB\_PLI1.d2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.d2.ipynb)|[AN\_RB\_PLI1.d2](https://sigmon.web.cern.ch/node/50)|
|HWC|PLI2.s1|I\_INTERM\_1|Splice Mapping|[AN\_RB\_PLI2.s1](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI2.s1.ipynb)|[AN\_RB\_PLI2.s1](https://sigmon.web.cern.ch/node/52)|
|HWC|PLI2.b2|I\_INTERM\_1|Energy Extraction from PIC during the ramp|[AN\_RB\_PLI2.b2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI2.b2.ipynb)|[AN\_RB\_PLI2.b2](https://sigmon.web.cern.ch/node/51)|
|HWC|PLIM.b2|I\_SM\_INT\_4|Energy Extraction from QPS|[AN\_RB\_PLIM.b2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLIM.b2.ipynb)|[AN\_RB\_PLIM.b2](https://sigmon.web.cern.ch/node/55)|
|HWC|PLIS.s2|I\_SM|Splice Mapping|[AN\_RB\_PLIS.s2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLIS.s2.ipynb)|[AN\_RB\_PLIS.s2](https://sigmon.web.cern.ch/node/56)|
|HWC|PLI3.a5|I\_INTERM\_2|Current cycle to I\_INTERM\_2|[AN\_RB\_PLI3.a5](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI3.a5.ipynb)|[AN\_RB\_PLI3.a5](https://sigmon.web.cern.ch/node/53)|
|HWC|PLI3.d2|I\_INTERM\_2|Unipolar Powering Failure|[AN\_RB\_PLI3.d2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI3.d2.ipynb)|[AN\_RB\_PLI3.d2](https://sigmon.web.cern.ch/node/54)|
|HWC|PNO.b2|I\_PNO+I\_DELTA|Energy Extraction from QPS|[AN\_RB\_PNO.b2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PNO.b2.ipynb)|[AN\_RB\_PNO.b2](https://sigmon.web.cern.ch/node/58)|
|HWC|PNO.a6|I\_PNO|Energy Extraction from QPS|[AN\_RB\_PNO.a6](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PNO.a6.ipynb)|[AN\_RB\_PNO.a6](https://sigmon.web.cern.ch/node/57)|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_RB\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_FPA.ipynb)|[AN\_RB\_FPA](https://sigmon.web.cern.ch/node/59)|
## 2. RQ - Main Quadrupole Circuit
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rq/RQ.png" width=75%></center>
<p>source: Test Procedure and Acceptance Criteria for the 13 kA Quadrupole (RQD-RQF) Circuits, MP3 Procedure, <a href="https://edms.cern.ch/document/874714/5.1">https://edms.cern.ch/document/874714/5.1</a></p>
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|HWC|PIC2|I_MIN_OP|Powering Interlock Controller|[AN\_RQ\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PIC2.ipynb)|[AN\_RQ\_PIC2](https://sigmon.web.cern.ch/node/61)|
|HWC|PIC2|I\_MIN\_OP|Powering Interlock Controller|[AN\_RQ\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PIC2.ipynb)|[AN\_RQ\_PIC2](https://sigmon.web.cern.ch/node/61)|
|HWC|PLI1.b3|I\_INJECTION|Energy Extraction from QPS|[AN\_RQ\_PLI1.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI1.b3.ipynb)|[AN\_RQ\_PLI1.b3](https://sigmon.web.cern.ch/node/62)|
|HWC|PLI1.d2|I\_INJECTION|Unipolar Powering Failure|[AN\_RQ\_PLI1.d2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI1.d2.ipynb)|[AN\_RQ\_PLI1.d2](https://sigmon.web.cern.ch/node/63)|
|HWC|PLI2.s1|I\_INTERM\_1|Splice Mapping|[AN\_RQ\_PLI2.s1](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI2.s1.ipynb)|[AN\_RQ\_PLI2.s1](https://sigmon.web.cern.ch/node/65)|
|HWC|PLI2.b3|I\_INTERM\_1|Energy Extraction from QPS|[AN\_RQ\_PLI2.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI2.b3.ipynb)|[AN\_RQ\_PLI2.b3](https://sigmon.web.cern.ch/node/64)|
|HWC|PLIM.b3|I\_SM\_INT\_4|Energy Extraction from QPS|[AN\_RQ\_PLIM.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLIM.b3.ipynb)|[AN\_RQ\_PLIM.b3](https://sigmon.web.cern.ch/node/68)|
|HWC|PLIS.s2|I\_SM|Splice Mapping at I_SM|[AN\_RQ\_PLIS.s2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLIS.s2.ipynb)|[AN\_RQ\_PLIS.s2](https://sigmon.web.cern.ch/node/69)|
|HWC|PLI3.a5|I\_SM, I\_INTERM_2|Current cycle to I\_INTERM_2|[AN\_RQ\_PLI3.a5](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI3.a5.ipynb)|[AN\_RQ\_PLI3.a5](https://sigmon.web.cern.ch/node/66)|
|HWC|PLI3.b3|I\_INTERM\_2|Energy Extraction from QPS|[AN\_RQ\_PLI3.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI3.b3.ipynb)|[AN\_RQ\_PLI3.b3](https://sigmon.web.cern.ch/node/67)|
|HWC|PNO.b3|I\_PNO+I\_DELTA|Energy Extraction from QPS|[AN\_RQ\_PNO.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PNO.b3.ipynb)|[AN\_RQ\_PNO.b3](https://sigmon.web.cern.ch/node/71)|
|HWC|PNO.a6|I\_PNO|Current cycle to I\_PNO|[AN\_RQ\_PNO.a6](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PNO.a6.ipynb)|[AN\_RQ\_PNO.a6](https://sigmon.web.cern.ch/node/70)|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_RQ\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_FPA.ipynb)|[AN\_RQ\_FPA](https://sigmon.web.cern.ch/node/60)|
## 3. 600A Circuits
The 600-A circuits come in one of two main variants:
- circuits with
- and without EE.
Each variant may or may not be equipped with a DC contactor ensuring the effectiveness of the crowbar in case of a PC short circuit. Moreover, the magnets of several circuits are equipped with parallel resistors, in order to decouple the current decay in a quenching magnet from that in the rest of the circuit. Figure 1 shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
Each variant may or may not be equipped with a DC contactor ensuring the effectiveness of the crowbar in case of a PC short circuit. Moreover, the magnets of several circuits are equipped with parallel resistors, in order to decouple the current decay in a quenching magnet from that in the rest of the circuit. Figure below shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/600A/600A.png" width=75%></center>
source: Test Procedure and Acceptance Criteria for the 600 A Circuits, MP3 Procedure, <a href="https://edms.cern.ch/document/874716/5.3">https://edms.cern.ch/document/874716/5.3</a>
Table below provides a list of circuits to be used with these analysis notebooks
|RCBX family|RCD/O family|Remaining 600A circuits with EE|Remaining 600A circuits without EE|
|-----------|------------|-------------------------------|----------------------------------|
|RCBXH1|RCD|RCS|RQS (RQS.L)|
|RCBXH2|RCO|RSS|RQSX3|
|RCBXH3| |ROD|RQT12|
|RCBXV1| |ROF|RQT13|
|RCBXV2| |RQTL9|RQTL7|
|RCBXV3| |RQS (RQS.A)|RQTL8|
| | |RQTD|RQTL10|
| | |RQTF|RQTL11|
| | |RSD1|
| | |RSD2|
| | |RSF1|
| | |RSF2|
| | |RU|
Another useful resource to find out which 600 A circuits belong to which category is the circuit tree on the MP3 website http://cern.ch/mp3
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_600A\_with\_without\_EE\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/600A/AN_600A_with_without_EE_FPA.ipynb)|-|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_600A\_RCDO\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/600A/AN_600A_RCDO_FPA.ipynb)|-|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_600A\_RCBXHV\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/600A/AN_600A_RCBXHV_FPA.ipynb)|-|
%% Cell type:markdown id: tags:
## 4. IT - Inner Triplet Circuits
The main quadrupole magnet circuits of the 8 Inner Triplet (IT) systems in the LHC are composed of four single aperture quadrupole magnets in series and have a particular powering configuration, consisting of three nested power converters (PC), see Figure below.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/it/IT.png" width=75%>
Main quadrupole magnet circuit of the Inner Triplet system for IT’s at points 1 and 5 (left) and IT’s at points 2 and 8 (right).
Note that the configuration for the IT’s in points 1 and 5 is different from the configuration in points 2 and 8. An earth detection system is present at the minus of the RTQX2 converter. Detailed information concerning the converters is given in EDMS 1054483.
The two magnets Q1 and Q3 are type MQXA and the two combined magnets Q2a and Q2b are type MQXB. Q1 is located towards the interaction point.
Note that the IT’s at points 2 and 8 have a slightly higher nominal operating current than the IT’s at points 1 and 5, see Table 1.
|Circuit|I\_PNO RQX|I\_PNO RTQX2|I\_PNO RTQX1|
|-------|----------|------------|------------|
|RQX.L2, RQX.R2, RQX.L8, RQX.R8|7180 A| 4780 A|550 A|
|RQX.L1, RQX.R1, RQX.L5, RQX.R5|6800 A| 4600 A|550 A|
Nominal operating currents for 7 TeV of the three PC’s as given in the LHC design report volume I. For the nominal current during HWC see EDMS 1375861.
source: Test Procedure and Acceptance Criteria for the Inner Triplet Circuits in the LHC, MP3 Procedure, <a href="https://edms.cern.ch/document/874886/2.1">https://edms.cern.ch/document/874886/2.1</a>
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|HWC|PCC.T4|~|Power Converter Configuration part 2|AN\_IT\_PCCT4|-|
|HWC|PIC|~|Powering Interlock Controller check with standby current|AN\_IT\_PIC|-|
|HWC|PNO.D12|10% of I\_PNO|Powering Failure at +10% of nominal current|AN\_IT\_PNO.D12|-|
|HWC|PNO.D13|10% of I\_PNO|Powering Failure at -10% of nominal current|AN\_IT\_PNO.D13|-|
|HWC|PLI3.F6|I_PLI3|Heater Discharge Request at 2nd intermediate current (Note that I\_RTQX1=0A|AN\_IT\_PNO.F6|-|
|HWC|PNO.D14|50% of I\_PNO|Powering Failure at +50% of nominal current during a SPA|AN\_IT\_PNO.D14|-|
|HWC|PNO.D15|50% of I\_PNO|Powering Failure at -50% of nominal current|AN\_IT\_PNO.D15|-|
|HWC|PNO.A9|I\_PNO+I\_DELTA|Training and plateau at nominal current|AN\_IT\_PNO.A9|-|
|HWC|PNO.D16|90% of I\_PNO|Powering Failure at +90% of nominal current|AN\_IT\_PNO.D16|-|
|HWC|PNO.D17|90% of I\_PNO|Powering Failure at -90% of nominal current|AN\_IT\_PNO.D17|-|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_IT\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/it/AN_IT_FPA.ipynb)|-|
%% Cell type:markdown id: tags:
# User Guide
The execution of notebooks is carried out with SWAN service (http://swan.cern.ch) and requires three steps:
1. Getting NXCALS Access (once only)
2. Logging to SWAN
3. Setting up an appropriate environment script (done at each login)
4. Running an appropriate notebook
## 1. NXCALS Access
The NXCALS database requires an assignment of dedicated access rights for a user.
If you want to query NXCALS with the API, please follow a procedure below on how to request the NXCALS access.
1. Go to http://nxcals-docs.web.cern.ch/current/user-guide/data-access/nxcals-access-request/ for most updated procedure
2. Send an e-mail to mailto:acc-logging-support@cern.ch with the following pieces of information:
- your NICE username
- system: WinCCOA, CMW
- NXCALS environment: PRO
Optionally one can mention that the NXCALS database will be accessed through SWAN.
Once the access is granted, you can use NXCALS with SWAN.
## 2. Logging to SWAN
The following steps should be followed in order to log-in to SWAN
1. Go to http://swan.cern.ch
2. Login with your NICE account
- SWAN is tightly integrated with CERNBox service (in fact, files created in SWAN are accessible in CERNBox). In case you have not used CERNBox, the following error message will be displayed in- dicating that your CERNBox account has not been activated yet. In order to activate your CERNBox account, please login on the website: http://cernbox.cern.ch. Afterwards, please login to SWAN service again. In case the error persists, please contact the SWAN support (see Section Help and Feedback at the bottom).
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-inactive-cernbox-error.png" width=50%></center>
## 3. Setting an Environment Script
In order to execute the HWC notebooks, one requires `lhc-sm-api` package and HWC notebooks. To this end, we created a dedicated environment script to prepare the SWAN project space.
The script sets a path to a virtual environment with the necessary packages (for more details, cf. https://lhc-sm-api.web.cern.ch/lhc-sm-api/user_install.html#preinstalled-packages) as well as makes a copy of HWC notebooks to `hwc` notebooks. **Note that in order to ensure compatibility between package and notebook versions, the `hwc` folder is deleted each time the script is executed'.**
Firstly, contact the Signal Monitoring team (mailto:lhc-signal-monitoring@cern.ch) in order to get read access to the EOS folder with pre-installed packages and HWC analysis notebooks.
Once the access is granted, at every log-in to SWAN, please provide the following environment script:
`/eos/project/l/lhcsm/public/packages_notebooks.sh`
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan_environment_script.png" width=25%></center>
Note the following settings while configuring environment:
- Software stack: `NXCals Python3`
- Platform: `CentOS 7 (gcc7)` - default
- Environment script: `/eos/project/l/lhcsm/public/packages_notebooks.sh`
- Number of cores: `4`
- Memory: `16`
- Spark cluster: `BE NXCALS (NXCals)`
## 4. Running Notebook
### 4.1. Open notebook
To do so simply click its name and a new page will be opened. The top of the notebook is presented in Figure below.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-rb-fpa-analysis-intro.png" width=50%></center>
### 4.2. Connect to the NXCALS Spark Cluster
Once a notebook is opened, please click a star button as shown in Figure below in order to open the Spark cluster configuration in a panel on the right side of an active notebook.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-open-spark-cluster-configuration.png" width=50%></center>
Figure below shows a three-step procedure of Spark cluster connection. The first step involves providing the NICE account password. The second step allows setting additional settings for the connection. In order to connect with NXCALS please make sure to enable the following options:
- Include NXCALS options - to connect to the cluster
- Include SparkMetrics options - to enable statistics helpful for analysing NXCALS queries
The last step is a confirmation of a successful connection to the cluster.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-spark-cluster-connection.png" width=75%></center>
### 4.3. Analysis Notebook Execution
A notebook is composed by cells. A cell contains either a markdown text with description or python code toexecute. Cells with markdown text have white background and can contain text, tables, figures, and hyperlinks.Cells with code have gray background and are executed by clicking a run icon in the top bar highlighted in Figure below. Alternatively, one can put a cursor in a cell with code an press a keyboard shortcut Ctrl+Enter.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-execute-cell.png" width=50%></center>
A state of a cell is indicated by square brackets located on the left to a cell. Execution of a cell is indicatedby a star in the square brackets. Once cell execution is completed the star changes into a number representingthe order of cell execution. A cell can execute for too long due to connection problems, issues with a databasequery, kernel problems. In this case, two actions are recommended:
1. Select from the top menu: Kernel -> Interrupt and execute the problematic cell again (either a run button (cf. Figure above) or Ctrl+Enter).
2. In case the first option does not help, select from the top menu Kernel -> Restart & Clear Output. Thenall cells prior to the problematic one have to be executed again (multiple cell selection is possible byclicking on the left of a cell to select it and afterwards selecting others with pressed Shift button). After this operation one needs to reconnect to the NXCALS Spark cluster.
%% Cell type:markdown id: tags:
# Analysis Notebook for Operation
Quench analysis assumptions:
1. We consider standard analysis scenarios, i.e., all signals can be queried from the respective databases. Depending on what signal is missing, an analysis can raise a warning and continue or an error and abort the analysis.
2. In case an analyzed signal can’t be queried, a particular analysis is skipped. In other words, all signals have to be available in order to perform an analysis.
3. 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).
# Analysis Workflow
An FPA analysis workflow consists of four steps: (i) finding of an FGC Post Mortem timestamp (ii) executing analysis cells on the cluster (iii); (iv) storing output files on EOS; see Figure below.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/fpa-analysis-workflow.png" width=75%></center>
The RB FPA Analysis notebook is organized into 11 chapters:
0. Initialise the working environment
Loads external packages as well as lhcsmapi classes required to perform analysis and plot results.
1. Select FGC Post Mortem Entry
After executing this cell, a FGC Post Mortem GUI with default settings is displayed.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-rb-fpa-analysis-fgc-pm-browser-empty.png" width=75%></center>
The GUI consists of 8 widgets described in Table below.
|Widget|Description|
|------|-----------|
|Circuit name|Circuit name|
|Start|Start date and time|
|End|End date and time|
|Analysis|Automatic (each cell executed without user input); Manual (some analysis steps take expert comment)|
|Done by|NICE login of a person executing the analysis|
|Find FGC PM entries|Button triggering a search of FGC PM entries|
|Query progress bar|Displays progress of querying days in between indicated datesFGC PM EntriesList of FGC PM timestamps|
**Please note that in order to execute any of the following cells, there should be at least one entry in the FGC PM Entries list. The list is populated after clicking [Find FGC PM entries button].**
Figure below shows the GUI after clicking button [Find FGC PM entries] with the default settings. Note that the list only contains FGC PM timestamps surrounded by QPS timestamps (1 minute before and 5 minutes after an FGC PM timestamp).
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-rb-fpa-analysis-fgc-pm-browser.png" width=75%></center>
2. Query All Signals Prior to Analysis
In order to avoid delays between analyses, the necessary signals are queried prior to performing the analysis.
3. Timestamps
Table of timestamps main systems representing the sequence of events for a given analysis.
4. Schematic
Interactive schematic of the RB circuit composed of: power converter, two energy extraction systems, current leads, magnets, and nQPS crates. Hovering a mouse over a center of a box representing a system provides additional pieces of information. Location of quenched magnets is highlighted. Slider below the schematic enables its scrolling.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb-schematic.png" width=75%></center>
5. PIC
Check of PIC timestamps
6. Power Converter
Analysis of the main power converter as well as earth currents.
7. Energy Extraction Analysis of the energy extraction voltage and temperature
8. Quench Protection System Analysis of the quench detection system, quench heaters, diode, voltage feel- ers, and diode leads.
9. Current Leads Analysis of the current leads voltage (resistive and HTS).
10. Plot of Energy Extraction after 3 h from an FPA
11. Final Report
Saving of the CSV results table and HTML report to EOS folder.
The RQ analysis notebook follows the same structure except for the lack of schematic. Typically, there is only a single main quadrupole magnet quenching and the schematic does not provide more information as compared to the timestamps table in point 3.
### Notebook Output
The notebook creates three output files in the folder //cern.ch/eos/project/l/lhcsm/operation/RB/circuit_name/\*}, e.g., //cern.ch/eos/project/l/lhcsm/operation/RB/RB.A12/\*:
- HTML report file with the snapshot of the entire notebook - [fgc-timestamp]-[analysis-execution-date]-[notebook-name]\_report.html;
- CSV file with MP3 results table with a subset analysis results - [fgc-timestamp]-[analysis-execution-date]-[notebook-name]\_mp3\_results\_table.csv};
- CSV file with full results table - [fgc-timestamp]-[analysis-execution-date]-[notebook-name]\_results_table.csv};
%% Cell type:markdown id: tags:
# Analysis Notebook for HWC
## Analysis Workflow
A HWC analysis workflow consists of four steps: (i) finding of start and end time of an HWC test (ii) executing analysis cells on the cluster (iii); (iv) storing output files on EOS; see Figure below.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/hwc-analysis-workflow.png" width=75%></center>
## Notebook Structure
Each notebook is composed of initial part with a circuit schematic, test current profile, and table summarising test criteria. This part is followed by package import instructions, display and the browser of HWC tests; see Figure below.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-hwc-browser.png" width=75%></center>
The remainder of each notebook depends on the particular test to be performed. At the end of an HWC notebook there are instructions for saving the output files.
## Notebook Output
The notebook creates three output files in the folder
```
//cern.ch/eos/project/l/lhcsm/hwc/RB/ circuit_name/hwc_test/hwc_campaign/*,
```
e.g.,
```
//cern.ch/eos/project/l/lhcsm/hwc/ RB/RB.A12/PNO.b2/HWC_2014/*:
```
- HTML report file with the snapshot of the entire notebook - [test-start]-[test-end]\_report.html;
%% Cell type:markdown id: tags:
# Help and Feedback
Despite thorough testing, while using LHC-SM quench analysis notebooks two types of issues can occur, related to:
- analysis (e.g., wrong analysis results, corrupted plots, etc.);
- SWAN (e.g., package installation problems, connection errors, service unavailability, etc.).
## 1. LHC Signal Monitoring
In order to provide feedback and ask for help regarding the analysis modules, you are cordially invited to contact the LHC Signal Monitoring team (mailto:lhc-signal-monitoring@cern.ch).
## 2. SWAN
There are three ways to contact SWAN support for help related to the service:
- Asking SWAN Community through a dedicated user forum: https://swan-community.web.cern.ch
- Creating a support SNOW ticket: https://cern.service-now.com/service-portal/function.do?name=swan
- Reporting a bug on dedicated JIRA platform: https://its.cern.ch/jira/projects/UCA/issues/UCA-359?filter=allopenissues
All three links are also available in the footer of SWAN website as shown below.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/swan-help.png" width=75%></center>
......
......@@ -18,7 +18,7 @@ In particular, thotebooks are suited for HWC tests:
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|HWC|PIC2|I_MIN_OP|Interlock tests with PC connected to the leads|[AN\_RB\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PIC2.ipynb)|[AN\_RB\_PIC2](https://sigmon.web.cern.ch/node/47)|
|HWC|PIC2|I\_MIN\_OP|Interlock tests with PC connected to the leads|[AN\_RB\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PIC2.ipynb)|[AN\_RB\_PIC2](https://sigmon.web.cern.ch/node/47)|
|HWC|PLI1.a2|I\_INJECTION|Current cycle to I\_INJECTION|[AN\_RB\_PLI1.a2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.a2.ipynb)|[AN\_RB\_PLI1.a2](https://sigmon.web.cern.ch/node/48)|
|HWC|PLI1.b2|I\_INJECTION|Energy Extraction from QPS|[AN\_RB\_PLI1.b2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.b2.ipynb)|[AN\_RB\_PLI1.b2](https://sigmon.web.cern.ch/node/49)|
|HWC|PLI1.d2|I\_INJECTION|Unipolar Powering Failure|[AN\_RB\_PLI1.d2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rb/AN_RB_PLI1.d2.ipynb)|[AN\_RB\_PLI1.d2](https://sigmon.web.cern.ch/node/50)|
......@@ -39,7 +39,7 @@ In particular, thotebooks are suited for HWC tests:
|Type|Test|Current|Description|Notebook|Example report|
|----|----|-------|-----------|--------|--------------|
|HWC|PIC2|I_MIN_OP|Powering Interlock Controller|[AN\_RQ\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PIC2.ipynb)|[AN\_RQ\_PIC2](https://sigmon.web.cern.ch/node/61)|
|HWC|PIC2|I\_MIN\_OP|Powering Interlock Controller|[AN\_RQ\_PIC2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PIC2.ipynb)|[AN\_RQ\_PIC2](https://sigmon.web.cern.ch/node/61)|
|HWC|PLI1.b3|I\_INJECTION|Energy Extraction from QPS|[AN\_RQ\_PLI1.b3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI1.b3.ipynb)|[AN\_RQ\_PLI1.b3](https://sigmon.web.cern.ch/node/62)|
|HWC|PLI1.d2|I\_INJECTION|Unipolar Powering Failure|[AN\_RQ\_PLI1.d2](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI1.d2.ipynb)|[AN\_RQ\_PLI1.d2](https://sigmon.web.cern.ch/node/63)|
|HWC|PLI2.s1|I\_INTERM\_1|Splice Mapping|[AN\_RQ\_PLI2.s1](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/rq/AN_RQ_PLI2.s1.ipynb)|[AN\_RQ\_PLI2.s1](https://sigmon.web.cern.ch/node/65)|
......@@ -57,7 +57,7 @@ The 600-A circuits come in one of two main variants:
- circuits with
- and without EE.
Each variant may or may not be equipped with a DC contactor ensuring the effectiveness of the crowbar in case of a PC short circuit. Moreover, the magnets of several circuits are equipped with parallel resistors, in order to decouple the current decay in a quenching magnet from that in the rest of the circuit. Figure 1 shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
Each variant may or may not be equipped with a DC contactor ensuring the effectiveness of the crowbar in case of a PC short circuit. Moreover, the magnets of several circuits are equipped with parallel resistors, in order to decouple the current decay in a quenching magnet from that in the rest of the circuit. Figure below shows a generic circuit diagram, equipped with EE and parallel resistor, as well as lead resistances and a quench resistance.
<center><img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/600A/600A.png" width=75%></center>
......@@ -90,6 +90,46 @@ Another useful resource to find out which 600 A circuits belong to which categor
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_600A\_RCDO\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/600A/AN_600A_RCDO_FPA.ipynb)|-|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_600A\_RCBXHV\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/600A/AN_600A_RCBXHV_FPA.ipynb)|-|
## 4. IT - Inner Triplet Circuits
The main quadrupole magnet circuits of the 8 Inner Triplet (IT) systems in the LHC are composed of four single aperture quadrupole magnets in series and have a particular powering configuration, consisting of three nested power converters (PC), see Figure below.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/it/IT.png" width=75%>
Main quadrupole magnet circuit of the Inner Triplet system for IT’s at points 1 and 5 (left) and IT’s at points 2 and 8 (right).
Note that the configuration for the IT’s in points 1 and 5 is different from the configuration in points 2 and 8. An earth detection system is present at the minus of the RTQX2 converter. Detailed information concerning the converters is given in EDMS 1054483.
The two magnets Q1 and Q3 are type MQXA and the two combined magnets Q2a and Q2b are type MQXB. Q1 is located towards the interaction point.
Note that the IT’s at points 2 and 8 have a slightly higher nominal operating current than the IT’s at points 1 and 5, see Table 1.
|Circuit|I\_PNO RQX|I\_PNO RTQX2|I\_PNO RTQX1|
|-------|----------|------------|------------|
|RQX.L2, RQX.R2, RQX.L8, RQX.R8|7180 A| 4780 A|550 A|
|RQX.L1, RQX.R1, RQX.L5, RQX.R5|6800 A| 4600 A|550 A|