Commit 67eb3a9f authored by Michal Maciejewski's avatar Michal Maciejewski
Browse files

Added QPS schmatics for IPQ MQY magnets

parent 86862218
......@@ -314,7 +314,7 @@ The Individually Powered Quadrupole magnets (IPQs) in the LHC are located on bot
|2MQM+2MQML|4.5 K| RQ6.L2, RQ6.R2 RQ6.L8, RQ6.R8|I Nominal: 4310A, I_Ultimate: 4650A|
| | | |L tot: 2x15 mH + 2x21 mH|
| | | |max(di/dt): 12.917 A/s|
|2MQM+2MQMC|1.9 K| RQ9.L1, RQ9.L1 RQ9.L2, RQ9.R2 RQ9.L4, RQ9.R4 RQ9.L5, RQ9.R5 RQ9.L6, RQ9.R6 RQ9.L8, RQ9.R8|I Nominal: 5390A, I_Ultimate: 5820A|
|2MQM+2MQMC|1.9 K| RQ9.L1, RQ9.R1 RQ9.L2, RQ9.R2 RQ9.L4, RQ9.R4 RQ9.L5, RQ9.R5 RQ9.L6, RQ9.R6 RQ9.L8, RQ9.R8|I Nominal: 5390A, I_Ultimate: 5820A|
| | | |L tot: 2x15 mH + 2x21 mH|
| | | |max(di/dt): 12.917 A/s|
......@@ -380,13 +380,13 @@ For redundancy, the heaters are connected in two circuits, such that each circui
|----|----|-------|-----------|--------|--------------|
|HWC|PCC.3|I\_PCC|Power Converter Configuration|-|-|
|HWC|PIC2|I\_MIN\_OP|Powering Interlock Controller check with standby current in the circuits.|-|-|
|HWC|PLI1.c3|I\_INJECTION|Fast Power Abort at injection current.|[AN\_IPQ\_PLI1.c3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI1.c2.ipynb)|[AN_IPQ_PLI1.c3](https://sigmon.web.cern.ch/node/#)|
|HWC|PLI2.f3|I\_INTERM\_1|Unbalanced ramp and Quench Heater Firing|[AN\_IPQ\_PLI2.f3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI2.f3.ipynb)|[AN_IPQ_PLI2.f3](https://sigmon.web.cern.ch/node/#)|
|HWC|PLI2.e3|I\_INTERM\_1|Unbalanced slow power abort|[AN\_IPQ\_PLI2.e3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI2.e3.ipynb)|[AN_IPQ_PLI2.e3](https://sigmon.web.cern.ch/node/#)|
|HWC|PNO.f4|I\_PNO|Symmetric Ramp and Symmetric Quench Heater Firing|[AN\_IPQ\_PNO.f4](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipqAN_IPQ_PNO.f4.ipynb)|[AN_IPQ_PNO.f4](https://sigmon.web.cern.ch/node/#)|
|HWC|PNO.a7|I\_PNO+I\_DELTA|Powering to I\_PNO + I\_DELTA and unbalanced SPA|[AN\_IPQ\_PNO.a7](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PNO.a7.ipynb)|[AN_IPQ_PNO.a7](https://sigmon.web.cern.ch/node/#)|
|HWC|PNO.c4|I\_PNO|Current Lead test and FPA from I\_PNO|[AN\_IPQ\_PNO.c4](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PNO.c4.ipynb)|[AN_IPQ_PNO.c4](https://sigmon.web.cern.ch/node/#)|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_IPQ\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_FPA.ipynb)|[AN_IPQ_FPA](https://sigmon.web.cern.ch/node/#)|
|HWC|PLI1.c3|I\_INJECTION|Fast Power Abort at injection current.|[AN\_IPQ\_PLI1.c3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI1.c2.ipynb)|[AN\_IPQ\_PLI1.c3](https://sigmon.web.cern.ch/node/#)|
|HWC|PLI2.f3|I\_INTERM\_1|Unbalanced ramp and Quench Heater Firing|[AN\_IPQ\_PLI2.f3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI2.f3.ipynb)|[AN\_IPQ\_PLI2.f3](https://sigmon.web.cern.ch/node/#)|
|HWC|PLI2.e3|I\_INTERM\_1|Unbalanced slow power abort|[AN\_IPQ\_PLI2.e3](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PLI2.e3.ipynb)|[AN\_IPQ\_PLI2.e3](https://sigmon.web.cern.ch/node/#)|
|HWC|PNO.f4|I\_PNO|Symmetric Ramp and Symmetric Quench Heater Firing|||
|HWC|PNO.a7|I\_PNO+I\_DELTA|Powering to I\_PNO + I\_DELTA and unbalanced SPA|[AN\_IPQ\_PNO.a7](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_PNO.a7.ipynb)|[AN\_IPQ\_PNO.a7](https://sigmon.web.cern.ch/node/#)|
|HWC|PNO.c4|I\_PNO|Current Lead test and FPA from I\_PNO|-|[AN\_IPQ\_PNO.c4](https://sigmon.web.cern.ch/node/#)|
|Operation|FPA|I\_PNO|FPA during operation with magnets quenching|[AN\_IPQ\_FPA](https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/blob/master/ipq/AN_IPQ_FPA.ipynb)|[AN\_IPQ\_FPA](https://sigmon.web.cern.ch/node/#)|
source: Test Procedure and Acceptance Criteria for the Individually Powered 4-6 kA Quadrupole-Circuits in the LHC Insertions, MP3 Procedure, <a href="https://edms.cern.ch/document/874884/3.1">https://edms.cern.ch/document/874884/3.1</a>
......@@ -449,7 +449,7 @@ DQAMG - controller attached to global protection
- Threshold on U_RES_B1: 100 mV, 10 ms
- U_RES_B2, U_1_B2, U_2_B2 and U_INDUCT_B2 are given for diagnostics only
- Signals are measured with -2.5 V offset and with the gain factor = 0.0012
- *Attention: B1 signals and B2 singals can be shifted by 4 ms from each other*
- *Attention: B1 signals and B2 signals can be shifted by 4 ms from each other*
- If pure inductive signal and di/dt < 0:
- U_1_B1 = L di/dt < 0
- U_2_B1 = -L di/dt < 0
......
%% Cell type:markdown id: tags:
<h1><center>Analysis of a PLI1.c2 HWC Test in an IPD Circuit</center></h1>
Superconducting beam separation dipoles of four different types are required in the Experimental Insertions (IR 1, 2, 5 and 8) and the RF insertion (IR 4). Single aperture dipoles D1 (MBX) and twin aperture dipoles D2 (MBRC) are utilized in the Experimental Insertions. They bring the two beams of the LHC into collision at four separate points then separate the beams again beyond the collision point. In the RF Insertions two types of twin aperture dipoles, each type with two different aperture spacings are used: D3 (MBRS) and D4 (MBRB). The D3 and D4 magnets increase the separation of the beams in IR 4 from the nominal spacing 194 mm to 420 mm. D2 and D4 are the twin apertures magnets with common iron core for both apertures. D3 is a twin apertures magnet with independent iron cores for each aperture.
The MBRC dipole consists of two individually powered apertures assembled in a common yoke structure.
- MBX – D1
Single aperture of the magnet powered with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBX_D1.png" width=50%>
- MBRC – D2
- MBRB – D4
Apertures B1 and B2 of the magnet are powered in series with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRC_D2_MBRB_D4.png" width=50%>
- MBRS - D3
Apertures B1 and B2 of the magnet are powered in series with one power supply but series connection done in the DFBA.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRS_D3.png" width=50%>
|Magnets in the Circuit|Temperature|Position|General information|
|----------------------|-----------|--------|-------------------|
|MBX (D1)|1.9 K| RD1.R2, RD1.R8|I Nominal: 5800A, I_Ultimate: 6100A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 17.453 A/s|
|MBRC (D2)|4.5 K| RD2.L1, RD2.R1, RD2.L5, RD2.R5|I Nominal: 4400A, I_Ultimate: 4670A|
| | | RD2.L2, RD2.R2, RD2.L8, RD2.R8|I Nominal: 6000A, I_Ultimate: 6500A|
| | | |L tot: 52 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRS (D3)|4.5 K| RD3.L4, RD3.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRB (D4)|4.5 K| RD4.L4, RD4.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
This section is a copy of a document created by Alexandre Erokhin (https://twiki.cern.ch/twiki/pub/MP3/General_Info_IPD/separation_dipole.pdf)
### PLI1.C2 - FAST POWER ABORT AT INJECTION CURRENT
The aim of this test is to verify the correct performance of the power converter and the superconducting components, and generation of a PM file after a fast power abort.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/PLI1_current.png" width=50%>
<center>IPD currents during PLI.C2. Note: the actual parameters are listed in Appendix 1.</center>
Offline analyses are listed below:
|Responsible|Type of Analysis|Criteria|
|-----------|----------------|--------|
|PC|Analysis of the current and waveform decay.|Agreement of V_MEAS(t) and I_MEAS(t) to the theoretical decay curve withing a tolerance of 10 %.
|PC|Analysis of the current and waveform decay.|Agreement of V_MEAS(t) and I_MEAS(t) to the theoretical decay curve withing a tolerance of 10 %.|
|MP3|Check if QPS tripped.||
| |Check if PM file was created.||
%% Cell type:markdown id: tags:
# Analysis Assumptions
- We consider standard analysis scenarios, i.e., all signals can be queried. If a signal is missing, an analysis can raise a warning and continue or an error and abort the analysis.
- In case a signal is not needed for the analysis, 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 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 square brackets, 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.
- The title contains timestamp, circuit name, and signal name allowing to re-access the signal.
- The plots assigned to the left scale have colors: blue (C0) and orange (C1). Plots presented on the right have colors red (C2) and green (C3).
- Each plot has an individual time-synchronization mentioned explicitly in the description.
- If an axis has a single signal, then the color of the label matches the signal's color. Otherwise, the label color is black.
%% Cell type:markdown id: tags:
# 0. Initialise Working Environment
%% Cell type:code id: tags:
``` python
import io
import re
import sys
import pandas as pd
import numpy as np
from datetime import datetime
import time
from IPython.display import display, Javascript, HTML
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.analysis.expert_input import get_expert_decision
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.IpdCircuitQuery import IpdCircuitQuery
from lhcsmapi.analysis.IpdCircuitAnalysis import IpdCircuitAnalysis
# GUI
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
analysis_start_time = datetime.now().strftime("%Y.%m.%d_%H%M%S.%f")
import lhcsmapi
print('Analysis executed with lhcsmapi version: {}'.format(lhcsmapi.__version__))
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 HWC Test
%% Cell type:code id: tags:
``` python
circuit_type = 'IPD'
hwc_test = 'PLI1.c2'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Output
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:skip_output
``` python
with Timer():
circuit_name = hwcb.get_circuit_name()
t_start = hwcb.get_start_time()
t_end = hwcb.get_end_time()
author = hwcb.get_author()
is_automatic = hwcb.is_automatic_mode()
query = IpdCircuitQuery(circuit_type, circuit_name, max_executions=8)
# PC
i_meas_df = query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
source_timestamp_df = query.find_source_timestamp_pc(t_start, t_end)
timestamp_fgc = source_timestamp_df.at[0, 'timestamp']
# QDS
source_timestamp_qds_df = query.find_source_timestamp_qds(timestamp_fgc, duration=[(2, 's'), (2, 's')])
timestamp_qds = np.nan if source_timestamp_qds_df.empty else source_timestamp_qds_df.loc[0, 'timestamp']
signal_names = 'U_RES_B1' if query.circuit_type == 'IPD2_B1B2' else 'U_RES'
i_meas_nxcals_df = query.query_pc_nxcals(timestamp_fgc, signal_names=['I_MEAS'], spark=spark)[0]
u_res_nxcals_df = query.query_iqps_nxcals(timestamp_fgc, signal_names=signal_names, spark=spark)[0]
# LEADS
u_hts_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])
u_res_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])
analysis = IpdCircuitAnalysis(query.circuit_type, pd.DataFrame())
```
%% 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 timestamps (PC, QPS). The criterion of passing this test described in detail in 600APIC2.
In short the following criteria should be checked:
- The PC timestamp (51_self) is QPS timestamp +-20 ms.
- The difference between QPS board A and B timestamp = 1ms.
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 id: tags:
``` python
timestamp_dct = {'FGC': timestamp_fgc,
'QDS_A':source_timestamp_qds_df.loc[0, 'timestamp'] if len(source_timestamp_qds_df) > 0 else np.nan,
'QDS_B':source_timestamp_qds_df.loc[1, 'timestamp'] if len(source_timestamp_qds_df) > 1 else np.nan}
analysis.create_timestamp_table(timestamp_dct)
```
%% Cell type:markdown id: tags:
# 4. PC
## 4.1. Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_df |DataFrame |A |PM|Main current of the power converter, I_MEAS|
|i_a_df |DataFrame |A |PM|Actual current of the power converter, I_A|
|i_ref_df |DataFrame |A |PM|Reference current of the RQX power converter, I_REF|
*ANALYSIS*:
- calculation of the ramp rate
- calculation of the duration of a plateau prior to a quench
- calculation of DCCT MIIts
*GRAPHS*:
- t = 0 s corresponds to the FGC timestamp
- one plot for each power converter
%% Cell type:code id: tags:
``` python
ax = i_meas_df.plot(figsize=(30, 10), grid=True)
ax.set_xlabel("time, [s]", fontsize=15)
ax.set_ylabel("I_MEAS, [A]", fontsize=15)
ax.tick_params(labelsize=15)
```
%% Cell type:markdown id: tags:
# 5. Quench Protection System
The signal names used for quench detection are shown in the figures above (picture from A. Erokhin).
**Quench Detector Type**
DQQDC - current leads quench detector
DQAMG - controller attached to global protection
**Current Leads:**
- Typical resistance for U_RES: 7 uOhm
- Threshold for U_HTS: 3 mV, 1s
- Polarity convention: Arrows show how signals are measured. If I > 0, LD1: U_RES > 0, LD2: U_RES < 0
- PM file
- Buffer range 0 to 250, event at point 50
- Time range: -10 to 40 s
- Frequency: 5 Hz (dt = 200 ms)
**Magnet:**
- See polarity convention in the circuit schematics
- U_RES_B1 = U_1_B1 + U_2_B1
- Threshold on U_RES_B1: 100 mV, 10 ms
- U_RES_B2, U_1_B2, U_2_B2 and U_INDUCT_B2 are given for diagnostics only
- Signals are measured with -2.5 V offset and with the gain factor = 0.0012
- *Attention: B1 signals and B2 singals can be shifted by 4 ms from each other*
- If pure inductive signal and di/dt < 0:
- U_1_B1 = L di/dt < 0
- U_2_B1 = -L di/dt < 0
- PM file
- Buffer range 501 to 1500, event at point 1000
- Time range: -2 to 2 s
- Frequency: 250 Hz (dt = 4 ms)
%% Cell type:markdown id: tags:
## 5.1. Resistive Voltage
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_nxcals_df|DataFrame|A|NXCALS|Power converter current in an RCBX circuit, I_MEAS|
|u_res_nxcals_df|DataFrame|V|NXCALS|Resistive voltage of magnets measured with QPS in an RCBX circuit, U_RES|
|i_meas_nxcals_df|DataFrame|A|NXCALS|Power converter current in an IPD circuit, I_MEAS|
|u_res_nxcals_df|DataFrame|V|NXCALS|Resistive voltage of magnets measured with QPS in an IPD circuit, U_RES|
*GRAPHS*:
t = 0 s corresponds to the QPS timestamp
%% Cell type:code id: tags:
``` python
analysis.plot_u_res(circuit_name, timestamp_fgc, u_res_nxcals_df, i_meas_nxcals_df)
```
%% Cell type:markdown id: tags:
## 5.2. Current Leads
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_res_dfs |DataFrame |V |PM|Leads resisitive voltage, U_RES|
|u_hts_dfs |DataFrame |V |PM|Leads HTS voltage, U_HTS|
*CRITERIA*:
- quench detection for U_HTS for 2 consecutive datapoints above the threshold of 3 mV
- detection for U_RES for 2 consecutive datapoints above the threshold of 100 mV
*GRAPHS*:
- t = 0 s corresponds to the LEADS timestamp.
%% Cell type:code id: tags:
``` python
analysis.analyze_leads_voltage(u_hts_dfs, circuit_name, timestamp_fgc, signal='U_HTS', value_min=-0.003, value_max=0.003)
```
%% Cell type:code id: tags:
``` python
analysis.analyze_leads_voltage(u_res_dfs, circuit_name, timestamp_fgc, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
# 6. Final Report
%% Cell type:code id: tags:
``` python
campaign = hwcb.get_campaign()
file_name_html = '{}-{}_report.html'.format(Time.to_datetime(t_start).strftime("%Y.%m.%d_%H%M%S.%f"), Time.to_datetime(t_end).strftime("%Y.%m.%d_%H%M%S.%f"))
full_path = '/eos/project/l/lhcsm/hwc/IPD/{}/{}/{}/{}'.format(circuit_name, hwc_test, campaign, file_name_html)
!mkdir -p /eos/project/l/lhcsm/hwc/IPD/$circuit_name/$hwc_test/$campaign
print('Compact notebook report saved to (Windows): ' + '\\\\cernbox-smb' + full_path.replace('/', '\\'))
display(Javascript('IPython.notebook.save_notebook();'))
time.sleep(5)
!{sys.executable} -m jupyter nbconvert --to html $'AN_IPD_PLI1.c2.ipynb' --output /eos/project/l/lhcsm/hwc/IPD/$circuit_name/$hwc_test/$campaign/$file_name_html --TemplateExporter.exclude_input=True --TagRemovePreprocessor.remove_all_outputs_tags='["skip_output"]'
```
......
%% Cell type:markdown id: tags:
<h1><center>Analysis of a PLI3.c5 HWC Test in an IPD Circuit</center></h1>
Superconducting beam separation dipoles of four different types are required in the Experimental Insertions (IR 1, 2, 5 and 8) and the RF insertion (IR 4). Single aperture dipoles D1 (MBX) and twin aperture dipoles D2 (MBRC) are utilized in the Experimental Insertions. They bring the two beams of the LHC into collision at four separate points then separate the beams again beyond the collision point. In the RF Insertions two types of twin aperture dipoles, each type with two different aperture spacings are used: D3 (MBRS) and D4 (MBRB). The D3 and D4 magnets increase the separation of the beams in IR 4 from the nominal spacing 194 mm to 420 mm. D2 and D4 are the twin apertures magnets with common iron core for both apertures. D3 is a twin apertures magnet with independent iron cores for each aperture.
The MBRC dipole consists of two individually powered apertures assembled in a common yoke structure.
- MBX – D1
Single aperture of the magnet powered with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBX_D1.png" width=50%>
- MBRC – D2
- MBRB – D4
Apertures B1 and B2 of the magnet are powered in series with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRC_D2_MBRB_D4.png" width=50%>
- MBRS - D3
Apertures B1 and B2 of the magnet are powered in series with one power supply but series connection done in the DFBA.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRS_D3.png" width=50%>
|Magnets in the Circuit|Temperature|Position|General information|
|----------------------|-----------|--------|-------------------|
|MBX (D1)|1.9 K| RD1.R2, RD1.R8|I Nominal: 5800A, I_Ultimate: 6100A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 17.453 A/s|
|MBRC (D2)|4.5 K| RD2.L1, RD2.R1, RD2.L5, RD2.R5|I Nominal: 4400A, I_Ultimate: 4670A|
| | | RD2.L2, RD2.R2, RD2.L8, RD2.R8|I Nominal: 6000A, I_Ultimate: 6500A|
| | | |L tot: 52 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRS (D3)|4.5 K| RD3.L4, RD3.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRB (D4)|4.5 K| RD4.L4, RD4.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
This section is a copy of a document created by Alexandre Erokhin (https://twiki.cern.ch/twiki/pub/MP3/General_Info_IPD/separation_dipole.pdf)
### PLI3.C5 – MEASUREMENT OF SPLICE RESISTANCE AND FAST POWER ABORT AT INTERMEDIATE CURRENT
The aim of this test is to carry out electrical measurements to evaluate the superconducting splices and to verify the correct performance of the power converter, the superconducting components and generation of a PM file after a fast power abort.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/PLI3_current.png" width=75%>
<center>IPD currents during PLI3.C5. Note: the actual parameters are listed in Appendix 1.</center>
Offline analyses are listed below:
|Responsible|Type of Analysis|Criteria|
|-----------|----------------|--------|
|PC|Analysis of the current and waveform decay.|Agreement of V_MEAS(t) and I_MEAS(t) to the theoretical decay curve withing a tolerance of 10 %.
|MP3|Check if QPS tripped.||
| |Check if PM file was created.||
|MP3|Calculate splice resistances| $R_\text{max}$ < 5 nOhm|
|MP3|Check DFB regulation|$T_\text{top HTS}$ = temperature at 0 A current +/- 4K|
| | |$T_\text{top Cu}$ = temperature at 0 A current +/- 10K|
%% Cell type:markdown id: tags:
# Analysis Assumptions
- We consider standard analysis scenarios, i.e., all signals can be queried. If a signal is missing, an analysis can raise a warning and continue or an error and abort the analysis.
- In case a signal is not needed for the analysis, 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 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 square brackets, 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.
- The title contains timestamp, circuit name, and signal name allowing to re-access the signal.
- The plots assigned to the left scale have colors: blue (C0) and orange (C1). Plots presented on the right have colors red (C2) and green (C3).
- Each plot has an individual time-synchronization mentioned explicitly in the description.
- If an axis has a single signal, then the color of the label matches the signal's color. Otherwise, the label color is black.
%% Cell type:markdown id: tags:
# 0. Initialise Working Environment
%% Cell type:code id: tags:
``` python
import io
import re
import sys
import pandas as pd
import numpy as np
from datetime import datetime
import time
from IPython.display import display, Javascript, HTML
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.analysis.expert_input import get_expert_decision
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.IpdCircuitQuery import IpdCircuitQuery
from lhcsmapi.analysis.IpdCircuitAnalysis import IpdCircuitAnalysis
from lhcsmapi.pyedsl.AssertionBuilder import AssertionBuilder
from lhcsmapi.pyedsl.PlotBuilder import PlotBuilder
# GUI
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
analysis_start_time = datetime.now().strftime("%Y.%m.%d_%H%M%S.%f")
import lhcsmapi
print('Analysis executed with lhcsmapi version: {}'.format(lhcsmapi.__version__))
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))
```
%% Output
Analysis executed with lhcsmapi version: 1.3.317
Analysis executed with lhc-sm-hwc notebooks version: 1.1.0
%% Cell type:markdown id: tags:
# 1. Select HWC Test
%% Cell type:code id: tags:
``` python
circuit_type = 'IPD'
hwc_test = 'PLI3.c5'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Output
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:skip_output
``` python
with Timer():
circuit_name = hwcb.get_circuit_name()
t_start = hwcb.get_start_time()
t_end = hwcb.get_end_time()
author = hwcb.get_author()
is_automatic = hwcb.is_automatic_mode()
query = IpdCircuitQuery(circuit_type, circuit_name, max_executions=8)
analysis = IpdCircuitAnalysis(query.circuit_type, pd.DataFrame())
# PC
i_meas_df = query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
i_meas_raw_df = query.query_raw_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
source_timestamp_df = query.find_source_timestamp_pc(t_start, t_end)
timestamp_fgc = source_timestamp_df.at[0, 'timestamp']
# QDS
source_timestamp_qds_df = query.find_source_timestamp_qds(timestamp_fgc, duration=[(2, 's'), (2, 's')])
timestamp_qds = np.nan if source_timestamp_qds_df.empty else source_timestamp_qds_df.loc[0, 'timestamp']
signal_names = 'U_RES_B1' if query.circuit_type == 'IPD2_B1B2' else 'U_RES'
i_meas_nxcals_df = query.query_pc_nxcals(timestamp_fgc, signal_names=['I_MEAS'], spark=spark)[0]
u_res_nxcals_df = query.query_iqps_nxcals(timestamp_fgc, signal_names=signal_names, spark=spark)[0]
# Splice resitance
plateau_start, plateau_end = query.calculate_current_plateau_start_end(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), i_meas_threshold=0, min_duration_in_sec=10, spark=spark)
u_res_feature_df, i_meas_feature_df = query.get_busbar_resistances(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), plateau_start, plateau_end,
signal_name=signal_names, system='QDS', spark=spark)
r_res_df = analysis.calculate_resistance(u_res_feature_df, i_meas_feature_df)
# LEADS
u_hts_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])
u_res_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])
tt893_nxcals_dfs = query.query_dfb_signal_nxcals(t_start, t_end, system='LEADS_NXCALS_WINCCOA', signal_names='TT893', spark=spark)
tt891a_nxcals_dfs = query.query_dfb_signal_nxcals(t_start, t_end, system='LEADS_NXCALS_WINCCOA', signal_names='TT891A', spark=spark)
```
%% Output
Querying PM event timestamps for system: RPHF.UA23.RD1.L2, className: 51_self_pmd, source: FGC from 2017-04-21 16:12:20.835 to 2017-04-21 16:27:48.341
Querying PM event timestamps for system: RD1.L2, className: DQAMGNRD, source: QPS from 2017-04-21 16:25:30.340 to 2017-04-21 16:25:34.340
Querying NXCALS signal(s) I_MEAS from 2017-04-21 16:20:32.340 to 2017-04-21 16:25:42.340
Querying NXCALS signal(s) RD1.L2:U_RES from 2017-04-21 16:20:32.340 to 2017-04-21 16:25:42.340
Querying NXCALS signal(s) DFLCS.3L2.RD1.L2.LD1:U_HTS, DFLCS.3L2.RD1.L2.LD2:U_HTS from 2017-04-21 16:20:32.340 to 2017-04-21 16:40:32.340
Querying NXCALS signal(s) DFLCS.3L2.RD1.L2.LD1:U_RES, DFLCS.3L2.RD1.L2.LD2:U_RES from 2017-04-21 16:20:32.340 to 2017-04-21 16:40:32.340
Elapsed: 214.764 s.
%% 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 timestamps (PC, QPS). The criterion of passing this test described in detail in 600APIC2.
In short the following criteria should be checked:
- The PC timestamp (51_self) is QPS timestamp +-20 ms.
- The difference between QPS board A and B timestamp = 1ms.
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 id: tags:
``` python
timestamp_dct = {'FGC': timestamp_fgc,
'QDS_A':source_timestamp_qds_df.loc[0, 'timestamp'] if len(source_timestamp_qds_df) > 0 else np.nan,
'QDS_B':source_timestamp_qds_df.loc[1, 'timestamp'] if len(source_timestamp_qds_df) > 1 else np.nan}
analysis.create_timestamp_table(timestamp_dct)
```
%% Output
FGC is the first timestamp, potentially a PC trip not a quench!
Neither QDS board A or B are not present in the PM buffer. No QH fired, it is not an FPA!
%% Cell type:markdown id: tags:
# 4. PC
## 4.1. Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_df |DataFrame |A |PM|Main current of the power converter, I_MEAS|
|i_a_df |DataFrame |A |PM|Actual current of the power converter, I_A|
|i_ref_df |DataFrame |A |PM|Reference current of the RQX power converter, I_REF|
*ANALYSIS*:
- calculation of the ramp rate
- calculation of the duration of a plateau prior to a quench
- calculation of DCCT MIIts
*GRAPHS*:
- t = 0 s corresponds to the FGC timestamp
- one plot for each power converter
%% Cell type:code id: tags:
``` python
title = '%s, %s: %s-%s' % (circuit_name, hwc_test, Time.to_string(t_start).split('.')[0], Time.to_string(t_end).split('.')[0])
ax = PlotBuilder().with_signal(i_meas_df, title=title, grid=True) \
.with_ylabel(ylabel='I_MEAS, [A]') \
.plot(show_plot=False).get_axes()[0]
for ps, pe in zip(plateau_start, plateau_end):
ax.axvspan(xmin=(ps-Time.to_unix_timestamp(i_meas_raw_df.index[0]))/1e9, xmax=(pe-Time.to_unix_timestamp(i_meas_raw_df.index[0]))/1e9, facecolor='xkcd:orange')
```
%% Output
%% Cell type:markdown id: tags:
## 4.2. Splice Resistance
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Databse|Comment
|---------------|---------------|---------------|-------|------|
|i_meas_features_df |DataFrame| A |NXCALS| Power converter current mean values|
|u_res_features_df |DataFrame| V |NXCALS| U_RES voltage mean values|
*ANALYSIS*:
- Calculate splice resistance values based on power converter currents and QDS voltages
*CRITERIA*
- Check if R_max < 5 nOhm
*GRAPHS*:
- t = 0 s corresponds to the start of the test
%% Cell type:code id: tags:
``` python
res_outliers_df = AssertionBuilder().with_feature(r_res_df) \
.has_min_max_value(feature='R_RES', min_value=0, max_value=5e-9) \
.show_plot(xlabel='Busbar, [-]', ylabel='R_RES (Calculated), [Ohm]') \
.get_features_outside_range()
```
%% Output
The following features are outside of range.
%% Cell type:markdown id: tags:
# 5. Quench Protection System
The signal names used for quench detection are shown in the figures above (picture from A. Erokhin).
**Quench Detector Type**
DQQDC - current leads quench detector
DQAMG - controller attached to global protection
**Current Leads:**
- Typical resistance for U_RES: 7 uOhm
- Threshold for U_HTS: 3 mV, 1s
- Polarity convention: Arrows show how signals are measured. If I > 0, LD1: U_RES > 0, LD2: U_RES < 0
- PM file
- Buffer range 0 to 250, event at point 50
- Time range: -10 to 40 s
- Frequency: 5 Hz (dt = 200 ms)
**Magnet:**
- See polarity convention in the circuit schematics
- U_RES_B1 = U_1_B1 + U_2_B1
- Threshold on U_RES_B1: 100 mV, 10 ms
- U_RES_B2, U_1_B2, U_2_B2 and U_INDUCT_B2 are given for diagnostics only
- Signals are measured with -2.5 V offset and with the gain factor = 0.0012
- *Attention: B1 signals and B2 singals can be shifted by 4 ms from each other*
- If pure inductive signal and di/dt < 0:
- U_1_B1 = L di/dt < 0
- U_2_B1 = -L di/dt < 0
- PM file
- Buffer range 501 to 1500, event at point 1000
- Time range: -2 to 2 s
- Frequency: 250 Hz (dt = 4 ms)
%% Cell type:markdown id: tags:
## 5.1. Resistive Voltage
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_nxcals_df|DataFrame|A|NXCALS|Power converter current in an RCBX circuit, I_MEAS|
|u_res_nxcals_df|DataFrame|V|NXCALS|Resistive voltage of magnets measured with QPS in an RCBX circuit, U_RES|
*GRAPHS*:
t = 0 s corresponds to the QPS timestamp
%% Cell type:code id: tags:
``` python
analysis.plot_u_res(circuit_name, timestamp_fgc, u_res_nxcals_df, i_meas_nxcals_df)
```
%% Output
%% Cell type:markdown id: tags:
## 5.2. Current Leads
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_res_dfs |DataFrame |V |PM|Leads resisitive voltage, U_RES|
|u_hts_dfs |DataFrame |V |PM|Leads HTS voltage, U_HTS|
*CRITERIA*:
- quench detection for U_HTS for 2 consecutive datapoints above the threshold of 3 mV
- detection for U_RES for 2 consecutive datapoints above the threshold of 100 mV
*GRAPHS*:
- t = 0 s corresponds to the LEADS timestamp.
%% Cell type:code id: tags:
``` python
analysis.analyze_leads_voltage(u_hts_dfs, circuit_name, timestamp_fgc, signal='U_HTS', value_min=-0.003, value_max=0.003)
```
%% Output
OUTPUT
------
RD1.L2_LEADS_U_HTS Analysis comment is: U_HTS < quench threshold
------
%% Cell type:code id: tags:
``` python
analysis.analyze_leads_voltage(u_res_dfs, circuit_name, timestamp_fgc, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Output
OUTPUT
------
RD1.L2_LEADS_U_RES Analysis comment is: U_RES < quench threshold
------
%% Cell type:markdown id: tags:
## 5.3. DFB Regulation
*QUERY*
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|tt893_nxcals_dfs |list of DataFrames |K |NXCALS|Temperature at the top of the current lead, TT893.TEMPERATURECALC|
|tt891a_nxcals_dfs |list of DataFrames |K |NXCALS|Temperature between the HTS and resistive part of the current lead, TT891A.TEMPERATURECALC|
*CRITERIA*
- Check if the temperatures TT893 at the top of the copper part of the four current leads, is over dew point, but not overheated: TT893(0 current) - 4 K < TT893 < TT893(0 current) + 4 K
- Check if the temperatures TT891A at the top of the HTS part of the four current leads, is regulated around TT891A(0 current): TT891A(0 current) - 10 K < TT891A < TT891A(0 current) + 10 K, even without current
*GRAPHS*:
- t = 0 s corresponds to the start of the test
%% Cell type:code id: tags:
``` python
t_no_current = i_meas_df[i_meas_df.index < 10]['I_MEAS'].idxmin()
temp_no_current = max([df[df.index == df.index.get_loc(t_no_current, 'nearest')].values[0][0] for df in tt893_nxcals_dfs])
analysis.assert_tt893_min_max_value(tt893_nxcals_dfs, value_range=(temp_no_current-4, temp_no_current+4))
```
%% Output
<lhcsmapi.pyedsl.AssertionBuilder.AssertionBuilderSignalPlotResult at 0x7fc37612b860>
%% Cell type:code id: tags:
``` python
t_no_current = i_meas_df[i_meas_df.index < 10]['I_MEAS'].idxmin()
temp_no_current = max([df[df.index == df.index.get_loc(t_no_current, 'nearest')].values[0][0] for df in tt891a_nxcals_dfs])
analysis.assert_tt891a_min_max_value(tt891a_nxcals_dfs, value_range=(temp_no_current-10, temp_no_current+10))
```
%% Output
<lhcsmapi.pyedsl.AssertionBuilder.AssertionBuilderSignalPlotResult at 0x7fc37667ae10>
%% Cell type:markdown id: tags:
# 6. Final Report
%% Cell type:code id: tags:
``` python
campaign = hwcb.get_campaign()
file_name_html = '{}-{}_report.html'.format(Time.to_datetime(t_start).strftime("%Y.%m.%d_%H%M%S.%f"), Time.to_datetime(t_end).strftime("%Y.%m.%d_%H%M%S.%f"))
full_path = '/eos/project/l/lhcsm/hwc/IPD/{}/{}/{}/{}'.format(circuit_name, hwc_test, campaign, file_name_html)
!mkdir -p /eos/project/l/lhcsm/hwc/IPD/$circuit_name/$hwc_test/$campaign
print('Compact notebook report saved to (Windows): ' + '\\\\cernbox-smb' + full_path.replace('/', '\\'))
display(Javascript('IPython.notebook.save_notebook();'))
time.sleep(5)
!{sys.executable} -m jupyter nbconvert --to html $'AN_IPD_PLI3.c5.ipynb' --output /eos/project/l/lhcsm/hwc/IPD/$circuit_name/$hwc_test/$campaign/$file_name_html --TemplateExporter.exclude_input=True --TagRemovePreprocessor.remove_all_outputs_tags='["skip_output"]'
```
%% Output
Compact notebook report saved to (Windows): \\cernbox-smb\eos\project\l\lhcsm\hwc\IPD\RD1.L2\PLI3.c5\HWC_2017\2017.04.21_161220.835000-2017.04.21_162748.341000_report.html
[NbConvertApp] Converting notebook AN_IPD_PLI3.c5.ipynb to html
[NbConvertApp] Writing 516590 bytes to /eos/project/l/lhcsm/hwc/IPD/RD1.L2/PLI3.c5/HWC_2017/2017.04.21_161220.835000-2017.04.21_162748.341000_report.html
......
%% Cell type:markdown id: tags:
<h1><center>Analysis of a PNO.c6 HWC Test in an IPD Circuit</center></h1>
Superconducting beam separation dipoles of four different types are required in the Experimental Insertions (IR 1, 2, 5 and 8) and the RF insertion (IR 4). Single aperture dipoles D1 (MBX) and twin aperture dipoles D2 (MBRC) are utilized in the Experimental Insertions. They bring the two beams of the LHC into collision at four separate points then separate the beams again beyond the collision point. In the RF Insertions two types of twin aperture dipoles, each type with two different aperture spacings are used: D3 (MBRS) and D4 (MBRB). The D3 and D4 magnets increase the separation of the beams in IR 4 from the nominal spacing 194 mm to 420 mm. D2 and D4 are the twin apertures magnets with common iron core for both apertures. D3 is a twin apertures magnet with independent iron cores for each aperture.
The MBRC dipole consists of two individually powered apertures assembled in a common yoke structure.
- MBX – D1
Single aperture of the magnet powered with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBX_D1.png" width=50%>
- MBRC – D2
- MBRB – D4
Apertures B1 and B2 of the magnet are powered in series with one power supply.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRC_D2_MBRB_D4.png" width=50%>
- MBRS - D3
Apertures B1 and B2 of the magnet are powered in series with one power supply but series connection done in the DFBA.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/IPD_MBRS_D3.png" width=50%>
|Magnets in the Circuit|Temperature|Position|General information|
|----------------------|-----------|--------|-------------------|
|MBX (D1)|1.9 K| RD1.R2, RD1.R8|I Nominal: 5800A, I_Ultimate: 6100A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 17.453 A/s|
|MBRC (D2)|4.5 K| RD2.L1, RD2.R1, RD2.L5, RD2.R5|I Nominal: 4400A, I_Ultimate: 4670A|
| | | RD2.L2, RD2.R2, RD2.L8, RD2.R8|I Nominal: 6000A, I_Ultimate: 6500A|
| | | |L tot: 52 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRS (D3)|4.5 K| RD3.L4, RD3.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
|MBRB (D4)|4.5 K| RD4.L4, RD4.R4|I Nominal: 5520A, I_Ultimate: 6000A|
| | | |L tot: 26 mH, L per aperture: 26 mH|
| | | |max(di/dt): 18.147 A/s|
This section is a copy of a document created by Alexandre Erokhin (https://twiki.cern.ch/twiki/pub/MP3/General_Info_IPD/separation_dipole.pdf)
### PNO.C6 – FAST POWER ABORT AT NOMINAL CURRENT AND LEAD TEST
The aim of this test is to verify the correct performance of the current leads at operational current and evaluate the converter and magnet performance after a fast power abort from nominal current.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/PLI3_current.png" width=50%>
<center>IPD currents during PNO.c6. Note: the actual parameters are listed in Appendix 1.</center>
Offline analyses are listed below:
|Responsible|Type of Analysis|Criteria|
|-----------|----------------|--------|
|PC|Analysis of the current and waveform decay.|Agreement of V_MEAS(t) and I_MEAS(t) to the theoretical decay curve withing a tolerance of 10 %.
|MP3|Check if QPS tripped.||
| |Check if PM file was created.||
|MP3|Calculate splice resistances| $R_\text{max}$ < 5 nOhm|
|MP3|Check DFB regulation|$T_\text{top HTS}$ = temperature at 0 A current +/- 4K|
| | |$T_\text{top Cu}$ = temperature at 0 A current +/- 10K|
|MP3|Quench analysis (in case of a quench)|The signals have to be compared to the reference signals, and should agree within the limits given below:|
| |Check heater voltages (U_HDS_1; U_HDS_2) during the discharge, and their decay time constant | U_HDS: +/- 5%|
| | | $\tau$_HDS +/- 5%|
| |Check the heater delay from the quench signal | t_delay +/- 5 ms|
%% Cell type:markdown id: tags:
# Analysis Assumptions
- We consider standard analysis scenarios, i.e., all signals can be queried. If a signal is missing, an analysis can raise a warning and continue or an error and abort the analysis.
- In case a signal is not needed for the analysis, 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 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 square brackets, 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.
- The title contains timestamp, circuit name, and signal name allowing to re-access the signal.
- The plots assigned to the left scale have colors: blue (C0) and orange (C1). Plots presented on the right have colors red (C2) and green (C3).
- Each plot has an individual time-synchronization mentioned explicitly in the description.
- If an axis has a single signal, then the color of the label matches the signal's color. Otherwise, the label color is black.
%% Cell type:markdown id: tags:
# 0. Initialise Working Environment
%% Cell type:code id: tags:
``` python
import io
import re
import sys
import pandas as pd
import numpy as np
from datetime import datetime
import time
from IPython.display import display, Javascript, HTML
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.analysis.expert_input import get_expert_decision
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.IpdCircuitQuery import IpdCircuitQuery
from lhcsmapi.analysis.IpdCircuitAnalysis import IpdCircuitAnalysis
from lhcsmapi.pyedsl.AssertionBuilder import AssertionBuilder
from lhcsmapi.pyedsl.PlotBuilder import PlotBuilder
# GUI
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
analysis_start_time = datetime.now().strftime("%Y.%m.%d_%H%M%S.%f")
import lhcsmapi
print('Analysis executed with lhcsmapi version: {}'.format(lhcsmapi.__version__))
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))
```
%% Output
Analysis executed with lhcsmapi version: 1.3.323
Analysis executed with lhc-sm-hwc notebooks version: 1.1.0
%% Cell type:markdown id: tags:
# 1. Select HWC Test
%% Cell type:code id: tags:
``` python
circuit_type = 'IPD'
hwc_test = 'PNO.c6'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Output
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:skip_output
``` python
with Timer():
circuit_name = hwcb.get_circuit_name()
t_start = hwcb.get_start_time()
t_end = hwcb.get_end_time()
author = hwcb.get_author()
is_automatic = hwcb.is_automatic_mode()
query = IpdCircuitQuery(circuit_type, circuit_name, max_executions=8)
analysis = IpdCircuitAnalysis(query.circuit_type, pd.DataFrame())
# PC
i_meas_df = query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
i_meas_raw_df = query.query_raw_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
source_timestamp_df = query.find_source_timestamp_pc(t_start, t_end)
timestamp_fgc = source_timestamp_df.at[0, 'timestamp']
# QDS
source_timestamp_qds_df = query.find_source_timestamp_qds(timestamp_fgc, duration=[(2, 's'), (2, 's')])
timestamp_qds = np.nan if source_timestamp_qds_df.empty else source_timestamp_qds_df.loc[0, 'timestamp']
signal_names = 'U_RES_B1' if query.circuit_type == 'IPD2_B1B2' else 'U_RES'
i_meas_nxcals_df = query.query_pc_nxcals(timestamp_fgc, signal_names=['I_MEAS'], spark=spark)[0]
u_res_nxcals_df = query.query_iqps_nxcals(timestamp_fgc, signal_names=signal_names, spark=spark)[0]
# Splice resitance
plateau_start, plateau_end = query.calculate_current_plateau_start_end(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), i_meas_threshold=0, min_duration_in_sec=10, spark=spark)
u_res_feature_df, i_meas_feature_df = query.get_busbar_resistances(Time.to_unix_timestamp(t_start), Time.to_unix_timestamp(t_end), plateau_start, plateau_end,
signal_name=signal_names, system='QDS', spark=spark)
r_res_df = analysis.calculate_resistance(u_res_feature_df, i_meas_feature_df)
# LEADS
u_hts_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_HTS'], spark=spark, duration=[(300, 's'), (900, 's')])
u_res_dfs = query.query_leads(timestamp_fgc, source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), system='LEADS', signal_names=['U_RES'], spark=spark, duration=[(300, 's'), (900, 's')])
tt893_nxcals_dfs = query.query_dfb_signal_nxcals(t_start, t_end, system='LEADS_NXCALS_WINCCOA', signal_names='TT893', spark=spark)
tt891a_nxcals_dfs = query.query_dfb_signal_nxcals(t_start, t_end, system='LEADS_NXCALS_WINCCOA', signal_names='TT891A', spark=spark)
```
%% 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 timestamps (PC, QPS). The criterion of passing this test described in detail in 600APIC2.
In short the following criteria should be checked:
- The PC timestamp (51_self) is QPS timestamp +-20 ms.
- The difference between QPS board A and B timestamp = 1ms.
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 id: tags:
``` python
timestamp_dct = {'FGC': timestamp_fgc,
'QDS_A':source_timestamp_qds_df.loc[0, 'timestamp'] if len(source_timestamp_qds_df) > 0 else np.nan,
'QDS_B':source_timestamp_qds_df.loc[1, 'timestamp'] if len(source_timestamp_qds_df) > 1 else np.nan}
analysis.create_timestamp_table(timestamp_dct)
```
%% Cell type:markdown id: tags:
# 4. PC
## 4.1. Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_df |DataFrame |A |PM|Main current of the power converter, I_MEAS|
|i_a_df |DataFrame |A |PM|Actual current of the power converter, I_A|
|i_ref_df |DataFrame |A |PM|Reference current of the RQX power converter, I_REF|
*ANALYSIS*:
- calculation of the ramp rate
- calculation of the duration of a plateau prior to a quench
- calculation of DCCT MIIts
*GRAPHS*:
- t = 0 s corresponds to the FGC timestamp
- one plot for each power converter
%% Cell type:code id: tags:
``` python
title = '%s, %s: %s-%s' % (circuit_name, hwc_test, Time.to_string(t_start).split('.')[0], Time.to_string(t_end).split('.')[0])
ax = PlotBuilder().with_signal(i_meas_df, title=title, grid=True) \
.with_ylabel(ylabel='I_MEAS, [A]') \
.plot(show_plot=False).get_axes()[0]
for ps, pe in zip(plateau_start, plateau_end):