Commit 7bf769a0 authored by Michal Maciejewski's avatar Michal Maciejewski
Browse files

Updated HWC documentation

parent ea77c53f
This diff is collapsed.
figures/swan-hwc-browser.png

131 KB | W: | H:

figures/swan-hwc-browser.png

342 KB | W: | H:

figures/swan-hwc-browser.png
figures/swan-hwc-browser.png
figures/swan-hwc-browser.png
figures/swan-hwc-browser.png
  • 2-up
  • Swipe
  • Onion skin
%% Cell type:markdown id: tags:
<h1><center>Analysis of a PLNO.a8 HWC Test in an IPD Circuit</center></h1>
<h1><center>Analysis of a PNO.a8 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.A8 - POWERING TO I_PNO + I_DELTA
The aim of this test is to ramp the IPD to I_PNO + I_DELTA. Training quenches of magnets in the circuits should be expected.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/-/raw/master/figures/ipd/PNO.a8_current.png" width=75%>
<center>IPD currents during PNO.a8. Note: the actual parameters are listed in Appendix 1.</center>
Offline analyses are listed below:
|Responsible|Type of Analysis|Criteria|
|-----------|----------------|--------|
|MP3|Check if QPS tripped.||
| |Check if PM file was created.||
|MP3|Quench analysis|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))
```
%% Cell type:markdown id: tags:
# 1. Select HWC Test
%% Cell type:code id: tags:
``` python
circuit_type = 'IPD'
hwc_test = 'PNO.a8'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% 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=6)
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]
# QH
u_hds_dfss = query.query_qh_pm(source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), signal_names=['U_HDS'])
u_hds_dfs = u_hds_dfss[0] if u_hds_dfss else []
# # Reference
u_hds_ref_dfss = query.query_qh_pm(source_timestamp_qds_df.drop_duplicates('source') if not source_timestamp_qds_df.empty else pd.DataFrame(), signal_names=['U_HDS'], is_ref=True)
u_hds_ref_dfs = u_hds_ref_dfss[0] if u_hds_ref_dfss else []
# 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=1, 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')])
```
%% 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):
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')
```
%% 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_qds, u_res_nxcals_df, i_meas_nxcals_df)
```
%% Cell type:markdown id: tags:
## 5.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()
```
%% Cell type:markdown id: tags:
## 5.3. 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_qds, 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_qds, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
## 5.4. Quench Heaters
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_hds_dfs |list of DataFrame| V |PM| A list of U_HDS_1-2/U_HDS_1-4, signals from PM for quenched magnets|
|u_hds_ref_dfs |list of DataFrame| V |PM| A list of U_HDS_1-2 from PM for reference magnets|
*CRITERIA*:
- all characteristic times of an exponential decay calculated with the 'charge' approach for voltage is +/- 5 ms from the reference ones
- the initial voltage should be between 810 V and 1000 V
- the final voltage should be between 0 V and 10 V
*GRAPHS*:
t = 0 s corresponds to the start of the pseudo-exponential decay
Voltage view (linear and log)
- the queried and filtered quench heater voltage on the left axis (actual signal continuous, reference dashed), U_HDS
%% Cell type:code id: tags:
``` python
if u_hds_dfs:
analysis.analyze_qh(circuit_name, timestamp_qds, u_hds_dfs, u_hds_ref_dfs)
else:
print('No Quench Heater discharges!')
```
%% Cell type:code id: tags:
``` python
analysis.assert_first_qps_trigger([u_res_nxcals_df], u_hts_dfs, u_res_dfs, trigger_threshold=5e-3)
```
%% 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_PNO.a8.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:code id: tags:
``` python
```
......
%% Cell type:markdown id: tags:
<h1><center>Analysis of PLI1.a2 HWC Test in an RB Circuit</center></h1>
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%>
A current cycle up and down from I_MIN_OP to I_INJECTION is performed with a short plateau (typically 10 minutes) at highest current. The aim of this test is to check the magnet performance and the QPS calibration at that current level. The current to earth and the current error from the power convertor are checked during the sequence.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/PLI1_current.png" width=75%>
The required analysis and signatures are listed below.
|Responsible|Type of analysis|Criterion|
|-----------|----------------|---------|
|MP3|Splice signals|U_res < 500$\mu$V if the inductive voltage of the bus-bar segments is compensated|
|-|Automatic analysis on earth current and error current|I_EARTH_PLI1_A2 < I_EARTH_MAX and I_ERR_PLI1_A2 < I_ERR_MAX|
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> (Please follow this link for the latest version)
%% 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
# External libraries
import io
import re
import sys
import time
import pandas as pd
from IPython.display import display, Javascript, HTML
# Internal libraries
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.RbCircuitQuery import RbCircuitQuery
from lhcsmapi.pyedsl.AssertionBuilder import AssertionBuilder
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
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 PIC2 Test
- Choose a circuit name in order to display HWC test with, campaign name as well as start and end time
%% Cell type:code id: tags:
``` python
circuit_type = 'RB'
hwc_test = 'PLI1.a2'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:
%% Cell type:code id: tags:skip_output
``` python
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()
rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=2)
with Timer():
# PC
i_meas_nxcals_df = rb_query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
# BUSBAR
u_res_df = rb_query.query_busbar_features_nxcals(t_start, t_end, signal='U_RES', features=['min', 'max'], spark=spark)
```
%% Cell type:markdown id: tags:
# 3. Power Converter
## 3.1. Plot of the Power Converter Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_nxcals_df | DataFrame | A |NXCALS| Main power converter current, I_MEAS|
*GRAPHS*:
- t = 0 s corresponds to the start of the test
%% Cell type:code id: tags:
``` python
ax = i_meas_nxcals_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:
# 4. Busbar
## 4.1. Busbar Voltage
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_res_feature_df | DataFrame | V |NXCALS| Mean, std, max, and min values of the busbar voltage, U_RES|
*CRITERIA*:
- Check if the absolute maximum busbar voltage is below 5 mV
*GRAPHS*:
- t = 0 s corresponds to the start of the test
- The busbar maximum absolute voltage, U_RES
- The green box denotes the validity region of the busbar voltage (0, 5] mV
%% Cell type:code id: tags:
``` python
u_res_outside_range_df = AssertionBuilder().with_feature(u_res_df) \
.has_min_max_value(feature='max_abs', min_value=0, max_value=5e-3) \
.show_plot(xlabel='Busbar, [-]', ylabel='U_RES_abs_max (Calculated), [V]') \
.get_features_outside_range
```
%% Cell type:markdown id: tags:
# 5. Final Report
%% Cell type:code id: tags:
``` python
campaign = hwcb.get_campaign()
apply_report_template()
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/RB/{}/{}/{}/{}'.format(circuit_name, hwc_test, campaign, file_name_html)
!mkdir -p /eos/project/l/lhcsm/hwc/RB/$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_RB_PLI1.a2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$circuit_name/$hwc_test/$campaign/$file_name_html
!{sys.executable} -m jupyter nbconvert --to html $'AN_RB_PLI1.a2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$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 PLI1.b2 HWC Test in an RB Circuit</center></h1>
<img src = "https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%>
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%>
The current in the circuit is increased to I_INJECTION and shortly maintained constant. A quench simulation from one current lead is performed provoking a discharge of the energy through the EE system. The aim of the test is to check at a low current level the performance of the QPS and EE systems.
From 2010 on, a time delay is implemented between the switch opening and the FPA signal received (300 ms at the odd point, 600 ms at the even point).
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/PLI1_current.png" width=75%>
The required analysis and signatures are listed below.
|Responsible|Type of analysis|Criterion|
|-----------|----------------|---------|
|PC|PC voltage check|PC voltage ~ -1.5 V ± 0.5 V, 1 s after the EE activation. The current decay time constant should be within 20% of Decay_Time_const. Smooth exponential waveform on the PC voltage and current during the whole decay|
|PC|Earth Current Analysis|The maximum earth current <50 mA during EE activation disregarding the peak at the opening of the EE system.|
|EE|Energy discharge|Maximum voltage on EE resistance ($R*I$±10%) and maximum temperature of the EE resistance (±10% from theoretical value)|
|EE|Energy discharge|Time delay on switch opening (300±50ms at odd point and 600±50ms at even point)|
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> (Please follow this link for the latest version)
%% 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 time
import pandas as pd
from IPython.display import display, Javascript
# lhc-sm-api
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
# GUI
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
# Query
from lhcsmapi.pyedsl.QueryBuilder import QueryBuilder
from lhcsmapi.analysis.RbCircuitQuery import RbCircuitQuery
# Analysis
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.RbCircuitAnalysis import RbCircuitAnalysis
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 PLI1.b2 HWC Test
- Choose a circuit name in order to display HWC test with, campaign name as well as start and end time
%% Cell type:code id: tags:
``` python
circuit_type = 'RB'
hwc_test = 'PLI1.b2'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:skip_output
``` python
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()
rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=14)
with Timer():
# PC
i_meas_nxcals_df = rb_query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
source_timestamp_pc = rb_query.find_source_timestamp_pc(t_start, t_end)
timestamp_fgc = source_timestamp_pc.at[0, 'timestamp']
i_meas_df, i_a_df, i_ref_df = rb_query.query_pc_pm(timestamp_fgc, timestamp_fgc, signal_names=['I_MEAS', 'I_A', 'I_REF'])
# PIC
timestamp_pic = rb_query.find_timestamp_pic(timestamp_fgc, spark=spark)
# EE Voltage
source_timestamp_ee_odd_df = rb_query.find_source_timestamp_ee(timestamp_fgc, system='EE_ODD')
timestamp_ee_odd = source_timestamp_ee_odd_df.loc[0, 'timestamp']
source_ee_odd = source_timestamp_ee_odd_df.loc[0, 'source']
u_dump_res_odd_df = rb_query.query_ee_u_dump_res_pm(timestamp_ee_odd, timestamp_fgc, system='EE_ODD', signal_names=['U_DUMP_RES'])[0]
source_timestamp_ee_even_df = rb_query.find_source_timestamp_ee(timestamp_fgc, system='EE_EVEN')
timestamp_ee_even = source_timestamp_ee_even_df.loc[0, 'timestamp']
source_ee_even = source_timestamp_ee_even_df.loc[0, 'source']
u_dump_res_even_df = rb_query.query_ee_u_dump_res_pm(timestamp_ee_even, timestamp_fgc, system='EE_EVEN', signal_names=['U_DUMP_RES'])[0]
# DFB
source_timestamp_leads_odd_df = rb_query.find_timestamp_leads(timestamp_fgc, 'LEADS_ODD')
u_hts_odd_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_odd_df, system='LEADS_ODD', signal_names=['U_HTS'], spark=spark)
u_res_odd_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_odd_df, system='LEADS_ODD', signal_names=['U_RES'], spark=spark)
source_timestamp_leads_even_df = rb_query.find_timestamp_leads(timestamp_fgc, 'LEADS_EVEN')
u_hts_even_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_even_df, system='LEADS_EVEN', signal_names=['U_HTS'], spark=spark)
u_res_even_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_even_df, system='LEADS_EVEN', signal_names=['U_RES'], spark=spark)
rb_analysis = RbCircuitAnalysis(circuit_type, pd.DataFrame(), is_automatic=is_automatic)
```
%% Cell type:markdown id: tags:
# 3. Timestamps
%% Cell type:code id: tags:
``` python
timestamp_dct = {'FGC': timestamp_fgc, 'PIC': min(timestamp_pic), 'EE_EVEN': timestamp_ee_even, 'EE_ODD': timestamp_ee_odd,
'LEADS_ODD': source_timestamp_leads_odd_df, 'LEADS_EVEN': source_timestamp_leads_even_df}
rb_analysis.create_timestamp_table(timestamp_dct)
```
%% Cell type:markdown id: tags:
# 4. Power Converter
## 4.1. Plot of the Power Converter Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_df | DataFrame | A |NXCALS| Main power converter current, I_MEAS|
*GRAPHS*:
- t = 0 s corresponds to the start of the test
%% Cell type:code id: tags:
``` python
ax = i_meas_nxcals_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. Energy Extraction System
## 5.1. Analysis of the Energy Extraction Voltage
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_a_df |DataFrame |A |PM|I_A is the raw power converter current logged around the FPA with high sampling frequench|
|i_meas_df |DataFrame |A|PM |I_MEAS is filtered I_A with lower sampling frequency and longer duration|
|i_ref_df | DataFrame | A |PM| Reference power converter current, STATUS.I_REF|
|u_dump_res_odd_df | DataFrame | V |PM| Energy extraction odd voltage U_DUMP_RES|
|u_dump_res_even_df | DataFrame | V |PM| Energy extraction even voltage U_DUMP_RES|
*ANALYSIS*:
- Calculate U_dump_res (t=0)
- Calculate the characteristic time of pseudo-exponential current decay with the charge approach
*CRITERIA*:
- Check if U_dump_res (t=0) = 0.075*I V (±10%).
- Check if the characteristic time of pseudo-exponential decay of I_MEAS from t=1 to 120 s is 110 s<-Tau <130 s
- Check if the timestamp difference between FGC and EE an odd point is 300±50 ms
After YETS 2017/8 the EE timestamp odd(RR or UJ) has been reduced and should now be 100+-50 ms after the FGC time stamp
- Check if the time stamp difference between FGC and EE an even point: 600±50 ms
*GRAPHS*:
t = 0 s corresponds to the PM timestamp of the FGC
First plot (global view):
- the power converter converter current on the left axis, I_MEAS
- the two energy extraction voltages on the right, U_DUMP_RES, U_DUMP_RES
Second plot (triggering view):
- the power converter current on the left axis, I_MEAS
- the power converter reference current on the left axis, STATUS.I_REF (should stop at the moment of the FGC PM timestamp)
- the two energy extraction voltages on the right axis, U_DUMP_RES, U_DUMP_RES
- the green dashed line denotes the PIC timestamp
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_char_time_u_dump_res_ee(circuit_name, timestamp_fgc, [u_dump_res_odd_df, u_dump_res_even_df], i_meas_df)
```
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_delay_time_u_dump_res_ee(circuit_name, timestamp_fgc, min(timestamp_pic), [timestamp_ee_odd, timestamp_ee_even],
i_a_df, i_ref_df, [u_dump_res_odd_df, u_dump_res_even_df])
```
%% Cell type:markdown id: tags:
# 6. Current Leads
## 6.1. Plot of Current Leads
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_hts_odd_dfs |DataFrame |V |PM|Voltage of odd leads, U_HTS|
|u_res_odd_dfs |DataFrame |V |PM|Voltage of odd leads, U_RES|
|u_hts_even_dfs |DataFrame |V |PM|Voltage of even leads, U_HTS|
|u_res_even_dfs |DataFrame |V |PM|Voltage of even leads, U_RES|
*CRITERIA*:
- Check if the quench detection signal for U_HTS is below the threshold (3 mV)
- Check if the quench detection signal for U_RES is below the threshold (100 mV)
*GRAPHS*:
- t = 0 s corresponds to the FGC timestamp
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_leads_voltage(u_hts_odd_dfs+u_hts_even_dfs, circuit_name, timestamp_fgc, signal='U_HTS', value_min=-0.003, value_max=0.003)
```
%% Cell type:code id: tags:
``` python
rb_analysis.plot_leads_voltage_zoom(u_hts_odd_dfs+u_hts_even_dfs, circuit_name, timestamp_fgc, timestamp_ee_odd, timestamp_ee_even, signal='U_HTS')
```
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_leads_voltage(u_res_odd_dfs+u_res_even_dfs, circuit_name, timestamp_fgc, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
# 7. Final Report
%% Cell type:code id: tags:
``` python
campaign = hwcb.get_campaign()
apply_report_template()
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/RB/{}/{}/{}/{}'.format(circuit_name, hwc_test, campaign, file_name_html)
!mkdir -p /eos/project/l/lhcsm/hwc/RB/$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_RB_PLI1.b2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$circuit_name/$hwc_test/$campaign/$file_name_html
!{sys.executable} -m jupyter nbconvert --to html $'AN_RB_PLI1.b2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$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 PLI1.d2 HWC Test in an RB Circuit</center></h1>
<img src = "https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%>
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/RB.png" width=75%>
The current in the circuit is increased to I_INJECTION and shortly maintained constant. A powering failure is then generated. After a minute the EE system is activated to rapidly extract the energy of the circuit. The aim of this test is to verify the correct functionality of the PC when a powering failure occurs.
The required analysis and signatures are listed below.
<img src="https://gitlab.cern.ch/LHCData/lhc-sm-hwc/raw/master/figures/rb/PLI1_current.png" width=75%>
The required analysis and signatures are listed below.
|Responsible|Type of analysis|Criterion|
|-----------|----------------|---------|
|PC|PC voltage check|PC voltage ~ -1.5 V ± 0.5 V, 1 s after the EE activation. The current decay time constant should be within 20% of Decay_Time_const. Smooth exponential waveform on the PC voltage and current during the whole decay|
|PC|Earth Current Analysis|The maximum earth current <50 mA during EE activation disregarding the peak at the opening of the EE system.|
|EE|Energy discharge (if the discharge was provoked by the operator)|Maximum voltage on EE resistance ($R*I$±10%) and maximum temperature of the EE resistance (±10% from theoretical value)|
|EE|Energy discharge (if the discharge was provoked by the operator)|Time delay on switch opening (300±50ms at odd point and 600±50ms at even point)|
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> (Please follow this link for the latest version)
%% 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 time
import pandas as pd
from IPython.display import display, Javascript
# lhc-sm-api
from lhcsmapi.Time import Time
from lhcsmapi.Timer import Timer
# GUI
from lhcsmapi.gui.hwc.HwcSearchModuleMediator import HwcSearchModuleMediator
# Query
from lhcsmapi.pyedsl.QueryBuilder import QueryBuilder
from lhcsmapi.analysis.RbCircuitQuery import RbCircuitQuery
# Analysis
from lhcsmapi.analysis.report_template import apply_report_template
from lhcsmapi.analysis.RbCircuitAnalysis import RbCircuitAnalysis
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 PLI1.d2 HWC Test
- Choose a circuit name in order to display HWC test with, campaign name as well as start and end time
%% Cell type:code id: tags:
``` python
circuit_type = 'RB'
hwc_test = 'PLI1.d2'
hwcb = HwcSearchModuleMediator(circuit_type=circuit_type, hwc_test=hwc_test, hwc_summary_path='/eos/project/l/lhcsm/hwc/HWC_Summary.csv')
```
%% Cell type:markdown id: tags:
# 2. Query All Signals Prior to Analysis
%% Cell type:code id: tags:skip_output
``` python
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()
rb_query = RbCircuitQuery(circuit_type, circuit_name, max_executions=13)
with Timer():
# PC
source_timestamp_pc = rb_query.find_source_timestamp_pc(t_start, t_end)
timestamp_fgc = source_timestamp_pc.at[0, 'timestamp']
# EE Voltage
source_timestamp_ee_odd_df = rb_query.find_source_timestamp_ee(timestamp_fgc, system='EE_ODD')
timestamp_ee_odd = source_timestamp_ee_odd_df.loc[0, 'timestamp']
source_ee_odd = source_timestamp_ee_odd_df.loc[0, 'source']
u_dump_res_odd_df = rb_query.query_ee_u_dump_res_pm(timestamp_ee_odd, timestamp_fgc, system='EE_ODD', signal_names=['U_DUMP_RES'])[0]
source_timestamp_ee_even_df = rb_query.find_source_timestamp_ee(timestamp_fgc, system='EE_EVEN')
timestamp_ee_even = source_timestamp_ee_even_df.loc[0, 'timestamp']
source_ee_even = source_timestamp_ee_even_df.loc[0, 'source']
u_dump_res_even_df = rb_query.query_ee_u_dump_res_pm(timestamp_ee_even, timestamp_fgc, system='EE_EVEN', signal_names=['U_DUMP_RES'])[0]
# PC
i_meas_nxcals_df = rb_query.query_signal_nxcals(t_start, t_end, system='PC', signal_names='I_MEAS', spark=spark)[0]
i_meas_df, i_a_df, i_ref_df = rb_query.query_pc_pm(timestamp_fgc, timestamp_ee_odd, signal_names=['I_MEAS', 'I_A', 'I_REF'])
# DFB
source_timestamp_leads_odd_df = rb_query.find_timestamp_leads(timestamp_fgc, 'LEADS_ODD')
u_hts_odd_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_odd_df, system='LEADS_ODD', signal_names=['U_HTS'], spark=spark)
u_res_odd_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_odd_df, system='LEADS_ODD', signal_names=['U_RES'], spark=spark)
source_timestamp_leads_even_df = rb_query.find_timestamp_leads(timestamp_fgc, 'LEADS_EVEN')
u_hts_even_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_even_df, system='LEADS_EVEN', signal_names=['U_HTS'], spark=spark)
u_res_even_dfs = rb_query.query_leads(timestamp_fgc, source_timestamp_leads_even_df, system='LEADS_EVEN', signal_names=['U_RES'], spark=spark)
rb_analysis = RbCircuitAnalysis(circuit_type, pd.DataFrame(), is_automatic=is_automatic)
```
%% Cell type:markdown id: tags:
# 3. Timestamps
%% Cell type:code id: tags:
``` python
timestamp_dct = {'FGC': timestamp_fgc, 'EE_EVEN': timestamp_ee_even, 'EE_ODD': timestamp_ee_odd,
'LEADS_ODD': source_timestamp_leads_odd_df, 'LEADS_EVEN': source_timestamp_leads_even_df}
rb_analysis.create_timestamp_table(timestamp_dct)
```
%% Cell type:markdown id: tags:
# 4. Power Converter
## 4.1. Plot of the Power Converter Main Current
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_meas_nxcals_df | DataFrame | A |NXCALS| Main power converter current, I_MEAS|
*GRAPHS*:
- t = 0 s corresponds to the start of the test
%% Cell type:code id: tags:
``` python
ax = i_meas_nxcals_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. Energy Extraction System
## 5.1. Analysis of the Energy Extraction Voltage
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|i_a_df |DataFrame |A |PM|I_A is the raw power converter current logged around the FPA with high sampling frequench|
|i_meas_df |DataFrame |A|PM |I_MEAS is filtered I_A with lower sampling frequency and longer duration|
|i_ref_df | DataFrame | A |PM| Reference power converter current, STATUS.I_REF|
|u_dump_res_odd_df | DataFrame | V |PM| Energy extraction odd voltage U_DUMP_RES|
|u_dump_res_even_df | DataFrame | V |PM| Energy extraction even voltage U_DUMP_RES|
*ANALYSIS*:
- Calculate U_dump_res (t=0) as the maximum voltage divided by the corresponding current
- Calculate the characteristic time of pseudo-exponential current decay with the charge approach
*CRITERIA*:
- Check if U_dump_res (t=0) = 0.075*I V (±10%).
- Check if the characteristic time of pseudo-exponential decay of I_MEAS from t=1 to 120 s is 110 s<-Tau <130 s
- Check if the timestamp difference between FGC and EE an odd point is 300±50 ms
After YETS 2017/8 the EE timestamp odd(RR or UJ) has been reduced and should now be 100+-50 ms after the FGC time stamp
- Check if the time stamp difference between FGC and EE an even point: 600±50 ms
*GRAPHS*:
- t = 0 s corresponds to the PM timestamp of the FGC
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_char_time_u_dump_res_ee(circuit_name, timestamp_fgc, [u_dump_res_odd_df, u_dump_res_even_df], i_meas_df)
```
%% Cell type:markdown id: tags:
# 6. Current Leads
## 6.1. Plot of Current Leads
*QUERY*:
|Variable Name |Variable Type |Variable Unit |Database|Comment
|---------------|---------------|---------------|--------|------|
|u_hts_odd_dfs |DataFrame |V |PM|Voltage of odd leads, U_HTS|
|u_res_odd_dfs |DataFrame |V |PM|Voltage of odd leads, U_RES|
|u_hts_even_dfs |DataFrame |V |PM|Voltage of even leads, U_HTS|
|u_res_even_dfs |DataFrame |V |PM|Voltage of even leads, U_RES|
*CRITERIA*:
- Check if the quench detection signal for U_HTS is below the threshold (3 mV)
- Check if the quench detection signal for U_RES is below the threshold (100 mV)
*GRAPHS*:
- t = 0 s corresponds to the FGC timestamp
%% Cell type:code id: tags:
``` python
rb_analysis.analyze_leads_voltage(u_hts_odd_dfs+u_hts_even_dfs, circuit_name, timestamp_fgc, signal='U_HTS', value_min=-0.003, value_max=0.003)
rb_analysis.plot_leads_voltage_zoom(u_hts_odd_dfs+u_hts_even_dfs, circuit_name, timestamp_fgc, timestamp_ee_odd, timestamp_ee_even, signal='U_HTS')
rb_analysis.analyze_leads_voltage(u_res_odd_dfs+u_res_even_dfs, circuit_name, timestamp_fgc, signal='U_RES', value_min=-0.1, value_max=0.1)
```
%% Cell type:markdown id: tags:
# 7. Final Report
%% Cell type:code id: tags:
``` python
campaign = hwcb.get_campaign()
apply_report_template()
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/RB/{}/{}/{}/{}'.format(circuit_name, hwc_test, campaign, file_name_html)
!mkdir -p /eos/project/l/lhcsm/hwc/RB/$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_RB_PLI1.d2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$circuit_name/$hwc_test/$campaign/$file_name_html
!{sys.executable} -m jupyter nbconvert --to html $'AN_RB_PLI1.d2.ipynb' --output /eos/project/l/lhcsm/hwc/RB/$circuit_name/$hwc_test/$campaign/$file_name_html --TemplateExporter.exclude_input=True --TagRemovePreprocessor.remove_all_outputs_tags='["skip_output"]'
```
%% Cell type:code id: tags:
``` python
```
......
......@@ -426,4 +426,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
\ No newline at end of file
}
......@@ -580,4 +580,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
\ No newline at end of file
}
......@@ -425,4 +425,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
\ No newline at end of file
}
......@@ -610,4 +610,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
\ No newline at end of file
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment